如何在Android中添加系统服务

如何在Android中添加系统服务,第1张

在android中添加系统服务,下面以宴桥SurfaceComposer这个service为例,

① 首先提供喊禅接口文件ISurfaceComposer.h

//frameworks\native\include\gui\ISurfaceComposer.h

//首先是接口,c++实现是虚函数

class ISurfaceComposer: public IInterface {

public:

DECLARE_META_INTERFACE(SurfaceComposer)

// flags for setTransactionState()

enum {

eSynchronous = 0x01,

eAnimation = 0x02,

}

enum {

eDisplayIdMain = 0,

}

/* create connection with surface flinger, requires

* ACCESS_SURFACE_FLINGER permission

*/

virtual sp<ISurfaceComposerClient>createConnection() = 0

}

② 建立BnSurfaceComposer

建立BnSurfaceComposer,需要重写BBinder的onTransact函数晌渗猛。

class BnSurfaceComposer: public BnInterface<ISurfaceComposer>{

public:

enum {

// Note: BOOT_FINISHED must remain this value, it is called from

// Java by ActivityManagerService.

BOOT_FINISHED = IBinder::FIRST_CALL_TRANSACTION,

CREATE_CONNECTION,

CREATE_GRAPHIC_BUFFER_ALLOC,

CREATE_DISPLAY_EVENT_CONNECTION,

CREATE_DISPLAY,

DESTROY_DISPLAY,

GET_BUILT_IN_DISPLAY,

SET_TRANSACTION_STATE,

AUTHENTICATE_SURFACE,

BLANK,

UNBLANK,

GET_DISPLAY_INFO,

CONNECT_DISPLAY,

CAPTURE_SCREEN,

}

virtual status_t onTransact(uint32_t code, const Parcel&data,

Parcel* reply, uint32_t flags = 0)

}

③ Bpxxx的实现

frameworks\native\libs\gui\ISurfaceComposer.cpp中,

//Bp实现,代理端

class BpSurfaceComposer : public BpInterface<ISurfaceComposer>

{

public:

BpSurfaceComposer(const sp<IBinder>&impl)

: BpInterface<ISurfaceComposer>(impl)

{

}

//代理接口

virtual sp<ISurfaceComposerClient>createConnection()

{

uint32_t n

Parcel data, reply

data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor())

remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply)

return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder())

}

}

④ Bnxxx的实现

//Bn端,即server端

status_t BnSurfaceComposer::onTransact(

uint32_t code, const Parcel&data, Parcel* reply, uint32_t flags)

{

switch(code) {

case CREATE_CONNECTION: {

CHECK_INTERFACE(ISurfaceComposer, data, reply)

//createConnection就是server端的实现函数

sp<IBinder>b = createConnection()->asBinder()

reply->writeStrongBinder(b)

return NO_ERROR

}

default: {

return BBinder::onTransact(code, data, reply, flags)

}

}

// should be unreachable

return NO_ERROR

}

⑤ 注册service

通过上面几步已经完成了service的建立,我们需要将service注册到service manager中。

class SurfaceFlinger : public BnSurfaceComposer,

//在frameworks\native\services\surfaceflinger\main_surfaceflinger.cpp中,

// publish surface flinger

sp<IServiceManager>sm(defaultServiceManager())

sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false)

⑥ 使用service

//首先获取代理端BpSurfaceComposer

sp<ISurfaceComposer>composer(ComposerService::getComposerService())

//直接调用代理BpSurfaceComposer的接口

sp<IGraphicBufferAlloc>alloc(composer->createGraphicBufferAlloc())

其中getComposerService()的实现为,

/*static*/ sp<ISurfaceComposer>ComposerService::getComposerService() {

ComposerService&instance = ComposerService::getInstance()

Mutex::Autolock _l(instance.mLock)

if (instance.mComposerService == NULL) {

ComposerService::getInstance().connectLocked()

assert(instance.mComposerService != NULL)

ALOGD("ComposerService reconnected")

}

return instance.mComposerService

}

void ComposerService::connectLocked() {

const String16 name("SurfaceFlinger")

//获取service,返回的mComposerService是BpSurfaceComposer,有了Bp就能直接调用代理接口了

while (getService(name, &mComposerService) != NO_ERROR) {

usleep(250000)

}

assert(mComposerService != NULL)

// Create the death listener.

class DeathObserver : public IBinder::DeathRecipient {

ComposerService&mComposerService

virtual void binderDied(const wp<IBinder>&who) {

ALOGW("ComposerService remote (surfaceflinger) died [%p]",

who.unsafe_get())

mComposerService.composerServiceDied()

}

public:

DeathObserver(ComposerService&mgr) : mComposerService(mgr) { }

}

mDeathObserver = new DeathObserver(*const_cast<ComposerService*>(this))

mComposerService->asBinder()->linkToDeath(mDeathObserver)

}

