Android 添加系统服务
添加系统服务一般分为两种方式,一种是只注册,但不启动,被调用后再启动;一种是开机后由SysteServer启动并注册为系统服务,在后台保持运行,下面介绍两种方式的添加方式
1.添加不自启动的系统服务
我理解这种方式创建不属于服务,当我们需要系统进程做某些操作时可以使用这种方式
第一步:在frameworks/base/core/java/android/os/下新建ITest.aidl文件
第二步:在frameworks/base/services/core/java/com/android/server/下新建一类Test.java继承自ITest.Stub
第三步:找到frameworks/base/services/java/com/android/server/SystemServer.java,在startOtherServices()方法中合适位置添加:
ServiceManager.addService(“test_service”, new Test(context));
第四步:在frameworks/base/Android.bp的srcs:[]中添加:
“core/java/android/os/ITest.aidl”
一个系统服务就添加完了
2.添加自启动的系统服务
第一步:frameworks/base/core/java/android/app/下新建ISelfStart.aidl文件
package android.app;
interface ISelfStart {
void hello(String data);
}
第二步:在frameworks/base/services/core/java/com/android/server/下新建一类SelfStartService.java继承自SystemService
第三步:在SelfStartService.java中新建内部类SelfStartServiceBinder继承自ISelfStart.Stub
LocalService可以不写
package com.android.server;
import android.content.Context;
import android.os.IBinder;
import android.os.RemoteException;
import android.app.ISelfStart;
public class SelfStartService extends SystemService {
private final String TAG = SelfStartService.class.getSimpleName();
private IBinder mBinder = null;
public SelfStartService(Context systemContext) {
super(systemContext);
}
@Override
public void onStart() {
try {
mBinder = new SelfStartService.SelfStartServiceBinder();
publishBinderService("self_service", mBinder);
publishLocalService(LocalService.class, new LocalService());
} catch (RuntimeException e) {
e.printStackTrace();
}
}
class SelfStartServiceBinder extends ISelfStart.Stub {
@Override
public void hello(String data) throws RemoteException {
}
}
public class LocalService {
public void hello(String data) {
}
}
}
第四步:找到frameworks/base/services/java/com/android/server/SystemServer.java,在startOtherServices()方法中合适位置添加:
mSystemServiceManager.startService(com.android.server.SelfStartService.class);
第五步:在frameworks/base/core/java/android/app/下新建SelfStartServiceManager.java
package android.app;
import android.annotation.SystemService;
import android.app.ISelfStart;
import android.content.Context;
import android.os.RemoteException;
@SystemService("self_service")
public class SelfStartServiceManager {
private static final String TAG = SelfStartServiceManager.class.getSimpleName();
private ISelfStart mSelfStart = null;
public SelfStartServiceManager(Context ctx, ISelfStart selfStart) {
mSelfStart = selfStart;
}
public void hello(String data){
if (null == mSelfStart) {
throw new NullPointerException("SelfStartService is null");
}
try {
mSelfStart.hello(data);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
}
第六步:找到frameworks/base/core/java/android/app/SystemServiceRegistry.java,在它的static代码段中添加:
registerService("self_service", SelfStartServiceManager.class,
new CachedServiceFetcher<SelfStartServiceManager>() {
@Override
public SelfStartServiceManager createService(ContextImpl ctx)
throws ServiceNotFoundException {
ISelfStart service = ISelfStart.Stub.asInterface(
ServiceManager.getServiceOrThrow("self_service"));
return new SelfStartServiceManager(ctx,service);
}});
第七步:在frameworks/base/Android.bp的srcs:[]中添加:
"core/java/android/app/ISelfStart.aidl"