最近需要天机一个应用服务,需要多个应用共享同一个服务,脑海中的第一印象就是系统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/目录下面