最近需要天機一個應用服務,需要多個應用共享同一個服務,腦海中的第一印象就是系統Service,因此研究了一下系統服務,最後方案未被採納,但是研究的成果還是需要記錄一下,方便後期查看.
本博客適應於有 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/目錄下面