android_10.0.0_r41自定义驱动编译+Framework层调用_5(Framework JAVA调用)

参考文献: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);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值