Android Framework 添加新的系统服务_android framework 新建一个系统服务

        Log.d(TAG, "Lifecycle onStart start");
        publishBinderService(Context.DEMO\_SERVICE, mService);
        Log.d(TAG, "Lifecycle onStart continue");
        mService.start();
        Log.d(TAG, "Lifecycle onStart end");
    }

    @Override
    public void onBootPhase(int phase) {

    }

// @Override
// public void onUserStopped(@NonNull TargetUser user) {
// }

    public DemoManagerService getService() {
        return mService;
    }
}

private void start() {
    //todo
}

}


### 2. 创建 及 启动 服务


**2.1 Context.java**  
 定义 服务的 唯一标识



public static final String DEMO_SERVICE = “demo”;


**2.2 SystemServer.java**  
 在startOtherServices() 方法中, 启动服务  
 *务必加上 try-catch*, 否则,一旦发生异常, 例如SEPolicy限制添加 该 service而抛出 SecurityException, 则会导致 system\_server进程挂掉,设备无法开机!!!



private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
// 省略一万行
t.traceBegin(“StartDemoManagerService”);
try {
mSystemServiceManager.startService(DemoManagerService.Lifecycle.class);
} catch (Throwable e) {
reportWtf(“starting DemoManagerService”, e);
}
t.traceEnd();


**2.3 SystemServiceRegistry.java**  
 在静态代码块中,新增代码 注册 服务管理 类 对象



