闲来无事,试了一下在android 5.1.1 源码中添加自己的服务,以下是增加过程:
1、定义接口
源码 frameworks/base/core/java/android/os/下面新增 一个 IMyCountTest.aidl
package android.os;
interface IMyCountTest{
int add(int a,int b);
}
2、注册aidl到编译脚本Android.mk文件中
在目录路径为 frameworks\base\Android.mk 添加如下代码:
在Android.mk如下LOCAL_SRC_FILES += \下添加:
core/java/android/os/IMyCountTest.aidl \
3、创建Service文件实现接口
在 frameworks/base/services/core/java/com/android/server/ 下面新增一个 MyCountTestService.java 用来实现aidl文件定义的接口。
package com.android.server;
import android.os.IMyCountTest;
import android.os.RemoteException;
import android.util.Log;
public class MyCountTestService extends IMyCountTest.Stub{
public MyCountTestService(){
}
public int add(int a,int b){
try{
Log.e("MyCountTestService","add fun");
return a+b;
}catch(Exception e){ //异常处理 这里没有完全搞明白,但可以正常跑起来
e.printStackTrace();
}
return -1;
}
}
4、将service添加到SystemServer,使开机时候被加载
先在 frameworks/base/core/java/android/content/Context.java 中添加一行
public static final String MYCOUNT_SERVICE="myCountTest_service";
在目录路径为 android\frameworks\base\service\java\com\android\server\SystemServer.java 中的 startOtherServices()函数下增加
private void startOtherServices() {
try{
Slog.i(TAG, "MyCountTestService Service");
ServiceManager.addService(Context.MyCountTest_Service, new MyCountTestService());
}catch(Throwable e){
Slog.e(TAG, "Failure string MyCountTestService:"+e);
}
}
5、定义Manager
在frameworks/base/core/java/android/app/ MyCountTestManager.java 文件 内容如下
package android.app;
import android.content.Context;
import android.os.IMyCountTest;
import android.os.RemoteException;
import android.util.Log;
public class MyCountTestManeger{
IMyCountTest myService;
public MyCountTestManeger(Context ctx,IMyCountTest service){
myService=service;
}
public int add(int a,int b){
try{
Log.e("MyCountTestManeger","add");
return myService.add(a,b);
} catch(Exception e){
Log.e("MyCountTestManeger",e.toString);
e.printStackTrace();
}
return -1;
}
}
6、注册
(不同版本的注册目录可能不太一样)
在目录路径为 android\frameworks\base\core\java\android\app\SystemServiceRegistry.java添加代码如下:
在 static 模块中增加以下代码
import android.os.IMyCountTest;
registerService(MYCOUNT_SERVICE, new ServiceFetcher() {
public Object createService(ContextImpl ctx) {
IBinder b = ServiceManager.getService(MYCOUNT_SERVICE);
IMyCountTest service=IMyCountTest.Stub.asInterface(b);
return new MyCountTestManeger(ctx, service);
}});
7、编译检查,在/framewokks/base下执行mm指令,检查是否有报错,自行排除一下笔误
/framewokks/base# mm
8、更新Api
由于在工程中添加了自己定义的类及常量,系统的api没有更新,因此需要
root# make update-api
9、制作sdk 这里需要等待一段时间
(由于个人原因,我先执行了 make clean 又执行了 make -j8,最后执行了make sdk,
如果直接执行 make sdk 或者 先 make -j8 再执行 make sdk,没有尝试,不知道结果怎么样)
root# make sdk
9、生成目标
1、系统文件
out\target\product\t200\system\framework中
framework.jar
services.jar
该修改的内容会保存在这两个包中,
将这两个文件直接刷入设备/system/framework/ 目录下就可直接使用 或者重新 更新系统也行
2、SDK文件
out\host\linux-x86\sdk目录下生成sdk
android-sdk_eng.root_linux-x86.zip
解压后复制 \platforms\android-5.1.1中的android.jar 到windows下相同版本目录下,记得备份原有的android.jar
D:\androidsdk\platforms\android-22
10、在androidstudio中配置使用该版本的sdk即可
工程目录下 External Libraries——>Android API 22 Platform ——>android.jar——>android
——>os下存在 IMyCountTest.
——>app下存在 MyCountTestManager
11、使用:跟使用其他系统服务一样
MyCountTestManager myCountTestManager=(MyCountTestManager)getSystemService(Context.MYCOUNT_SERVICE);
int count= myCountTestManager.add(4,6);