Android P添加service

引自: https://blog.csdn.net/qq_24490341/article/details/88979856

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<JustArt>() {
        @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后,需要
---------------------
作者:Just Enough
来源:CSDN
原文:https://blog.csdn.net/qq_24490341/article/details/88979856
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值