@SystemApi
public final class SystemServiceRegistry {
// 省略一万行
static {
// 省略一万行
registerService(Context.DEMO_SERVICE, DemoManager.class,
new CachedServiceFetcher() {
@Override
public DemoManager createService(ContextImpl ctx) {
return new DemoManager();
}});


### 3.SEPolicy 权限修改


SEPolicy 简单可以理解为 Linux 为了 控制 系统服务 的访问权限,  
 ServiceManager 仅能访问特定类型的服务, 因此 新增的 服务必须声明为 对应的类型!!!  
 例如在上面修改的基础上,运行不起效,日志提示以下错误信息:



audit: avc: denied { add } for pid=1222 uid=1000 name=demo scontext=u:r:system_server:s0 tcontext=u:object_r:default_android_service:s0 tclass=service_manager permissive=0
即不允许 在 system_server 中, 通过 service_manager 获取到 服务demo(它的类型为: u:object_r:default_android_service:s0)


则,需要进行以下的修改  
 **3.1 service.te 新增服务 类型**  
 在该文件后面新增:



type demo_service, system_api_service, system_server_service, service_manager_type;


这里定义服务类型, 服务名最好对应 新增服务 的标识(Context.java —> DEMO\_SERVICE = “demo”),  
 因此这里我们定义了:  
 服务名:demo\_service  
 类型:system\_api\_service, system\_server\_service, service\_manager\_type  
 **3.2 service\_contexts 设置服务上下文 类型**  
 在该文件后面新增:



demo u:object_r:demo_service:s0


这里为 新增的服务demo 设置类型为: u:object\_r:demo\_service:s0,  
 需要特别注意的是, demo 是对应Context.java 新增的:



public static final String DEMO_SERVICE = “demo”;


demo\_service 为在 service.te 定义的类型, 必须一一对应,否则无效!!!  
 则可以得出结论: ServiceManager 访问的类型,必须是 在 service.te 里定义的 类型


### 4.其它修改


一般是与平台限制有关,  
 如ServiceManager addService 时提示 仅允许 白名单的service, 按提示 加入 白名单即可


又例如在 DemoManager 获取 service (即使用ServiceManager getService)时报错:



15:41:46.698 4689 4689 DemoManager: plusA
15:41:46.705 696 795 audit: avc: denied { find } for pid=4689 uid=10320 name=demo scontext=u:r:untrusted_app:s0:c64,c257,c512,c768 tcontext=u:object_r:demo_service:s0 tclass=service_manager permissive=0
15:41:46.705 696 795 servicemanager: demo : getService has failed, permission denied.


此时可尝试在 untrusted\_app.te 中添加:



allow untrusted_app demo_service:service_manager find;


大概意识是, 允许untrusted\_app 通过 service\_manager 获取到我们新增的服务 demo\_service  
 ( demo\_service是我们在service.te 新增的服务类型)


### 5. 客户端使用


只需根据 Context.getSystemService 获取到 DemoManager,然后调用对应plusA 方法即可



import android.app.DemoManager;


private DemoManager mDemoManager;

mDemoManager = (DemoManager) mContext.getSystemService(Context.DEMO\_SERVICE);
Log.d(TAG, " mDemoManager="+mDemoManager);
if (mDemoManager != null ) {
    try {
        int result = mDemoManager.plusA(2,3);
        Log.d(TAG, "result="+result);
    } catch(Exception e) {
        e.printStackTrace();
    }
}

服务创建、启动 即 使用 日志打印:



03-31 06:11:43.985 1243 1243 I SystemServerTiming: StartDemoManagerService
03-31 06:11:43.985 1243 1243 I SystemServiceManager: Starting com.android.server.DemoManagerService$Lifecycle
03-31 06:11:43.987 1243 1243 D DemoManagerService: Lifecycle create
03-31 06:11:43.987 1243 1243 D DemoManagerService: Lifecycle onStart start

03-31 06:11:43.988 696 795 I servicemanager: Adding ‘u:r:system_server:s0’ service (demo:1243)

03-31 06:11:43.988 1243 1243 D DemoManagerService: Lifecycle onStart continue
03-31 06:11:43.988 1243 1243 D DemoManagerService: Lifecycle onStart end
03-31 06:11:43.988 1243 1243 D SystemServerTiming: StartDemoManagerService took to complete: 3ms

14:15:08.034 10415 10415 SampleApp mDemoManager=android.app.DemoManager@e8bd8a2
14:15:08.038 10415 10415 SampleApp result=5


## 三、遇到的问题


1. SEPolicy 权限问题详细log:



16:37:47.140 1222 1222 SystemServerTiming: StartDemoManagerService
16:37:47.140 1222 1222 SystemServiceManager: Starting com.android.server.DemoManagerServiceKaTeX parse error: Undefined control sequence: \* at position 443: … \̲*̲\*\*\*\*\*\*\*\…Lifecycle: onStart threw an exception
16:37:47.146 1222 1222 SystemServer: at com.android.server.SystemServiceManager.startService(SystemServiceManager.java:244)
16:37:47.146 1222 1222 SystemServer: at com.android.server.SystemServiceManager.startService(SystemServiceManager.java:225)
16:37:47.146 1222 1222 SystemServer: at com.android.server.SystemServer.startOtherServices(SystemServer.java:2928)
16:37:47.146 1222 1222 SystemServer: at com.android.server.SystemServer.run(SystemServer.java:1225)
16:37:47.146 1222 1222 SystemServer: at com.android.server.SystemServer.main(SystemServer.java:946)
16:37:47.146 1222 1222 SystemServer: at java.lang.reflect.Method.invoke(Native Method)
16:37:47.146 1222 1222 SystemServer: at com.android.internal.os.RuntimeInit M e t h o d A n d A r g s C a l l e r . r u n ( R u n t i m e I n i t . j a v a : 567 ) 16 : 37 : 47.14612221222 S y s t e m S e r v e r : a t c o m . a n d r o i d . i n t e r n a l . o s . Z y g o t e I n i t . m a i n ( Z y g o t e I n i t . j a v a : 1113 ) 16 : 37 : 47.14612221222 S y s t e m S e r v e r : C a u s e d b y : j a v a . l a n g . S e c u r i t y E x c e p t i o n : 16 : 37 : 47.14612221222 S y s t e m S e r v e r : a t a n d r o i d . o s . P a r c e l . c r e a t e E x c e p t i o n O r N u l l ( P a r c e l . j a v a : 2437 ) 16 : 37 : 47.14612221222 S y s t e m S e r v e r : a t a n d r o i d . o s . P a r c e l . c r e a t e E x c e p t i o n ( P a r c e l . j a v a : 2421 ) 16 : 37 : 47.14612221222 S y s t e m S e r v e r : a t a n d r o i d . o s . P a r c e l . r e a d E x c e p t i o n ( P a r c e l . j a v a : 2404 ) 16 : 37 : 47.14612221222 S y s t e m S e r v e r : a t a n d r o i d . o s . P a r c e l . r e a d E x c e p t i o n ( P a r c e l . j a v a : 2346 ) 16 : 37 : 47.14612221222 S y s t e m S e r v e r : a t a n d r o i d . o s . I S e r v i c e M a n a g e r MethodAndArgsCaller.run(RuntimeInit.java:567) 16:37:47.146 1222 1222 SystemServer: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1113) 16:37:47.146 1222 1222 SystemServer: Caused by: java.lang.SecurityException: 16:37:47.146 1222 1222 SystemServer: at android.os.Parcel.createExceptionOrNull(Parcel.java:2437) 16:37:47.146 1222 1222 SystemServer: at android.os.Parcel.createException(Parcel.java:2421) 16:37:47.146 1222 1222 SystemServer: at android.os.Parcel.readException(Parcel.java:2404) 16:37:47.146 1222 1222 SystemServer: at android.os.Parcel.readException(Parcel.java:2346) 16:37:47.146 1222 1222 SystemServer: at android.os.IServiceManager MethodAndArgsCaller.run(RuntimeInit.java:567)16:37:47.14612221222SystemServer:atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:1113)16:37:47.14612221222SystemServer:Causedby:java.lang.SecurityException:16:37:47.14612221222SystemServer:atandroid.os.Parcel.createExceptionOrNull(Parcel.java:2437)16:37:47.14612221222SystemServer:atandroid.os.Parcel.createException(Parcel.java:2421)16:37:47.14612221222SystemServer:atandroid.os.Parcel.readException(Parcel.java:2404)16:37:47.14612221222SystemServer:atandroid.os.Parcel.readException(Parcel.java:2346)16:37:47.14612221222SystemServer:atandroid.os.IServiceManagerStub P r o x y . a d d S e r v i c e ( I S e r v i c e M a n a g e r . j a v a : 452 ) 16 : 37 : 47.14612221222 S y s t e m S e r v e r : a t a n d r o i d . o s . S e r v i c e M a n a g e r P r o x y . a d d S e r v i c e ( S e r v i c e M a n a g e r N a t i v e . j a v a : 72 ) 16 : 37 : 47.14612221222 S y s t e m S e r v e r : a t a n d r o i d . o s . S e r v i c e M a n a g e r . a d d S e r v i c e ( S e r v i c e M a n a g e r . j a v a : 249 ) 16 : 37 : 47.14612221222 S y s t e m S e r v e r : a t c o m . a n d r o i d . s e r v e r . S y s t e m S e r v i c e . p u b l i s h B i n d e r S e r v i c e ( S y s t e m S e r v i c e . j a v a : 442 ) 16 : 37 : 47.14612221222 S y s t e m S e r v e r : a t c o m . a n d r o i d . s e r v e r . S y s t e m S e r v i c e . p u b l i s h B i n d e r S e r v i c e ( S y s t e m S e r v i c e . j a v a : 426 ) 16 : 37 : 47.14612221222 S y s t e m S e r v e r : a t c o m . a n d r o i d . s e r v e r . S y s t e m S e r v i c e . p u b l i s h B i n d e r S e r v i c e ( S y s t e m S e r v i c e . j a v a : 413 ) 16 : 37 : 47.14612221222 S y s t e m S e r v e r : a t c o m . a n d r o i d . s e r v e r . D e m o M a n a g e r S e r v i c e Proxy.addService(IServiceManager.java:452) 16:37:47.146 1222 1222 SystemServer: at android.os.ServiceManagerProxy.addService(ServiceManagerNative.java:72) 16:37:47.146 1222 1222 SystemServer: at android.os.ServiceManager.addService(ServiceManager.java:249) 16:37:47.146 1222 1222 SystemServer: at com.android.server.SystemService.publishBinderService(SystemService.java:442) 16:37:47.146 1222 1222 SystemServer: at com.android.server.SystemService.publishBinderService(SystemService.java:426) 16:37:47.146 1222 1222 SystemServer: at com.android.server.SystemService.publishBinderService(SystemService.java:413) 16:37:47.146 1222 1222 SystemServer: at com.android.server.DemoManagerService Proxy.addService(IServiceManager.java:452)16:37:47.14612221222SystemServer:atandroid.os.ServiceManagerProxy.addService(ServiceManagerNative.java:72)16:37:47.14612221222SystemServer:atandroid.os.ServiceManager.addService(ServiceManager.java:249)16:37:47.14612221222SystemServer:atcom.android.server.SystemService.publishBinderService(SystemService.java:442)16:37:47.14612221222SystemServer:atcom.android.server.SystemService.publishBinderService(SystemService.java:426)16:37:47.14612221222SystemServer:atcom.android.server.SystemService.publishBinderService(SystemService.java:413)16:37:47.14612221222SystemServer:atcom.android.server.DemoManagerServiceLifecycle.onStart(DemoManagerService.java:33)
16:37:47.146 1222 1222 SystemServer: at com.android.server.SystemServiceManager.startService(SystemServiceManager.java:238)
16:37:47.146 1222 1222 SystemServer: … 7 more
16:37:47.143 0 0 [0: Binder:695_2: 706] avc: denied { add } for pid=1222 uid=1000 name=demo scontext=u:r:system_server:s0 tcontext=u:object_r:default_android_service:s0 tclass=service_manager permissive=0
16:37:47.143 0 0 : [0: Binder:695_2: 706]
16:37:47.146 1222 1222 SystemServerTiming: StartDemoManagerService took to complete: 7ms



