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 其他包名需要获取后台下载进度需要联系商务或者客服定制