java獲取apk啟動activity_兼容 Android 10 啟動 APK 實現方案

背景

我們想啟動 APK 程序,有很多種方法,可以使用 Intent,也可以使用 adb shell 命令來啟動,還有通過反射來啟動 APk 程序。

我們這里主要討論通過反射的方式來啟動 apk 程序。Android10 之前,我們通過反射來啟動 APK,反射的是 startActivityAndWait(…) 方法,該方法是在 IActivityMessage.java 實現的,通過來啟動 APk 程序。

在 Android10 的時候,該方案不太適用,需要反射 shellCommand(…) 來啟動 Android 系統 10 的 APK 程序。

本方案是基于 AM 啟動 Activity 的方式來實現的。

核心技術方案和原理圖

Android 10 為了增加安全性 IActivityMessage.java 類去掉了,變為 IActivityMessage.aidl 文件,其中 startActivityAndWait(…) 方法轉移到了 ActivityManagerServer.java 服務類中。所以,我們不能使用 IActivityMessage.java 去執行 startActivityAndWait(…) 方法。

Android 10 AM.java 啟動源碼:

ce949409afee63996584f2a880d99421.png

Android 10 原先 AM.java 功能邏輯轉移到 ActivityManagerShellCommand.java 源碼如下:

a167d4a39cb2a8a543645e8d2a1bdebe.png

我們要反射 mAm.asBinder().shellCommand 來啟動 APK。方案實現時序圖如下:

9d20bfe59674f45a681393bce20a11e8.png

技術優勢

兼容了 Android10 通過反射啟動 APK 。

技術實現

1.首先獲取 ActivityManagerNative 類對象。

7cabb961ed8aad60a1ddc5a4cae08848.png

2.獲取 IActivityManager 對象。

84fc141922d867bd150303126453328e.png

3.獲取當前的手機系統版本。

afe9c1aad17f2503474fd27f924fbe6b.png

4.調用 IActivityManager 中的 asBinder 方法,可以通過該方法獲取 BinderProxy 對象。

f7af1bee00e690517af0f68f2fadf658.png

5.反射獲取 ShellCallback 類對象和 ResultReceiver 類對象。

049704a3f09a30e36bded3a553eea3cd.png

6.獲取 shellCommand 方法。

75149052e7b261d3b25b4458cecd56d6.png

7.調用 shellCommand 方法。

74a4432309e1112244751d510303ce86.png

整體實現代碼

362b25851bf73ef691b8996e8f81aeca.png

效果展示

16b95128825a970dd1b51e571ad1cd92.png

Android 10 手機

315668a833c39a7573aceafb5b81b9b0.png

&nbsp 運行成功 cmd 界面截圖

21e12d4c5ff89b3e2bbf2f4e673dc98a.png

&nbsp 啟動成功后的 APK 界面

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275737.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275737.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275737.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android Studio中解決jar包重復依賴導致的代碼編譯錯誤

在原本的代碼中已經使用了OKHTTP和rxjava,然后今天依賴retrofit的時候一直報錯 Program type already present: okhttp3.internal.ws.RealWebSocket$1.class 說是我重復添加了OKHTTP的包,但其實我直接把OKHTTP的依賴注釋掉都沒用,只要依賴ret…

面試被問項目經驗不用慌,按這個步驟回答絕對驚艷

大家好,我是若川。常有小伙伴問,面試時項目經驗怎么回答,經常會分享這篇文章給TA。本文經授權轉載。面試、學習源碼系列、年度總結、JS基礎系列前言本篇文章的作者是來自阿里淘系用戶增長前端團隊的“亦遜”,18年作為雙非本科生通…

使用概念模型 和心智模型的_為什么要使用模型?

使用概念模型 和心智模型的In a former life, I studied critical feminist theory. This included the field of Semiotics — the study of signs and the production of meaning, as well as Deconstruction —the unpacking of meaning to question assumptions.在過去的生…

長效密鑰與臨時密鑰JAVA判斷_MSBuild無法使用臨時密鑰簽署ClickOnce清單(錯誤MSB3326和MSB3321)...

我正在嘗試在Windows Server計算機上構建ClickOnce Windows Forms項目(.NET 3.5 / Visual Studio 2010) . (為了使用Hudson CI自動化構建過程 . )為了對ClickOnce清單進行簽名,我在Visual Studio中創建了一個臨時密鑰 temp.pfx . 我可以在我的工作站上從Visual Stud…

URL some

** 路由系統:URL配置(URLconf)就像Django所支撐網站的目錄. 本質是URL與該URL要調用的函數的映射表 基本格式 : from django.conf.urls import url urlpatterns [url(正則表達式,views視圖,參數,別名) ] 參數 -- 傳給函數視圖的默認參數 (字典形式) 別名 -- 一個可選的name參…

什么?在 VSCode 里也能用 Postman了?

大家好,我是若川。VSCode中有很多好用的插件,今天推薦 Postcode。面試、學習源碼系列、年度總結、JS基礎系列以前一直在用postman做API測試,如果你同時在使用vscode開發時,每次切出去可能比較煩,其實就是太懶了。。。作…

根據窗口名稱查找關鍵字彈性域用到的表,列等信息

