参考文献:https://blog.csdn.net/luoshengyang/java/article/details/6568411 //罗升阳博客
Android_10.0.0_r41自定义驱动Framework Java服务
1.定义AIDL接口
在frameworks/base/core/java/android/app目录下创建IHelloManager.aidl文件:
package android.app; /** {@hide} */ interface IHelloManager { void init(); //@UnsupportedAppUsage void setVal(int val); //@UnsupportedAppUsage int getVal(); }
2.在frameworks/base/core/java/android/app目录下创建服务HelloManager.java
package android.app; import android.annotation.SystemService; import android.annotation.UnsupportedAppUsage; import android.content.Context; import android.os.IBinder; import android.os.RemoteException; import android.annotation.Nullable; import android.os.ServiceManager; import android.util.Singleton; @SystemService(Context.Hello_SERVICE) public class HelloManager { private Context mContext; /** * @hide */ public HelloManager() { } /** * @hide */ public static IHelloManager getService() { return IHelloManagerSingleton.get(); } @UnsupportedAppUsage private static final Singleton<IHelloManager> IHelloManagerSingleton = new Singleton<IHelloManager>() { protected IHelloManager create() { final IBinder b = ServiceManager.getService(Context.Hello_SERVICE); final IHelloManager im = IHelloManager.Stub.asInterface(b); return im; } }; @Nullable public void init(){ try{ getService().init(); }catch(RemoteException e) { e.rethrowFromSystemServer(); } } @Nullable public void setVal(int val){ try{ getService().setVal(val); }catch(RemoteException e) { e.rethrowFromSystemServer(); } } @Nullable public int getVal() { try { return getService().getVal(); } catch (RemoteException e) { e.rethrowFromSystemServer(); } return -1; } }
3.在frameworks/base目录下修改Android.bp文件
srcs: [ ********************************************** "core/java/android/app/IHelloManager.aidl", //添加这一行 ":apex-properties", ":platform-properties", ":framework-statslog-gen", ],
4.创建服务HelloManagerService.java
在frameworks/base/service/core/java/com/android/server下新建hello文件夹,并在此文件夹下新建HelloManagerService.java文件
package com.android.server.hello; import android.app.IHelloManager; import android.util.Log; public class HelloManagerService extends IHelloManager.Stub { private static final String TAG = "HelloManagerService"; public HelloManagerService() { Log.d(TAG, "HelloService init_native"); init_native(); } public void init(){ Log.d(TAG, "HelloService init"); init_native();; } public void setVal(int val) { Log.d(TAG, "HelloService setVal val:" + val); setVal_native(val); } public int getVal() { Log.d(TAG, "HelloService getVal val"); return getVal_native(); } private static native boolean init_native(); private static native void setVal_native(int val); private static native int getVal_native(); };
5.修改Context,在frameworks/base/core/java/android/content/Context.java中加入常量:
/** @hide */ @StringDef(suffix = { "_SERVICE" }, value = { *************** Hello_SERVICE, //添加自定義服務名 }) @Retention(RetentionPolicy.SOURCE) public @interface ServiceName {} public static final String Hello_SERVICE="hello"; //添加常量
6.在frameworks/base/services/java/com/android/server/SystemServer.java中 注册系统服务
在系統服務中startOtherService()方法中注冊自定義服務.
******************************** import com.android.server.hello.HelloManagerService; ******************************** startOtherService(){ *************************************************** //HelloManagerService traceBeginAndSlog("StartHelloManagerService"); ServiceManager.addService(Context.Hello_SERVICE,new HelloManagerService()); traceEnd(); ******************************* }
7.在frameworks/base/core/java/android/app/SystemServiceRegistry.java注册服务获取器:
************************************ import android.app.HelloManager; import android.app.IHelloManager; ************************************* static { //CHECKSTYLE:OFF IndentationCheck registerService(Context.Hello_SERVICE, HelloManager.class, new CachedServiceFetcher<HelloManager>() { @Override public HelloManager createService(ContextImpl ctx) throws ServiceNotFoundException { return new HelloManager(); }}); ******************************************************* }
8.配置SeLinux權限
在 system/sepolicy/prebuilts/api/29.0/private/ 与 system/sepolicy/private/ 目录下,分别修改:
注意:兩個目錄下文件 需要一致,即使空格和標點符號也要一致
service_contexts: 在中間插入:
************************************************************** activity u:object_r:activity_service:s0 #配置自定义服务selinux角色 hello u:object_r:hello_service:s0 ****************************************************************
service.te 在末尾添加:
**************************************************** type uce_service, service_manager_type; #配置自定义服务类型 type hello_service, app_api_service, ephemeral_app_api_service, system_server_service,service_manager_type; //添加这一行
untrusted_app_all.te 在末尾添加:
#允许所有app使用自定义服务 allow untrusted_app_all hello_service:service_manager find;
9.更新api
make update-api
10.編譯
m
11運行模擬器:運行模擬器一直無法進入主界面,可以反復多次啓動關閉操作,或可執行:emulator -partition-size 200.
emulator
12.運行虛擬機後,執行:
adb shell service list | grep lance
可以查看自定義的服務是否成功加入 到 系統服務
13.修改SDK
a.在SDK/platforms目錄下復制一份android-29(android10),並改名爲:android-311,刪除裏面的android.jar文件,並將源碼中out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/classes-header.jar文件復制到文件夾,其將其改名爲android.jar。
注意:我之前在编译android12源码时在上面这个文件夹下拿的classes-header.jar文件有57M,可以确定这个jar包应该包含了sdk包中android12平台下android.jar包的全部内容,并且还包含了我们自定义服务的HelloManager.class(在此jar包的/android/app/文件夹下),但android10源码编译平台编译后在此文件夹下生成的classes-header.jar包只有6.1M,虽然含有我们的HelloManager.class,但肯定不能完全包含sdk包中的android10平台下的android.jar包全部内容,故我是把android10平台编译生成的classes-header.jar包中的HelloManager.class文件拷贝到sdk中的android10平台中的android.jar中的。如果谁知道android10平台编译的完整的classes-header.jar文件是在哪个文件夹下,也可以回复我,这个完整的jar包确实我是找了好久没找到,因为我最开始是编译android12源码的,只知道android12源码编译完整的jar包是在这个文件夹下。
b.修改SDK/platforms/android-311文件夾中的source.properties、package.xml文件.
source.properties文件:
#指定自定义平台标识为311(可以是任意数字,但为了与原生标识区分,请使用三位数) #修改: Pkg.Desc=Android SDK Platform 311 Pkg.UserSrc=false #修改: Platform.Version=311 Platform.CodeName= Pkg.Revision=1 Layoutlib.Api=15 AndroidVersion.ApiLevel=311 #修改: Layoutlib.Revision=1 Platform.MinToolsRev=22
package.xml文件 :
<localPackage path="platforms;android-311" obsolete="false"> <type-details xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns5:platformDetailsType"> <!-- 修改 --> <api-level>311</api-level> <codename></codename> <layoutlib api="15"/></type-details> <revision> <major>1</major> </revision> <!-- 修改 --> <display-name>Android SDK Platform 311</display-name> <uses-license ref="android-sdk-license"/> </localPackage>
c.復制SDK/source/android-31文件夾並更名爲android-311
修改source.properties文件:
Pkg.UserSrc=false Pkg.Revision=1 AndroidVersion.ApiLevel=311
修改package.xml文件:
<localPackage path="platforms;android-311" obsolete="false"> <type-details xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns5:platformDetailsType"> <!-- 修改 --> <api-level>311</api-level> <codename></codename> <layoutlib api="15"/></type-details> <revision> <major>1</major> </revision> <!-- 修改 --> <display-name>Android SDK Platform 311</display-name> <uses-license ref="android-sdk-license"/> </localPackage>
14.在Android Studio中配置build.gradle:
android { compileSdk 311 .... defaultConfig { targetSdk 311 } }
15.新建工程調用LanceManager自定義系統服務
HelloManager helloManager = (HelloManager)getSystemService("hello");
接下来即可使用已注册的api:
helloManager.init();
helloManager.getVal();
helloManager.setVal(int val);