原创文章,转载请注明出处:http://blog.csdn.net/t5721654/article/details/7480696
Android系统本身提供了很多系统服务,如WindowManagerService,PowerManagerService等。下面描述一下添加一个系统服务的具体步骤。
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类中定义的常量,也就是给服务定义的名字,使用常量方便获取服务,而不需要记住注册服务时用的名字,且想换名字时只需改一个常量的值。
5、 由于在工程中添加了自己定义的类及常量,系统的api没有更新,因此需要先在工程中make clean然后make update-api,执行完后会发现frameworks\base\api\current.xml文件中多出自己定义的一些东西。current.xml这个文件包含了所有系统所有能被应用层使用的类及其方法等。
之后再使用make编出来的固件及jar包就能包含自定义的接口。
编译后如何使用:
将编出来的jar包通过lib方式导入工程。jar包位置:out\target\common\obj\JAVA_LIBRARIES\framework_intermediates\classes.jar
调用以下代码获取自定义服务:
IMyTool myTool = IMyTool.Stub.asInterface(ServiceManager.getService(MY_TOOL_SERVICE));
MY_TOOL_SERVICE即在Context中定义的常量。获取到myTool后就可以调用在aidl文件中定义的接口了。
分享到:
相关推荐
android系统添加系统服务
主要介绍了Android 添加系统服务的方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
http://blog.csdn.net/xiayu98020214/article/details/8850430,是配合博客的android4.04patch ,还有添加的文件,还有测试apk
android如何从驱动到app添加一个系统服务
1.Android系统源码定制和编译方法(Android7.0至Android12) 2.Android.mk和Android.bp语法大全及使用方法详解 3.Android.mk或Android.bp中引用Android的第三方(jar、aar、so)、Androidx的类库等的使用方法 4.Android....
此patch为系统添加水印,类似于安全模式的显示在系统上层,ActivityManagerService实现。
碰巧在Gerrit上看到了添加系统服务这一块的patch.正好做个总结.虽然我不是Framework工程师, 但是了解Android系统还是很有好处的. 如何获取系统服务 我们获取系统服务都是在context中,getSystemService获取到的. ...
http://blog.csdn.net/xiayu98020214/article/details/8850430,我的博客的patch,不包括添加的文件,只是修改的patch
Android如何从驱动到app添加一个系统服务
Android 的安全性问题一直备受关注,Google 在 Android 系统的安全方面也是一直没有停止过更新,努力做到更加安全的手机移动操作系统。 在 Android 的安全性方面,有很多模块: 1 内核安全性 2 应用安全性 3 应用...
Android编译系统分析,odt格式的,用openoffice打开,介绍分析了Android的编译系统:原理和如何添加本地模块编译,怎样编译成动态库,静态库,可执行程序。
第一个较大的Android项目,基于Android平台的图书管理系统 涉及到的功能有学生注册、工作人员注册、图书馆介绍、图书馆新闻、学生、工作人员登录、 书籍搜索、学生借还书、工作人员添加书籍、新书榜单、借书排行榜、...
Android 调用系统相机/相册 获取照片 在照片上添加文字水印
在此背景下,订餐系统应运而生,即方便了商家,也方便了用户。本项目应用Google界面设计语言Material Design来设计UI,也就是按照Android5.0之后所有内置应用的界面风格来进行设计。 用户打开应用后会进入欢迎界面...
创建android文件系统 详细步骤 大家可以参考
从底层到应用层详细讲解了android中如何实现全局快捷键的
freg相关代码
Android 仓库管理系统源码加报告
1. 找到编译目标系统时的签名证书platform.pk8和platform.x509.pem,在android源码目录build\target\product\security下。 没有那两个证书的话,可以直接从本链接下载相关资料. 2. 将签名工具(signapk.jar)、...