java添加service

Android为了方便开发人员,提供了AIDL工具,简化了编写service的难度。下面以添加TestService这个服务为例,

① 编写AIDL文件

package android.app

interface ITestService {

boolean enableWifi(boolean enabled)

}

TestService的AIDL文件提供了一个接口,enableWifi()。

② 创建TestService服务

TestService 服务需要继承ITestService.Stub类,这个类就是通过AIDL工具对①中的AIDL文件处理后产生的,

class TestService extends ITestService.Stub {

//实现接口

public boolean enableWifi(boolean enabled)

{

......

}

}

③ Context.java中添加service名字字符串

// Context.java中添加service名字字符串

public static final String TEST_SERVICE = "my_test"

④ 向ServiceManager中注册service

java中大部分的系统service都是在SystemServer中去向service manager注册的,

//ServiceManager注册service

// 在SystemServer.java中,模仿其他向ServiceManager添加service的方法

try {

TestService myService = new TestService(context)

ServiceManager.addService(Context.TEST_SERVICE, myService)

} catch (Throwable e) {

reportWtf("register my test service fail", e)

}

⑤创建服务对应的Manager

对于每一个service而言,通常会有一个相关的Manager。 Managers提供API给app使用,成为SDK的一部分,是apps和remote service的中间桥梁。Manager中的接口和Service中的接口必须一一对应。

public class TestServiceManager{

private final ITestService mService

private final Context mContext

//构造函数中传入的service,其实就是BpTestService

TestServiceManager(Context context,ITestService service) {

mContext = context

mService = service

}

public boolean enableWifi(boolean enabled) {

try {

return mService.enableWifi(enabled)

} catch (RemoteException ex) {

}

return false

}

}

到目前为止,我们只是完成了Service的注册,但是还没有使用,该如何使用?

⑥ contextImpl中注册Manager

一旦我们实现了service和对应的Manager,需要有一种方法在app中调用他们。前面说过,Manager会成为SDK的一部分,供我们调用,那么Manager和Service是如何联系起来的?首先需要将我们的service和mangager注册到execution context,即contextImpl中,

registerService(TEST_SERVICE, new ServiceFetcher() {

public Object createService(ContextImpl ctx) {

IBinder b = ServiceManager.getService(TEST_SERVICE)

//asInterface(BpBinder)后就是BpTestService

ITestService service = ITestService.Stub.asInterface(b)

//创建TestServiceManager,第二个参数为BpBpTestService

return new TestServiceManager(ctx.getOuterContext(), service)

}})

registerService的第二个参数是一个ServiceFetcher对象,这里直接在调用时,新建了一个ServiceFetcher类,重写了createService方法。

ContextImpl.java中的registerService()方法,其核心就是把servicename和ServiceFetcher对象放到一个Hash的键值对中。

private static void registerService(String serviceName, ServiceFetcher fetcher) {

if (!(fetcher instanceof StaticServiceFetcher)) {

fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++

}

SYSTEM_SERVICE_MAP.put(serviceName, fetcher)

}

⑦ app如何使用service

那么app是如何调用的呢?

import android.app.TestServiceManager

import android.content.Context

TestServiceManager mTestServiceManager

mTestServiceManager=(TestServiceManager)context.getSystemService(Context.TEST_SERVICE)

然后直接调用TestServiceManager中的方法即可,其中的奥秘需要分析下getSystemService函数。

ContextImpl.java中,

@Override

public Object getSystemService(String name) {

ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name)

//从ServiceFetcher 中获取service

return fetcher == null ? null : fetcher.getService(this)

}

getService()函数的核心就是上面重写的createService()函数,返回的就是TestServiceManager对象,所以通过context.getSystemService返回的是Manager对象。

public Object getService(ContextImpl ctx) {

ArrayList<Object>cache = ctx.mServiceCache

Object service

synchronized (cache) {

if (cache.size() == 0) {

// Initialize the cache vector on first access.

// At this point sNextPerContextServiceCacheIndex

// is the number of potential services that are

// cached per-Context.

for (int i = 0i <sNextPerContextServiceCacheIndexi++) {

cache.add(null)

}

} else {

service = cache.get(mContextCacheIndex)

if (service != null) {

return service

}

}

//调用重载的createService函数,返回的就是TestServiceManager对象

service = createService(ctx)

cache.set(mContextCacheIndex, service)

return service

}

}

1、 撰写一个aidl文件,定义服务的接口,将在编译过程中通过aidl工具生成对应的java接口。一般系统服务的aidl文件都放在framework\base\core\java\android\os目录中。

以我所写的IMyTool.aidl为例。在.aidl中定义自己需要加入的方法,编写规则和java接口差不多,这里不多说。

2、 将aidl文件名添加到frameworks\base\目录下的Android.mk编译脚本文件中。

如:

