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