上篇文章,我们已经知道源码如何下载以及整编,现在我们试着新增、修改源码然后编译。
我们这新增了一个小鸟服务,提供了吃和飞接口,还有相应的回调。总共有4个文件:
BirdManager 对外暴露接口
BirdService 真正接口实现
IBird 接口定义
IBirdListener 接口回调
这四个文件在文章最后会提供
新增服务有几个步骤
BirdManager、IBird、IBirdListener 放在frameworks/base/core/java/android/app/目录下
BirdService放在frameworks/base/services/core/java/com/android/server/目录下
这个为啥放在这里,大家可以自行百度。我承认,我也要百度,嘿嘿。
完事之后,需要对这四个文件小小的改动
BirdManager、IBird、IBirdListener包名全部换成 package android.app;
BirdService包名换成 package com.android.server;同时还要添加import android.app.IBird;import android.app.IBirdListener;这是个细活,一定要仔细,不然会报 【找不到符号】这个问题
上面搞完之后,接下来就是配置服务了。
1.我们知道,一切服务都是在SystemServer生成的,SystemServer启动3种服务,一般服务放在startOtherServices启动,
这个里面添加了StartBirdService,同时记住,要import BirdService,不然会报错:【找不到符号】。
接下来配置SystemServiceRegistry
这里registerService了BirdManager.写法参考其他服务即可。记住,这里要 import android.app.BirdManager;和
import android.app.IBird;
如果不配置的话,系统启动不了。
system/sepolicy
./prebuilts/api/26.0/public/service.te
./prebuilts/api/27.0/public/service.te
./prebuilts/api/28.0/public/service.te
./prebuilts/api/29.0/public/service.te
./prebuilts/api/30.0/public/service.te
./public/service.te
------------------------------------------------------------------
./prebuilts/api/26.0/private/service_contexts
./prebuilts/api/27.0/private/service_contexts
./prebuilts/api/28.0/private/service_contexts
./prebuilts/api/29.0/private/service_contexts
./prebuilts/api/30.0/private/service_contexts
./private/service_contexts
以上文件都需要修改
service.te 最后一行上添加type bird_service, system_api_service, system_server_service, service_manager_type;
这里定义服务类型, 服务名最好对应 新增服务 的标识(Context.java ---> BIRD_SERVICE = "bird"),方便理解,因此这里我们定义了: 服务名:bird_service。
service_contexts 最后一行上添加bird u:object_r:bird_service:s0
这里为 新增的服务bird 设置类型为: u:object_r:bird_service:s0,
需要特别注意的是, bird 是对应Context.java 新增的:(Context.java ---> BIRD_SERVICE = "bird"),bird_service 为在 service.te 定义的类型, 必须一一对应,否则无效!!!!
1.以上配置完成后 根目录执行 【make update-api 】
2.成功之后整编一次,【make -j18】
3.执行【emulator 】启动模拟器
4.另起窗口 执行 【adb shell 】,接着执行【service list】查看启动的服务有没有bird 服务
第29个就是我们的服务,看来成功了。
下面我们来测试下,如何测试呢,我们来对已有app进行修改吧,我们选择Settings 应用
我们在SettingsActivity onResume 中添加调用服务代码
Settingsy应用里面没有android.mk文件,是android.mp文件,我们就用make Settings 编译这个app【这个app编译成功后存放在/Android11/out/target/product/generic_x86_64/system/system_ext/priv-app/Settings 这个目录下】。编译成功之后按照网上方式,打开应用都没效果,需要再次整编才行,但是耗时,我就用adb install **/**/Settings.apk 覆盖安装了Settings app。
打开Settings应用调用了服务,有如下log截图
哈哈,有回调拉。。。。。。。。。。。。。。。。成功。
后面会对新增服务编译过程中遇到的问题进行记录。
这个问题是因为 Android 11 开启了lint代码检查,所以我们需要在framework/base 下的Android.bp忽略掉代码检查
metalava_framework_docs_args = "
"--api-lint-ignore-prefix android.mymodule. "
其中 android.mymodule是包名的前缀。
源码:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。