1. 程式人生 > >Android如何載入外掛APK裡面的資源

Android如何載入外掛APK裡面的資源

前言:ClassLoader能夠動態載入類,Android裡面的DexClassLoader和PathClassLoader繼承自ClassLoader。DexClassLoader能夠載入未安裝的jar/apk/dex檔案。PathClassLoader只能載入系統中已經安裝過的apk。

如何實現宿主APK訪問外掛APK裡面的圖片資源?我們知道android裡面訪問資源是通過Resources類。如果能夠直接得到未安裝apk的Resources的話,就能夠操作其資原始檔了。而每個APK檔案在程序中都對應有一個全域性的Resourses物件以及一個全域性的AssetManager物件,也就是說如果只是簡單的例項化一個AssetManager物件傳進去,那麼這個物件僅僅只是一個普通的java類而已,不具備Android中全域性AssetManager物件的功能,因此也就不具備使用外掛apk中資源的功能,因為該AssetManager根本就沒走apk初始化啟動過程,因此和外掛apk無任何關係。但是在AssetManager類中我們看到了addAssetPath函式。
這裡寫圖片描述

從註釋可以看到該函式的作用是將額外的assets新增到AssetManager中,其引數是一個資料夾或者zip檔案路徑,而apk檔案本質上就是一個zip包.同時可以看到該方法從註釋可以看到該函式是隱藏的,因此不能夠直接呼叫,但是我們可以通過反射機制來呼叫該函式。
通過上面的分析,我們應該對宿主APK如何訪問外掛APK中的資源有點頭緒了(利用宿主中的AssetManager將外掛APK新增到assetPath中)。下面貼下主要程式碼:
這裡寫圖片描述
我們再通過DexClassLoader載入外掛APK,並通過反射拿到資原始檔對應的類並得到資原始檔對應的值。具體程式碼如下:
這裡寫圖片描述

相關推薦

Android如何載入外掛APK裡面資源

前言:ClassLoader能夠動態載入類,Android裡面的DexClassLoader和PathClassLoader繼承自ClassLoader。DexClassLoader能夠載入未安裝的jar/apk/dex檔案。PathClassLoader只能載

Android 載入其他Apk中的資原始檔

