AIDL接入方式

1.在项目app目录下的build.gradle开启AIDL

以build.gradle.kts为例

android {
   ....
    //开启AIDl
    buildFeatures {
        aidl = true
    }
}

2.创建aidl文件

1.在app/src/main创建aidl文件夹 下载aidl压缩包解压到aidl目录(完整路径为aidl.cloud.api.server)

3.在app项目中连接aidl服务

以kotiln代码为例 1. 创建service服务 val mControl = object : ServiceConnection { override fun onServiceConnected(p0: ComponentName?, p1: IBinder?) { LogUtils.d("创建aidl") control = ControlInterface.Stub.asInterface(p1) MyAidlManager.setControlAidl(control) }

	override fun onServiceDisconnected(p0: ComponentName?) {
    	LogUtils.d("断开连接")
    	//断开后重连
    	GlobalScope.launch {
      	  delay(3000)
            startMyService()
        }
    }
}
    
val mRoot = object : ServiceConnection {
	override fun onServiceConnected(p0: ComponentName?, p1: IBinder?) {
       LogUtils.d("创建aidl")
       root = RootInterface.Stub.asInterface(p1)
       MyAidlManager.setRootAidl(root)
    }
    
    override fun onServiceDisconnected(p0: ComponentName?) {
       LogUtils.d("断开连接")
       //断开后重连
       GlobalScope.launch {
           delay(3000)
           startMyService()
       }
    }
}
    
2.设置一个全局可使用的Utils
object MyAidlManager {
    
    var control : ControlInterface? = null
    var root : RootInterface? = null
    
    fun setControlAidl(control : ControlInterface?){
        this.control = control
    }
    
    fun setRootAidl(root : RootInterface?){
       this.root = root
    }
}
    
3.绑定aidl服务
fun startMyService(){
	val intent = Intent("aidl.cloud.api.ControlServer")
	intent.setPackage("com.cloud.rtcgesture")
	bindService(intent, mControl, BIND_AUTO_CREATE)
    
	val intent2 = Intent("aidl.cloud.api.RootServer")
	intent2.setPackage("com.cloud.rtcgesture")
	bindService(intent2, mRoot, BIND_AUTO_CREATE)
}
    
4.关闭服务
override fun onDestroy() {
   super.onDestroy()
   unbindService(mControl)
   unbindService(mRoot)
}

5.启动服务
startMyService()

4.在APP目录下的AndroidManifest.xml下添加适配

<manifest>

	...
	<queries>
		<package android:name="com.cloud.rtcgesture" />
	</queries>

</manifest>

5.接口方法描述

ControlInterface(控制工具类)

//isOpen 打开(true)/关闭(false) 谷歌服务
isOpenGms(boolean isOpen)
//message 消息透传到用户端  需在用户连接到云机后才能透传
sendMessage(String message)

RootInterface(root工具类)

//isRoot 打开(true)/关闭(false) 全局root开关
allRoot(boolean isRoot)
//packageName 包名,isRoot 打开(true)/关闭(false) (需要在全局root开启后才能开启root)指定包名的root开关
//开关后需要重启应用后失效(无效的情况需要在应用设置中强行停止后生效)
setRootPackageName(String packageName, boolean isRoot)
//packageName 包名,返回true打开,false关闭 判断指定包名是否开启root
isRoot(String packageName)
//全局root是否打开,返回true打开,false关闭
isAllRoot()

6.真机消息透传到云机

在aidl.cloud.api.server目录添加MessageInterface.aidl文件 创建一个Service继承编译后的aidl文件MessageInterface.Stub() 在MessageInterface.Stub()的接口里面实现message方法

接口方法描述

//type 真机传过来的type字段,data 机传过来的data字段
message(type: Int, data: String?)

7.获取后台下发任务下载进度

1.创建ApkDownloaderServer目录需要与aidl路径相同并实现ApkDownloaderInterface aidl方法

//任务开始下载  packageName 包名  iconUrl icon地址  appName 文件名称  taskId 任务id  path 下载路径
apkDownloadStart(String packageName, String iconUrl, String appName, long taskId, String path);
//任务下载进度 packageName 包名  progress 进度
apkProgress(String packageName, int progress);
//任务下载完成 packageName 包名  appName 文件名称  taskId 任务id
apkDownloaderEnd(String packageName, String appName, long taskId);
//任务下载失败 packageName 包名 
apkDownloadFail(String packageName);

注意:一般由launcher集成显示进度,包名需要是com.android.mxLauncher3 其他包名需要获取后台下载进度需要联系商务或者客服定制