Android外掛化基礎之載入已安裝的apk資源
我也是在進行學習和研究,有問題可以直接說
應該明確的問題
- 外掛化是什麼意思?
- 為什麼要使用外掛化的這種方式?
- 外掛化的優劣?
根據上述問題我們就可以進行初步的瞭解了
- 外掛顧名思義就是講某一個東西拆分,App也一樣可以拆分,原因有很多例如方法數的限制(65535是因為int本身的限制),app過大,效能損耗過於嚴重等等
- 外掛化就是為了解決這類問題出現的
- 外掛化的優點:模組解耦,動態升級,高效的並行開發,按需求進行載入等等
大概瞭解一下之後我們就開始進入基礎的學習
需要的知識儲備
- 反射相關
- ClassLoader的原理以及基本使用
- 代理模式等暫時就需要那麼多,
廢話不多說 直接上程式碼 先做出來點東西再去仔細研究程式碼
先來學習一下如何載入已經安裝的apk的資源
整體的思路
- 首先我們需要先找到已經載入的apk(apk之間本身是互不相通的,我們可以在manifest節點上設定shareUsersId,這樣我們的apk就可以在同一個執行區域內獲取相關內容)
- 之後我們通過packageManager來獲取已經安裝的app
- 最重要的就是我們需要取到apk對應的Context或者Re
- 我們利用反射拿到資源id
- 通過Context拿到對應的資源就可以了
思路簡單 實現起來也不是很難
大家看一下程式碼
ArrayList<InfoBean> labels = new ArrayList<>();
PackageManager pm = getPackageManager();
//拿到已經安裝的列表
List<PackageInfo> installedPackages = pm.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
for (PackageInfo info :
installedPackages) {
String packageName = info.packageName;
String sharedUserId = info.sharedUserId;
if (!TextUtils.isEmpty(sharedUserId)&&sharedUserId.equals("com.test.download")&&!packageName.equals(getPackageName())){
String label = pm.getApplicationLabel(info.applicationInfo).toString();
InfoBean bean = new InfoBean(label,packageName);
labels.add(bean);
}
}
//展示相關資訊
showData(labels.get(0).label);
showData(labels.get(0).name);
//載入已經安裝的apk檔案並且找到其資源
//通過PathClassLoader進行載入
try {
//根據包名來建立對應的 引數一應用的lable 引數二第一個忽略警告第二個包含程式碼執行
Context pkgContext = this.createPackageContext(labels.get(0).label,CONTEXT_IGNORE_SECURITY|CONTEXT_INCLUDE_CODE);
//建立PathClassLoader該類載入器可以載入已經安裝過的app 引數一路徑 引數二父類載入器 一般都個ClassLoader.getSystemClassLoader()
PathClassLoader loader = new PathClassLoader(pkgContext.getPackageResourcePath(),ClassLoader.getSystemClassLoader());
//通過反射拿到drawable
Class<?> clazz = Class.forName(labels.get(0).label+".R$drawable", true, loader);
//拿到資源資訊
Field about = clazz.getDeclaredField("about");
int res = about.getInt(R.drawable.class);
Drawable drawable = pkgContext.getResources().getDrawable(res);
drawListView.setBackground(drawable);
InfoBean只是一個簡單資訊的實體類,程式碼很簡單,我就不貼出來了
說一下核心方法
this.createPackageContext()該方法會返回一個對應包的Context我們可以通過這個來得到資原始檔
PathClassLoader loader = new PathClassLoader()我們可以通過載入器來載入已經安裝過得apk
Field about = clazz.getDeclaredField(“about”);
int res = about.getInt(R.drawable.class);我們可以通過Field來獲取圖片資源pkgContext.getResources().getDrawable(res);利用已經獲取到的
上下文來獲取對應的圖片資源
以上就是簡單的實現
這個只是個demo練習學習用的
之後我還會寫一篇基礎的獲取未安裝的apk的資源
有什麼問題可以問我
相關推薦
Android外掛化基礎之載入已安裝的apk資源
郵箱:[email protected] 我也是在進行學習和研究,有問題可以直接說 應該明確的問題 外掛化是什麼意思? 為什麼要使用外掛化的這種方式? 外掛化的優劣? 根據上述問題我們就可以進行初步的瞭解了 外掛顧名思義就是
Android外掛化學習之路(一)之動態載入綜述
前段時間,公司專案完成了外掛化的開發,自己也因此學習了很多Android外掛化的知識,於是想把這些內容記錄下來,本次帶來Android外掛化的第一篇:動態載入綜述 背景知識 1.什麼是動態載入? 動態載入技術應由以下幾個部分組成: 1) 應用在執行
Android外掛化技術之旅 1 開篇 - 實現啟動外掛與呼叫外掛中的Activity和Service
前言 Android技術如今已很成熟了,元件化、外掛化、熱修復等等框架層出不窮,如果只停留在單純的會用框架上,技術永遠得不到成長,只有懂得其原理,能夠婉婉道來,能夠自己手動寫出,技術才會得到成長,與其焦慮未來,不如把握現在。本篇將手寫教大家寫出外掛化框架,外掛化技術是Android高階工程師必備的技術之一,
Android外掛化開發之AMS與應用程式(客戶端ActivityThread、Instrumentation、Activity)通訊模型分析
今天主要分析下ActivityManagerService(服務端) 與應用程式(客戶端)之間的通訊模型,在介紹這個通訊模型的基礎上,再 簡單介紹實現這個模型所需要資料型別。 本文所介紹內容基於android2.2版本。由於Android版本的不同
Android外掛化學習之路(四)之使用外掛中的R資源
res裡的每一個資源都會在R.java裡生成一個對應的Integer型別的id,APP啟動時會先把R.java註冊到當前的上下文環境,我們在程式碼裡以R檔案的方式使用資源時正是通過使用這些id訪問res資源,然而外掛的R.java並沒有註冊到當前的上下文環境,所
Android動態載入——載入已安裝APK中的類
public class TestAActivity extends Activity { /** TestB包名 */ private static final String PACKAGE_TEST_B = "com.nmbb.b"; @Override publ
Android外掛化學習之路(六)之動態建立Activity
靜態代理Activity模式的限制 我們在代理Activity模式一文裡談到啟動外掛APK裡的Activity的兩個難題嗎,由於外掛裡的Activity沒在主專案的Manifest裡面註冊,所以無法經歷系統Framework層級的一系列初始化過程,最終導致獲得
Android外掛化架構之Hook繞過manifest檢測
學習自https://www.jianshu.com/p/e359fafe5c29問題我們外掛apk是不會進行一個安裝的,那麼他的manifest就不會生效,所以我們直接啟動肯定是行不通的。所以我們只能隔絕掉我們主apk的manifest的檢測。具體思路如下只需要動態代理ho
Android外掛化學習之路(五)之代理Activity
簡單模式中,使用ClassLoader載入外部的Dex或Apk檔案,可以載入一些本地APP不存在的類,從而執行一些新的程式碼邏輯。但是使用這種方法卻不能直接啟動外掛裡的Activity。 啟動外掛中Activity的兩個主要問題 Activity等元件是
Android外掛化學習之路(二)之ClassLoader完全解析
Java程式碼都是寫在Class裡面的,程式執行在虛擬機器上時,虛擬機器需要把需要的Class載入進來才能建立例項物件並工作,而完成這一個載入工作的角色就是ClassLoader。 類載入器ClassLoader介紹 Android的Dalvik/ART虛擬
Android外掛化架構設計之載入資原始檔
開篇介紹 現在專案比較大 資源比較多,但是若希望動態來載入資原始檔,可以有以下幾種方式: 1. 通過下載資原始檔zip包然後解壓來載入 2. 通過外掛開發 本文通過外掛開發來實現載入外掛中的資原始檔. 程式演示 也可以開啟連結 效果演示 開
Android外掛化原理和實踐 (三) 之 載入外掛中的元件程式碼
我們在上一篇文章《Android外掛化原理和實踐 (二) 之 載入外掛中的類程式碼》中埋下了一個懸念,那就是通過構造一個DexClassLoader物件後使用反射只能反射出普通的類,而不能正常使用四大元件,因為會報出異常。今天我們就來解開這個懸念和提出解決方法。 1 揭開懸念 還記得《A
Android外掛化原理和實踐 (二) 之 載入外掛中的類程式碼
我們在上一篇文章《Android外掛化原理和實踐 (一)之 外掛化簡介和基本原理簡述》中介紹了外掛化一些基本知識和歷史,最後還列出了三個根本問題。接下來我們打算圍繞著這三個根本問題展開對外掛化的學習。首先本章將介紹第一個根本問題:宿主和外掛中如何相互呼叫程式碼。要實現它們相互呼叫,就得要宿主先將
Android 外掛化技術 載入任意未安裝apk
轉載 http://www.eoeandroid.com/thread-562805-1-1.html (一) 綜述 隨著智慧手機硬體效能的逐步提升,移動應用也做的越來越複雜,android平臺上應用的apk包體積也越來越大,然後同類產品開始比拼誰的
Android熱修復與外掛化實踐之路
第1章 class檔案與dex檔案解析本章通過從java最基本的class檔案與android最基本的dex檔案進行對比,並不藉助IDE去生成及執行class與dex檔案,通過講解class與dex的手動生成,執行, 格式對比,讓學生明白二者的相同與不同。1-1 課程專案整體介紹1-2 本章概述1-3 cla
Android外掛化原理和實踐 (四) 之 合併外掛中的資源
我們繼續來學習Android外掛化相關知識,還是要圍繞著三個根本問題來展開。在前面兩章中已經講解過第一個根本問題:在宿主中如何去載入外掛以及呼叫外掛中類和元件程式碼。Demo中使用了Service來演示,因為還沒有解決載入外掛中資源的問題,用Activity不好展示。所以本文將要從資源的載入機制
Android外掛化原理和實踐 (七) 之 專案實踐
我們在前面一系列文章中已經介紹完了外掛化原理以及三個根本問題的解決方案,本文主要就是作為前面幾篇文章的一個總結,通過專案實踐將前面的知識點串起來使完成一個入門級簡單的外掛化工程以及在實際外掛化開發中遇到的一些總結。 實踐 我們先通過Android Studio建立一個工程,工程中包括了兩
Android外掛化完美實現程式碼資源載入及原理講解 附可執行demo
*本篇文章已授權微信公眾號 guolin_blog (郭霖)獨家釋出 。 我們通過前4篇的分解,分別將外掛化設計到的知識點全部梳理了一遍,如果沒有看過的,建議先看前面4篇 6. 外掛化資源的使用及動態載入 附demo 好了上面介紹了之
Android外掛化原理和實踐 (八) 之 注意事項
注意事項 關於外掛化的三個根本問題和解決方案就已經全部介紹完畢了,前一篇文章也通過一個入門級的工程來完整地演示了。但是其實目前熱門的外掛化框架也遠不止這些內容,我們在實際開發中也遠不止這麼簡單。前面介紹的所有知識點只是一個入門而已,外掛化雖然帶來了很多便利,但是在開發過程中也增添了不少麻煩和
Android外掛化原理和實踐 (六) 之 四大元件解決方案
在前面的幾篇文章中已經介紹完了Android外掛化的第一和第二個根本問題,就是宿主和外掛的程式碼互相呼叫問題和外掛中資源的讀取問題。現剩下的就是Android外掛化裡最麻煩的第三個根本問題,也就是在外掛中使用四大元件的問題。我們知道,目前外掛中的四大元件要想正常使用就必須要在宿主中的Androi