添加自定义的systemservice,到时候就可以直接getSystemService这样使用了。
1.添加AIDL
在frameworks/base/core/java/android/os 下新建一个aidl文件
package android.os;
/**
* @hide
*/
interface IMyTestService {
void startTest( String text);
void stopTest();
}
2.新建service
路径:frameworks/base/services/core/java/com/android/server
package com.android.server;
import android.util.Log;
import android.os.IMyTestService;
public class MyTestService extends IMyTestService.Stub {
public MyTestService() {}
@Override
public void startTest(String text){
Log.i("Test","MyTestService startTest: "+text);
}
@Override
public void stopTest(){
Log.i("Test","MyTestService stopTest");
}
}
3.添加service到系统
路径: frameworks/base/services/java/com/android/server/SystemServer.java
private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
t.traceBegin("startOtherServices");
//省略代码...
try {
final String SECONDARY_ZYGOTE_PRELOAD = "SecondaryZygotePreload";
// We start the preload ~1s before the webview factory preparation, to
// ensure that it completes before the 32 bit relro process is forked
// from the zygote. In the event that it takes too long, the webview
// RELRO process will block, but it will do so without holding any locks.
mZygotePreload = SystemServerInitThreadPool.submit(() -> {
try {
Slog.i(TAG, SECONDARY_ZYGOTE_PRELOAD);
TimingsTraceAndSlog traceLog = TimingsTraceAndSlog.newAsyncLog();
traceLog.traceBegin(SECONDARY_ZYGOTE_PRELOAD);
if (!Process.ZYGOTE_PROCESS.preloadDefault(Build.SUPPORTED_32_BIT_ABIS[0])) {
Slog.e(TAG, "Unable to preload default resources");
}
traceLog.traceEnd();
} catch (Exception ex) {
Slog.e(TAG, "Exception preloading default resources", ex);
}
}, SECONDARY_ZYGOTE_PRELOAD);
//添加
ServiceManager.addService(Context.MY_TEST_SERVICE, new MyTestService());
4.新建manager
路径:frameworks/base/core/java/android/app 新建一个MyTestServiceManager
这边提供一些方法给别人用,当有地方调用了,它再去调用service中的方法。
package android.app;
import android.annotation.NonNull;
import android.content.Context;
import android.os.IMyTestService;
import android.os.RemoteException;
public class MyTestServiceManager {
private IMyTestService mService;
/**
* @hide
*/
public MyTestServiceManager(@NonNull Context mContext, @NonNull IMyTestService service) {
mService = service;
}
/**
* @hide
*/
public void startTest(String text) {
try {
mService.startTest(text);
} catch (RemoteException e) {
e.printStackTrace();
}
}
/**
* @hide
*/
public void stopTest() {
try {
mService.stopTest();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
5.注册这个manager
static {
//CHECKSTYLE:OFF IndentationCheck
registerService(Context.ACCESSIBILITY_SERVICE, AccessibilityManager.class,
new CachedServiceFetcher<AccessibilityManager>() {
@Override
public AccessibilityManager createService(ContextImpl ctx) {
return AccessibilityManager.getInstance(ctx);
}});
//省略代码......
registerService(Context.MY_TEST_SERVICE, MyTestServiceManager.class,
new CachedServiceFetcher<MyTestServiceManager>() {
@Override
public MyTestServiceManager createService(ContextImpl ctx) {
IBinder b = ServiceManager.getService(Context.MY_TEST_SERVICE);
IMyTestService service = IMyTestService.Stub.asInterface(b);
return new MyTestServiceManager(ctx, service);
}
});
到这里systemservice就添加好了,下面直接build。如果出现
就按照2来做。
注意所有函数都有加@hide
最后编译完,刷完image就可以直接使用我们自己添加的SystemService了。