Android 7.1 添加一个进程间通讯的系统服务(java层)

最近需要天机一个应用服务,需要多个应用共享同一个服务,脑海中的第一印象就是系统Service,因此研究了一下系统服务,最后方案未被采纳,但是研究的成果还是需要记录一下,方便后期查看.

最近写了 Android 7.1添加一个 系统底层服务

本博客适应于有 Android源码的同学,要是不是搞系统app开发的请绕行

添加Java层系统服务分为三个方面

1.添加packages应用.

2.添加Frameworks层

3.添加system权限.

 

1.添加framework层 涉及到问文件如下:创建 customcamera文件夹并创建对应的文件,添加的方式安装系统中的很多系统service添加方式一样使用 IXXXService.aidl   XXXManager.java 和 XXXManager.java的方式

frameworks/base/Android.mk
frameworks/base/api/current.txt(自动生成)
frameworks/base/api/system-current.txt(自动生成)
frameworks/base/api/test-current.txt(自动生成)
frameworks/base/core/java/android/app/SystemServiceRegistry.java
frameworks/base/core/java/android/content/Context.java
frameworks/base/core/java/android/customcamera/CustomCameraManager.java(新添加的文件)
frameworks/base/core/java/android/customcamera/ICustomCameraService.aidl(新添加的文件)
frameworks/base/services/core/java/com/android/server/customcamera/CustomCameraService.java(新添加的文件)
frameworks/base/services/java/com/android/server/SystemServer.java

具体三个文件内容如下:


frameworks/base/core/java/android/customcamera/ICustomCameraService.aidl 内容

package core.java.android.customcamera;

interface ICustomCameraService {

    void setName(String mname);
    String getName();

}


frameworks/base/core/java/android/customcamera/CustomCameraManager.java

package core.java.android.customcamera;
import core.java.android.customcamera.ICustomCameraService;
import android.content.Context;
import android.os.RemoteException;
import android.util.Log;

public class CustomCameraManager {
    ICustomCameraService mmyService;

    public CustomCameraManager(Context mContext, ICustomCameraService service){
        mmyService = service;
    }

    public void setName(String mname){
        try{
            mmyService.setName(mname);
        }catch(Exception e){
            Log.e("MyService",e.toString());
        }
    }

    public String getName(){
        try{
            return mmyService.getName();
        }catch(Exception e){
            Log.e("MyService",e.toString());
        }
        return null;
    }
}

 

frameworks/base/services/core/java/com/android/server/customcamera/CustomCameraService.java

package com.android.server.customcamera;
import core.java.android.customcamera.ICustomCameraService;
public class CustomCameraService extends ICustomCameraService.Stub {
    private String myName;
    public CustomCameraService() {
    }
    @Override
    public void setName(String mname) {
        myName = mname;
    }
    @Override
    public String getName() {
        return myName;
    }
}


frameworks/base/Android.mk  找到 LOCAL_SRC_FILES += \ 在最下面一行添加自己的aidl

core/java/android/customcamera/ICustomCameraService.aidl \

frameworks/base/core/java/android/content/Context.java 添加自己的Context 标示

    /**
     * add customservices
     */
    public static final String CUSTOM_CAMERA_SERVICE = "custom_camera";

frameworks/base/core/java/android/app/SystemServiceRegistry.java  在static { } 代码块中增加注册自己的服务


import core.java.android.customcamera.CustomCameraManager;
import core.java.android.customcamera.ICustomCameraService;



        registerService(Context.CUSTOM_CAMERA_SERVICE, CustomCameraManager.class,
                new CachedServiceFetcher<CustomCameraManager>() {
             @Override
             public CustomCameraManager createService(ContextImpl ctx) {
                IBinder b = ServiceManager.getService(Context.CUSTOM_CAMERA_SERVICE);
                ICustomCameraService service = ICustomCameraService.Stub.asInterface(b);
                return new CustomCameraManager(ctx, service);
            }});

 
frameworks/base/services/java/com/android/server/SystemServer.java 在startOtherServices方法的try代码块中添加如下代码

import com.android.server.customcamera.CustomCameraService;


ServiceManager.addService(Context.CUSTOM_CAMERA_SERVICE, new CustomCameraService());

需要在代码的根目录执行 来更新API

make update-api

你会发现如下三个文件中增加了和aidl相关的配置

frameworks/base/api/current.txt
frameworks/base/api/system-current.txt
frameworks/base/api/test-current.txt

 

2.添加system权限.​​​​​​添加Javaservice修改system下面的就行,不需要修改devices下面的权限

system/sepolicy/service.te 给自己的服务添加服务类别

type custom_system_camera_service, system_api_service, system_server_service, service_manager_type;

system/sepolicy/service_contexts 给自己的服务定义类型

custom_camera				  u:object_r:custom_system_camera_service:s0

system/sepolicy/untrusted_app.te 允许自己的服务 被 应用 找到

allow untrusted_app custom_system_camera_service:service_manager find;

至此,一个java系统服务已经添加完成完成,可以全编译系统进行烧录,烧录完成之后执行 步骤3 

 

3.添加packages应用.测试添加服务的正确性

自己写了一个测试的demo为 CustomCamera  可将CustomCamera放入到packages文件夹下面,返回系统根目录执行如下命令

source build/envsetup.sh
lunch 31 #你需要编译分分支
切换到 packages/apps/CustomCamera/
mm #执行 

可以在 out/target/product/msm8953_64/system/app/CustomCamera/CustomCamera.apk 找到我们自己的apk安装到烧录好的系统中打开APK 可以查看到log已经被执行了到此添加完成

如果没有反应,请查看log,首先过滤 avc的log,然后在查看 aidl路径是否是 路径填写错误

avc: denied { find } for service=custom_camera pid=22801 uid=10024 scontext=u:r:system_app:s0:c512,c768 tcontext=u:object_r:update_engine_service:s0 tclass=service_manager permissive=0

请查看如何添加这篇文章,在文章的最后讲解了如何添加 Selinux全选问题 Android 7.1 车机 Android 系统 在线升级,将安装到下载到/data/目录下面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值