public Drawable loadApkResources(String apkPath) {try {//獲取apk的資源 最終都要通過AssetManager 獲取, getAssets()

載入第三方apk獲取資源Resources$NotFoundException: Resource ID #0x0

emmm 最近看到鴻洋的一篇關於APP換面板的部落格,於是照著弄,發現在 外掛式換膚的過程中遇到了問題,記錄一下. 外掛式換膚載入第三方apk,資原始檔找不到 報錯資訊如下: W

Android 載入其他Apk中的類方法

public void loadApkClass(String apkPath, Context context) {//app路徑下的資料夾名稱File dexOutputDir = context.

Android外掛化開發 第三篇 [載入外掛資源]

引言 本文講解宿主如何從外掛apk中獲取到資源,為啥要從外掛中獲取資源呢?這種需求可能來自於顯示外掛的名字啊,圖示之類的。比如宿主的一個按鍵上顯示“掃一掃”或者"搖一搖"之類的,這個字串是外掛提供的。 Demo建立 引入外掛的AssetManager private sta

Android之非root手機run-as命令獲取debug版本apk裡面的資料(shared_prefs檔案,lib下面的so,資料庫檔案)

1  問題 非root手機想要獲取debug版本的apk裡面的資料(shared_prefs檔案,lib下面的so,資料庫檔案)           2  直接用run-as命令 adb she

Android載入圖片資源的幾種方式

1. 圖片放在sdcard中,   Bitmap imageBitmap = BitmapFactory.decodeFile(path) (path 是圖片的路徑,跟目錄是/sdcard)     2. 圖片在專案的res資料夾下面   //得到applicat

Android外掛化原理和實踐 (四) 之 合併外掛中的資源

我們繼續來學習Android外掛化相關知識,還是要圍繞著三個根本問題來展開。在前面兩章中已經講解過第一個根本問題:在宿主中如何去載入外掛以及呼叫外掛中類和元件程式碼。Demo中使用了Service來演示,因為還沒有解決載入外掛中資源的問題,用Activity不好展示。所以本文將要從資源的載入機制

Android外掛開發篇之----動態載入Activity 免安裝執行程式

                一、前言又到週末了,時間過的很快,今天我們來看一下Android中外掛開發篇的最後一篇文章的內容:動態載入Activity(免安裝執行程式),在上一篇文章中說道了,如何動態載入資源(應用換膚原理解析),沒看過的同學,可以轉戰:當然,今天說道的內容還這這篇文章有關係。關於動態載入

android外掛開發——載入外掛

在閱讀本博文的時候,我假設你已經閱讀了我之前寫的幾篇。猛擊此處 通過前面的幾篇部落格,我們解決了如何啟動一個並沒有在ActivityManifest.xml中宣告的activity。但是有很多細心的讀者私信我說,我們所有的例子裡,外掛都是和主工程在一起的呀,我

Android外掛開發篇之----類載入

前言 關於外掛,已經在各大平臺上出現過很多,eclipse外掛、chrome外掛、3dmax外掛,所有這些外掛大概都為了在一個主程式中實現比較通用的功能,把業務相關或者讓可以讓使用者自定義擴充套件的功能不附加在主程式中,主程式可在執行時安裝和解除安裝。在an

Android動態部署六:如何從外掛apk中啟動BroadcastReceiver和ContentProvider

實現Android動態部署的過程中最重要的是從外掛apk中啟動四大元件,經過前面幾篇文章的分析,現在只剩下BroadcastReceiver和ContentProvider了,BroadcastReceiver是可以通過java程式碼動態註冊的,可想而知

Android外掛化原理和實踐 (三) 之 載入外掛中的元件程式碼

我們在上一篇文章《Android外掛化原理和實踐 (二) 之 載入外掛中的類程式碼》中埋下了一個懸念,那就是通過構造一個DexClassLoader物件後使用反射只能反射出普通的類,而不能正常使用四大元件,因為會報出異常。今天我們就來解開這個懸念和提出解決方法。 1 揭開懸念 還記得《A

Android外掛化原理和實踐 (二) 之 載入外掛中的類程式碼

我們在上一篇文章《Android外掛化原理和實踐 (一)之 外掛化簡介和基本原理簡述》中介紹了外掛化一些基本知識和歷史,最後還列出了三個根本問題。接下來我們打算圍繞著這三個根本問題展開對外掛化的學習。首先本章將介紹第一個根本問題:宿主和外掛中如何相互呼叫程式碼。要實現它們相互呼叫,就得要宿主先將

Android-動態載入外掛化的兩種實現方式(二):介面

上一篇部落格中http://blog.csdn.net/lxping51/article/details/71480239,主要通過反射的方式來實現動態載入外掛化,今天我們以介面的方式來達到目的。介面的實現比反射更為簡單,而且直接呼叫對效能有很大的提高。但是這也

詳解Android外掛化開發-資源訪問

    動態載入技術(也叫外掛化技術),當專案越來越龐大的時候,我們通過外掛化開發不僅可以減輕應用的記憶體和CPU佔用,還可以實現熱插拔,即在不釋出新版本的情況下更新某些模組。     通常我們把安卓資原始檔製作成外掛的形式,無外乎有一下幾種: zip

Android高階】DexClassloader和PathClassloader動態載入外掛的實現

(一)DexClassloader 一、基本概念:          在Android中可以跟java一樣實現動態載入jar,但是Android使用德海Dalvik VM,不能直接載入java打包jar的byte code,需要通過dx工具來優化Dalvik byte

Android Studio刪除工程裡面無用的程式碼和資源

如果你是一個經常開發android應用程式或者做android維護專案的人,我想說你對我談論的這個話題,一定會感興趣的。 因為只有做到了這兩點,你的專案生成的apk包才會更小,而不是隨著你的開發和維護,無用的程式碼和資源無限的堆積,這對開發者和維護者來說不但是噩夢,更是一個無形的炸彈。 好了,廢話不多

Android WebView 的快取機制 & 資源載入方案

前言 由於H5具備 開發週期短、靈活性好 的特點,所以現在 Android App大多嵌入了 Android Webview 元件進行 Hybrid 開發但我知道你一定在煩惱 Android Webview 的效能問題,特別突出的是:載入速度慢 & 消耗流量今天

android載入動畫,不佔用資源

protected AlertDialog alertDialog=null; public void lock(){ if(alertDialog==null){ AlertDialog.Builder buil