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/目錄下面

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章