前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android源码折腾(二)新增服务Bird

Android源码折腾(二)新增服务Bird

原创
作者头像
笔头
修改2022-07-28 17:14:27
6343
修改2022-07-28 17:14:27
举报
文章被收录于专栏:Android记忆Android记忆

上篇文章,我们已经知道源码如何下载以及整编,现在我们试着新增、修改源码然后编译。

一、新增服务源码

我们这新增了一个小鸟服务,提供了吃和飞接口,还有相应的回调。总共有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;

三、配置SEPolicy

如果不配置的话,系统启动不了。

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截图

哈哈,有回调拉。。。。。。。。。。。。。。。。成功。

后面会对新增服务编译过程中遇到的问题进行记录。

三、问题

问题1:

这个问题是因为 Android 11 开启了lint代码检查,所以我们需要在framework/base 下的Android.bp忽略掉代码检查

代码语言:javascript
复制
metalava_framework_docs_args = "
"--api-lint-ignore-prefix android.mymodule. "

其中 android.mymodule是包名的前缀。

源码:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、新增服务源码
    • 一、拷贝文件到对应目录
      • 二、配置服务
        • 三、配置SEPolicy
          • 四、执行命令
          • 二、体验成果
          • 三、问题
            • 问题1:
            相关产品与服务
            腾讯云代码分析
            腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档