java获取apk启动activity_兼容 Android 10 启动 APK 实现方案
背景
我們想啟動(dòng) APK 程序,有很多種方法,可以使用 Intent,也可以使用 adb shell 命令來啟動(dòng),還有通過反射來啟動(dòng) APk 程序。
我們這里主要討論通過反射的方式來啟動(dòng) apk 程序。Android10 之前,我們通過反射來啟動(dòng) APK,反射的是 startActivityAndWait(…) 方法,該方法是在 IActivityMessage.java 實(shí)現(xiàn)的,通過來啟動(dòng) APk 程序。
在 Android10 的時(shí)候,該方案不太適用,需要反射 shellCommand(…) 來啟動(dòng) Android 系統(tǒng) 10 的 APK 程序。
本方案是基于 AM 啟動(dòng) Activity 的方式來實(shí)現(xiàn)的。
核心技術(shù)方案和原理圖
Android 10 為了增加安全性 IActivityMessage.java 類去掉了,變?yōu)?IActivityMessage.aidl 文件,其中 startActivityAndWait(…) 方法轉(zhuǎn)移到了 ActivityManagerServer.java 服務(wù)類中。所以,我們不能使用 IActivityMessage.java 去執(zhí)行 startActivityAndWait(…) 方法。
Android 10 AM.java 啟動(dòng)源碼:
Android 10 原先 AM.java 功能邏輯轉(zhuǎn)移到 ActivityManagerShellCommand.java 源碼如下:
我們要反射 mAm.asBinder().shellCommand 來啟動(dòng) APK。方案實(shí)現(xiàn)時(shí)序圖如下:
技術(shù)優(yōu)勢
兼容了 Android10 通過反射啟動(dòng) APK 。
技術(shù)實(shí)現(xiàn)
1.首先獲取 ActivityManagerNative 類對(duì)象。
2.獲取 IActivityManager 對(duì)象。
3.獲取當(dāng)前的手機(jī)系統(tǒng)版本。
4.調(diào)用 IActivityManager 中的 asBinder 方法,可以通過該方法獲取 BinderProxy 對(duì)象。
5.反射獲取 ShellCallback 類對(duì)象和 ResultReceiver 類對(duì)象。
6.獲取 shellCommand 方法。
7.調(diào)用 shellCommand 方法。
整體實(shí)現(xiàn)代碼
效果展示
Android 10 手機(jī)
  運(yùn)行成功 cmd 界面截圖
  啟動(dòng)成功后的 APK 界面
總結(jié)
以上是生活随笔為你收集整理的java获取apk启动activity_兼容 Android 10 启动 APK 实现方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言中文件读写面试题,在C ++中有效
- 下一篇: 小王在CSDN的六年创作历程