/*根據窗口名稱查找關鍵字彈性域用到的表,列等信息*/--selectc.id_flex_name, a.id_flex_structure_name, b.form_left_prompt, c.application_table_name, b.application_column_name, b.flex_value_set_id fromfnd_id_flex_struct…

英語 動畫 教學 字母_字母形式在閱讀教學中的作用

英語 動畫 教學 字母Note: this essay may also be found on Design Observer.注意:這篇文章也可以在 Design Observer 上找到 。 My first-grade reading tutor gave the best stickers. Puffy, smelly, sparkly — she even had a few that were fuzzy. At that …

java中自定義表單和流程_讓馳騁工作流程引擎 ccbpm使用自定義表單來實現自己的業務邏輯....

1.1.1.1: SDK表單概要說明:我們把流程引擎與表單引擎統稱為ccbpm,但是有一些用戶并不想使用表單引擎,而是用自己的表單,僅僅使用流程引擎,這樣的方式就要采用ccbpm的sdk表單開發模式。關于ccbpm的SDK:ccbpm的sdk就是cc…

乘風破浪的前端小姐姐,是如何一步步走向成功的?

大家好,我是若川。名校畢業的被刪大佬也經歷了社會的毒打,但她沒有放棄。面試、學習源碼系列、年度總結、JS基礎系列王貝珊,騰訊高級工程師,騰訊 AlloyTeam 成員,現騰訊文檔網絡層技術負責人。畢業于中山大學。工作 6 …

【譯】為什么我更喜歡對象而不是switch語句

原文自工程師Enmanuel Durn博客,傳送門 最近(或者不是最近,這完全取決于您什么時候閱讀這邊文章),我正在跟我的團隊伙伴討論如何去處理這種需要根據不同的值去處理不同的情況的方法,通常對于這種情況下&…

摩托羅拉周二將正式分拆為兩經營實體

據華爾街中文網消息稱,摩托羅拉公司周二將正式分拆為兩個經營實體——摩托羅拉移動控股(MMI)和摩托羅拉解決方案公司(MSI)。前者由主要面向消費者的智能手機和機機頂盒業務組成,后者則專注于公共安全無線電和手持掃描儀業務。 上述兩家公司的股票均已于…

如何創建和諧的色彩系統

擁有和諧的色彩系統的好處 (The benefits of having a harmonious color system) Consistent branding express across all platform 在所有平臺上表達一致的品牌 The consistent interface creates a better user experience 一致的界面創建了更好的用戶體驗 More productive …

java restful接口測試_詳解SpringBoot restful api的單元測試

現在我們來利用Spring Boot來構建一個RestFul API,具體如下:1.添加Springboot測試注解RunWith(SpringRunner.class)SpringBootTestpublic class UserControllerTest {}2.偽造mvc環境// 注入Spring 工廠Autowiredprivate WebApplicationContext wac;//偽造…

老姚淺談:怎么學JavaScript?

大家好,我是若川。當初我就是看本文深受啟發,開始看書讀源碼。所以現在聯系了作者老姚 授權轉載分享給大家。我按照文中的做法敲完了《JavaScript語言精粹 修訂版》,在2017年7月23日寫出了我的第一篇文章《讀書筆記》。看完了《JavaScript面向…

JavaScript 如何使用閉包

閉包基本上是內部函數可以訪問其范圍之外的變量&#xff0c;可用于實現隱私和創建函數工廠 定義一個數組&#xff0c;循環遍歷這個數組并在延遲3秒后打印每個元素的索引 先看一個不正確的寫法&#xff1a; const arr [10, 12, 15, 21]; for (var i 0; i < arr.length; i) …

ai中導入sketch_在Sketch中營造深度感

ai中導入sketchCreating a user interface with depth can seem daunting at first, but it only requires you to understand one fundamental rule — emulating a light source.首先&#xff0c;創建具有深度的用戶界面似乎很艱巨&#xff0c;但這僅要求您了解一個基本規則-…

java byte轉bigdecimal_Java BigDecimal byteValueExact()用法及代碼示例

java.math.BigDecimal.byteValueExact()是一個內置函數&#xff0c;它將BigDecimal轉換為字節并檢查丟失的信息。任何大于127或小于-128的BigDecimal值都將生成異常&#xff0c;因為它不適合字節范圍。用法:public byte byteValueExact()參數&#xff1a;該方法不接受任何參數。…

Python3+PyCharm+selenium3 環境搭建

安裝Python3請去python官網下載安裝包&#xff0c;我用的是Python3.6安裝PyCharm&#xff0c;這個也是去官網自己下吧&#xff0c;偶的是2018.2.3&#xff08;CommunityEdition&#xff09;接下來安裝seleniumPyCharm中Tremianl安裝完成后&#xff0c;在python Console中輸入沒…

2021 年最值得了解的 Node.js 工具

大家好&#xff0c;我是若川。今天分享一篇用得上的 node 庫 鏈接地址&#xff1a;https://github.com/huaize2020/awesome-nodejs?前言&#xff1a;文章的靈感來源于&#xff0c;社群中某大佬分享一個自己耗時數月維護的github項目 awesome-nodejs 。或許你跟我一樣會有一個疑…