Android10.0 AIDL自定义服务接口并生成jar包上层调用

第一步:创建自定义接口文件夹

alps\frameworks\base\core\java\android\{folder}

第二步:创建AIDL文件文件夹示例:alps\frameworks\base\core\java\android\lqdbg\aidl\  

package android.lqdbg.aidl;

// Declare any non-default types here with import statements

interface ILqdbgMessage {
   void setValue(String str);
   String getValue();
}

第三步:配置AIDL文件

alps\frameworks\base\Android.bp
 "core/java/android/***/*****.aidl",
 +++ "core/java/android/lqdbg/aidl/ILqdbgMessage.aidl",
 "core/java/android/os/***/***.aidl",

第四步:编写系统级服务

alps\frameworks\base\core\java\android\lqdbg\aidl\LqdbgService.java

package android.lqdbg.aidl;

import android.os.RemoteException;

public class LqdbgService extends ILqdbgMessage.Stub {
    public String value = "I am a value";
    @Override
    public void setValue(String str) throws RemoteException {
        this.value=str;
    }

    @Override
    public String getValue() throws RemoteException {
        return value;
    }
}

第五步:定义Java接口类

alps\frameworks\base\core\java\android\content\Context.java
   

   /**
      *  20240525
      *  Lqdbg Test Aidl
      */
 +++   public static final String LQDBG_TEST_AIDL_SERVICE = "lqdbgtest";

 - 5.1 创建暴露给上层调用的Manager管理类

package android.lqdbg.aidl;
import android.content.Context;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.util.Log;

public class LqdbgManager {
    private static final String TAG = "LqdbgManager";
    private ILqdbgMessage mService;
    private static LqdbgManager mInstance=null;

    public static final String LQDBG_TEST_AIDL_SERVICE = "lqdbgtest";
    public LqdbgManager() {
        this.mService = ILqdbgMessage.Stub.asInterface(ServiceManager.getService(Context.LQDBG_TEST_AIDL_SERVICE));
    }
    public static synchronized LqdbgManager getInstance(){
        if (mInstance==null){
            synchronized (LqdbgManager.class){
                if (mInstance==null){
                    mInstance=new LqdbgManager();
                }
            }
        }
        return mInstance;
    }


   public void setValue(String msg){
        try {
            mService.setValue(msg);
        }catch (RemoteException e){
            Log.e(TAG, "setValue fail." );
        }
   }
   public String getValue(){
        try {
            return mService.getValue();
        }catch (RemoteException e){
            Log.e(TAG, "getValue: fail.");
           return "";
        }
   }
}
> 注:AIDL类文件目录层级

`alps\frameworks\base\core\java\android\lqdbg\aidl\ILqdbgMessage.aidl`
`alps\frameworks\base\core\java\android\lqdbg\aidl\LqdbgService.java`
`alps\frameworks\base\core\java\android\lqdbg\LqdbgManager.java`

第六步:注册服务

alps\frameworks\base\core\java\android\app\SystemServiceRegistry.java

   /** lqdbg add for Test */
       registerService(Context.LQDBG_TEST_AIDL_SERVICE, LqdbgManager.class,
                new StaticServiceFetcher<LqdbgManager>() {
                    @Override
                    public LqdbgManager createService() {
                        return LqdbgManager.getInstance();
                    }});

 第七步:将自定义Service 加入到 SystemServer

alps\frameworks\base\services\java\com\android\server\SystemServer.java

// add 
         try { 
                LqdbgService lqdbg = new LqdbgService();
                ServiceManager.addService(Context.LQDBG_TEST_AIDL_SERVICE, lqdbg);
            } catch (Throwable e) {
                Slog.e(TAG, "Failure starting SerialService", e);
             }
//end

第八步:权限策略配置

system/sepolicy/prebuilts/api/29.0/public/service.te
system/sepolicy/prebuilts/api/28.0/public/service.te
system/sepolicy/prebuilts/api/27.0/public/service.te
system/sepolicy/prebuilts/api/26.0/public/service.te
system/sepolicy/public/service.te
以上文件均添加一样的规则,必须保持一致,不然编译会报错
+++ type lqdbgtest_service, app_api_service, ephemeral_app_api_service, system_server_service, service_manager_type;

system/sepolicy/prebuilts/api/29.0/private/service_contexts
system/sepolicy/private/service_contexts
以上文件均添加一样的规则,必须保持一致,不然编译会报错
+++ lqdbgtest                          u:object_r:lqdbgtest_service:s0

 第九步:编译系统

1、在根目录里面执行:source build/envsetup.sh
2、在根目录里面执行:lunch
3、选择对用的编译版本
4、执行 make update-api更新接口
5、编译 make -j8 编译系统

第十步:刷机重启

第十一步:打包成jar包,在As中调试接口

进入目录:/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates
注:Android10 MTK平台中编译好的接口class文件在这个文件夹中

out\soong\.intermediates\development\build\android_stubs_current\android_common\javac\classes\android
$ jar -xvf classes.jar  ../../../../../soong/.intermediates/development/build/android_stubs_current/android_common/javac/classes/android/lqdbg/Lqdbg.class
$ jar -cvf lqdbg.jar android
added manifest
adding: android/(in = 0) (out= 0)(stored 0%)
adding: android/lqdbg/(in = 0) (out= 0)(stored 0%)
adding: android/lqdbg/Lqdbg.class(in = 721) (out= 370)(deflated 48%)
adding: android/lqdbg/aidl/(in = 0) (out= 0)(stored 0%)
adding: android/lqdbg/aidl/ILqdbgMessage$Default.class(in = 866) (out= 443)(deflated 48%)
adding: android/lqdbg/aidl/LqdbgService.class(in = 819) (out= 450)(deflated 45%)
adding: android/lqdbg/aidl/ILqdbgMessage$Stub.class(in = 1294) (out= 570)(deflated 55%)
adding: android/lqdbg/aidl/ILqdbgMessage.class(in = 450) (out= 268)(deflated 40%)
adding: android/lqdbg/aidl/LqdbgManager.class(in = 772) (out= 432)(deflated 44%)


jar -cvf 生成的jar包  路径class路径   class路径 无需填写第一次路径,因为在soong路径下会导致在As中编译报错问题,避免这种问题把 class所在文件夹移动到当前目录,新建android 文件夹下

简单Demo调试成功截图


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值