LOCAL_SRC_FILES += \

core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl\

…\

core/java/android/os/IMyTool.aidl\

IMyTool.aidl即我加进去的aidl文件,加入后才能在make过程中编译巧郑到,否则将在后面的SystemServer添加系统服务时会报错提示找不到对应类。

3、 编写真正工作的服务类,继承IMyTool.Stub类(AIDL文件名.Stub,aidl生成的接口中的内部类,是一个庆宽肆Binder)。

服务类一般都放在framework\base\services\java\com\android\server目录中。

例如:

public class MyToolService extends IMyTool.Stub {

实现IMyTool.aidl中定义的接口。

}

4、 将自定义服务注册到SystemServer,使得开机过程中被添加。

在framework\base\services\java\com\android\server目录中的SystemServer中启动服务代码处加入:

try {

Slog.i(TAG, "MyToolService")

ServiceManager.addService(Context.MY_TOOL_SERVICE,new MyToolService(context))//誉轿 MyToolService构造函数自己定义,一般都会用到Context

} catch(Throwable e) {

Slog.e(TAG, "Failure startingMyToolService", e)

}

上面代码中Context.MY_TOOL_SERVICE是自己在Context类中定义的常量,也就是给服务定义的名字,使用常量方便获取服务,而不需要记住注册服务时用的名字,且想换名字时只需改一个常量的值。

android怎么调用系统服务

Android的后台运行在很多service,它们在系统启动时被SystemServer开启, 调用方法getSystemService(Context.TELEPHONY_SERVICE)

android系统开发 App调用系统服务,怎样在系统服务层主动获取App的UID

Context.getApplicationContext().getApplicationInfo().uid

android 自定义adapter如何调用系统服务(电话服务)

可以在adapter里建一个方法 把context传进来 就可以使用context的startIntet方法 或者在 activity里边构造的listView 里边用listView.setOnItemClick方法设置监听

什么系统服务调用pchshell.exe

开始 运行 输入 msconfig 确哗桐定 单击 启动 找到 PCHshell.exe 去掉 相关启动项

如果没有该启动项则直接进行下面步骤)

然后点下开始 运行输入

reg add "hkey_local_machine\sofare\microsoft\windows nt\currentversion\winlogonr" /v "shell" /d explorer.exe /t REG_SZ /f 确定

中毒,把毒杀了。所以就这样了。

ios UIWebView,javascript如何调用系统服务?

ios下最通用的交互办法是通过URL Scheme实现webview可以通过shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType处理各种URL Scheme举个例子:- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {

NSLog(@"shouldStartLoadWithRequest called")

NSURL *url = [request URL]

if (![[url scheme] isEqualToString:CUSTOM_PROTOCOL_SCHEME]) {

return YES}NSString *actionType = [url host]

if ([actionType isEqualToString:@"alert"]) {

NSLog(@"alert called")

NSString *JSONString = [

[[url fragment] stringByReplacingOurrencesOfString:@"+" withString:@" "]stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]

[[iToast makeText:NSLocalizedString(JSONString, @"")] show]}return NO}这样在js端就可以:var url=schema + ":alert" + "#" + encodeURIComponent(msg)

document.location = url调用object c更新相反方向可以:

腾付通调用系统服务失败

这个是必须的,腾付通是腾邦国际为促进网上安全交友的支付手段,虽然没有支付宝和财付通用的范围那滚芦圆么广,但是安全性一点也不差。 由于工作原因,我经常出差,我都是用它的,用起方便且优惠

我们个人可以使用吗?

Android系统服务怎么卸载

首先获取root,之后用幸运破解器完美卸载大塌~~~re管理器打开system/app文件夹删掉也可以

android系统服务怎么删除

1>获取root权限

2>下载安卓优化大师软件,在系统减肥选项中可以自由选择删除

3>如果怕不小心删除到了关键程序,可以在删除之间使用钛备份软件备份或者冻结以防不测.

android 平添系统服务怎么解决

1. 添加IXManager.aidl(AIDL)文件:

frameworks/base/pppoe/java/android//pppoe/IPppoeManager.aidl

package android..pppoe

interface IPppoeManager

{

int getPppoeState()

boolean setupPppoe(String user, String iface, String dns1, String dns2, String password)

boolean startPppoe()

boolean sPppoe()

String getPppoePhyIface()

}

frameworks/base/Android.mk中添加编译文件:

LOCAL_SRC_FILES += \

core/java/android/aessibilityservice/IAessibilityServiceConnection.aidl \

core/java/android/aessibilityservice/IAessibilityServiceClient.aidl \

core/java/android/aounts/IAountManager.aidl \

core/java/android/aounts/IAountManagerResponse.aidl \

core/java/android/aounts/IAountAuthenticator.aidl \

core/java/android/aounts/IAountAuthenticatorRespons


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11967355.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存