> 
> 链接:https://www.jianshu.com/p/74971ee85a8b  
>  作者:行走中的3卡
> 
> 
> 


### 最后


**如果你想要深入系统的学习Android Framework框架,这里可以分享一份《Android Framework源码开发揭秘》,其中记录了从系统启动流程到WMS全部源码解析,相信你能优秀地学习整个Framework框架。扫描下方二维码直接领取!**


![](https://img-blog.csdnimg.cn/img_convert/716eee2d7d49a9064e3e90ae64bf4bfc.png)
### 第一章 系统启动流程分析


* 第一节 Android启动概览
* 第二节 init.rc解析
* 第三节 Zygote
* 第四节 面试题


![在这里插入图片描述](https://img-blog.csdnimg.cn/5fe36ad1311144cfa6b7f17b4949c836.png#pic_center)


### 第二章 跨进程通信IPC解析


* 第一节 Sercice 还可以这么理解
* 第二节 Binder基础
* 第三节 Binder应用
* 第四节 AIDL应用(上)
* 第五节 AIDL应用(下)
* 第六节 Messenger原理及应用
* 第七节 服务端回调
* 第八节 获取服务(IBinder)
* 第九节 Binder面试题全解析


![在这里插入图片描述](https://img-blog.csdnimg.cn/caf96b2bd50544769260112224c57f00.png#pic_center)


### 第三章 Handler源码解析


* 第一节 源码分析
* 第二节 难点问题
* 第三节 Handler常问面试题
* ![在这里插入图片描述](https://img-blog.csdnimg.cn/3b8b5aa9efe94683b585bde1ce1b1fe9.png#pic_center)


### 第四章 AMS源码解析


* 第一节 引言
* 第二节 Android架构
* 第三节 通信方式
* 第四节 系统启动系列
* 第五节 AMS
* 第六节 AMS 面试题解析


![在这里插入图片描述](https://img-blog.csdnimg.cn/2aa3f0c0eb32431793dac778d27a2c51.png#pic_center)


### 第五章 WMS源码解析


* 第一节 WMS与activity启动流程
* 第二节 WMS绘制原理
* 第三节 WMS角色与实例化过程
* 第四节 WMS工作原理


![在这里插入图片描述](https://img-blog.csdnimg.cn/1abeeff9d98a426b86b412fb844d5df6.png#pic_center)


### 第六章 Surface源码解析


* 第一节 创建流程及软硬件绘制
* 第二节 双缓冲及SurfaceView解析
* 第三节 Android图形系统综述
* ![在这里插入图片描述](https://img-blog.csdnimg.cn/56e3083053524a1b9b26d346323ce24a.png#pic_center)


### 第七章 基于Android12.0的SurfaceFlinger源码解析


* 第一节 应用建立和SurfaceFlinger的沟通的桥梁
* 第二节 SurfaceFlinger的启动和消息队列处理机制


### 尾声

最后,我再重复一次,如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

最后想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。

**进阶学习视频**

![](https://img-blog.csdnimg.cn/img_convert/06a4ff9e478d3e50e8601c21c332b9ad.webp?x-oss-process=image/format,png)

**附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题** (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

![](https://img-blog.csdnimg.cn/img_convert/3b219272d1da7553949cc2b8d592ac39.webp?x-oss-process=image/format,png)


加入社区》https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0
师教程,保证你学了以后保证薪资上升一个台阶。

当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。

**进阶学习视频**

[外链图片转存中...(img-jU4BwSdR-1725632706669)]

**附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题** (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中...(img-0Dqm4ZLg-1725632706669)]


加入社区》https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值