Android(安卓)P中如何自定义一个系统Service
1. Context中新建service name
frameworks/base/core/java/android/content/Context.java
public static final String JUSTART_SERVICE = "justart";
2. 创建aidl文件
frameworks/base/core/java/android/app/IJustArt.aidl
package android.app;/** * Created by justart on 2019/3/21. */interface IJustArt { String getAllWifiInfo();}
这里的IJustArt.aidl负责APP端和system_server中的自定义service 通信
3. Android.bp 配置
frameworks/base/Android.bp
"core/java/android/app/IActivityManager.aidl",+ "core/java/android/app/IJustArt.aidl",
找一个熟悉的系统service对应的aidl文件,在下面添加一条即可。只有在这里配置之后编译系统才能找到他,将它编译生成IJustArt.java,编译之后的文件生成在 :\out\soong\.intermediates\frameworks\base\framework\android_common\gen\aidl\frameworks\base\core\java\android\app\IJustArt.java
4. service下创建自定义Service
frameworks/base/services/core/java/com/android/server/justart/JustArtService.java
package com.android.server.justart;import android.os.RemoteException;import android.app.IJustArt;/** * Created by justart on 2019/3/21. */public class JustArtService extends IJustArt.Stub{ private final static String TAG = "JustArtService"; public JustArtService(){ } @Override public String getAllWifiInfo() throws RemoteException { String str = "this is justart test string demo haha"; return str; }}
个人在server目录下创建一个justart文件夹,然后新建JustArtService,这里仅有一个方法用来测试。
5. 创建Service对应APP端的manager类
frameworks/base/core/java/android/app/JustArt.java
package android.app;import android.content.Context;import android.os.RemoteException;/** * Created by justart on 2019/3/21. */public class JustArt { IJustArt service; Context mContext; public JustArt(Context context, IJustArt justArt){ mContext = context; service = justArt; } public String getAllWifiInfo(){ try { return service.getAllWifiInfo(); } catch (RemoteException e) { e.printStackTrace(); return null; } }}
这个manager的作用具体是干什么呢?其实就对service中的方法的管理。
6. system_server 启动管理service
frameworks/base/services/java/com/android/server/SystemServer.java
+//add by justart for debug+import com.android.server.justart.JustArtService; public final class SystemServer { startOtherServices(){ ....+ //add by justart for debug+ ServiceManager.addService(Context.JUSTART_SERVICE, new JustArtService()); ... }}
在system_server启动时候将这个service 添加到ServiceManager统一管理,以便其他进程或者线程获取这个service。
7. SystemServiceRegistry注册自定义service
frameworks/base/core/java/android/app/SystemServiceRegistry.java
registerService(Context.JUSTART_SERVICE, JustArt.class, new CachedServiceFetcher() { @Override public JustArt createService(ContextImpl ctx) { IBinder b = ServiceManager.getService(Context.JUSTART_SERVICE); IJustArt service = IJustArt.Stub.asInterface(b); return new JustArt(ctx,service); }});
在SystemServiceRegistry文件中找到一个熟悉的系统service比如ActivityManagerService的register代码字节copy,修改其中的Service名字已经对应manager类。这里就是负责给service绑定一个manager,也就是前面的JustArt.java。
这里代码相关的东西就配置完成,下面需要设置相关的SeLinux权限。
8. 配置SeLinux
8.1 service.te
(1)system/sepolicy/public/service.te
type justart_service, system_api_service, system_server_service, service_manager_type;
最后一行添加上面一句话即可。(抄袭ActivityManager的配置)
Android P 中规定与该目录保持一致的还有:
(2)system/sepolicy/prebuilts/api/28.0/public/service.te
type justart_service, system_api_service, system_server_service, service_manager_type;
所以这个里面也要和上面service.te 内容保持一致,记住是完全一致(位置,格式...最好直接copy过来到相同位置)
8.2 service_contexts
(1)system/sepolicy/private/service_contexts
activity u:object_r:activity_service:s0 justart u:object_r:justart_service:s0 alarm u:object_r:alarm_service:s0
中间找个位置添加自己的service权限,和activity规范保持一致即可,前面写Context.java中新建的名字。后面部分在后面追加_service。
Android P 中规定与该目录保持一致的还有
(2)system/sepolicy/prebuilts/api/28.0/private/service_contexts
所以这个里面也要和上面service_contexts 内容保持一致,记住是完全一致(位置,格式...最好直接copy过来到相同位置)
8.3 service定义typeattribute
(1)system/sepolicy/prebuilts/api/26.0/nonplat_sepolicy.cil
(typeattribute justart_service_26_0)(roletype object_r justart_service_26_0)
在上面文件中添加如上两行,(可以借鉴AMS定义)
(2)system/sepolicy/prebuilts/api/27.0/nonplat_sepolicy.cil
(typeattribute justart_service_27_0)(roletype object_r justart_service_27_0)
在上面文件中添加如上两行,(可以借鉴AMS定义)
8.4 配置typeattributesset
(1)system/sepolicy/private/compat/26.0/26.0.cil
(typeattributeset justart_service_26_0 (justart_service))
(2)system/sepolicy/private/compat/27.0/27.0.cil
(typeattributeset justart_service_27_0 (justart_service))
(3)system/sepolicy/prebuilts/api/28.0/private/compat/26.0/26.0.cil
(typeattributeset justart_service_26_0 (justart_service))
同(1)保持一致,格式,位置,内容完全一样,建议都放在最后一行。
(4)system/sepolicy/prebuilts/api/28.0/private/compat/27.0/27.0.cil
(typeattributeset justart_service_27_0 (justart_service))
同(2)保持一致,格式,位置,内容完全一样,建议都放在最后一行。
到这里所有的selinux权限相关配置完成,不得不说android P上selinux配置东西真的多,感叹系统越做越安全,哈哈。
android P之前都可以反射调用系统service,android P之后都被hidden了。
9. make update-api
执行make update-api 更新源码api再编译即可。
make update-api
什么时候需要执行这个编译选项呢?
-
添加系统API或者修改@hide的API后;
-
修改公共api后。
更多相关文章
- android 电话拨号器
- android添加广告之--admob
- android 学习笔记
- Android(安卓)5.0WebView选择本地文件
- Android之ViewPager的使用
- android 编译 release 签名
- Android(安卓)源码编译so,jar
- 获得位置信息 android
- Android(安卓)Studio Gradle project sync failed