TShopping

 找回密碼
 註冊
搜索
查看: 501|回復: 0

[教學] 用反射調用未安裝APK裡的函數和資源(續)

[複製鏈接]
發表於 2013-12-20 22:00:16 | 顯示全部樓層 |閱讀模式
 
Push to Facebook Push to Plurk Push to Twitter 
繼續上次的話題,經過一段時間的研究,首先解決了從APK文件中加載資源的問題,然後解決了從APK文件中加載Activity和Service的問題,雖然不能說可以運用未安裝APK文件中所有的東西,不過絕大部分的代碼和資源應該都是可以拿出來用了。 關於加載未安裝APK文件中的資源好像有不少人都說過,我依舊是用的前輩們的方法,反射調用android.content.res.AssetManager類,新建個實例,調用隱藏的方法addAssetPath(String path)將為安裝APK文件的添加進去,然後用這個AssetManager來構建出一個Resource實例就好了。大致代碼如下:
try {
    Class<?> class_AssetManager = Class.forName("android.content.res.AssetManager");
    Object assetMag = class_AssetManager.newInstance();
    Method method_addAssetPath = class_AssetManager
            .getDeclaredMethod("addAssetPath", String.class);
    String path = 路徑;
    String fileName = 文件名;
    method_addAssetPath.invoke(assetMag, path + fileName);
    Resources res = context.getResources();
    Constructor<?> constructor_Resources = Resources.class
            .getConstructor(class_AssetManager, res.getDisplayMetrics()
            .getClass(), res.getConfiguration().getClass());
    res = (Resources) constructor_Resources.newInstance(assetMag,
            res.getDisplayMetrics(), res.getConfiguration());
} catch (Exception e) {
    e.printStackTrace();
}
至於獲取了Resource之後怎麼再獲取相應的資源,這個應該就不用多說了,用反射去獲取R文件中的值好了,不贅述。
然後就是關於啟動未安裝APK文件中的Activity和Service,之前看到網上的說法一致是:這是不可能的。首先要說的是,這當然是可以辦到的,Activity和Service也是類,為啥就不能動態加載呢?大家啟動未安裝APK文件中的Activity或者是Service會出現ClassNotFoundException那是因為啟動它們時,用的是android應用默認的類加載器去加載的,而不是大家寫的DexClassLoader,所以會找不到Activity和Service的類。解決方法就是用反射把Android應用默認的類加載器替換掉就好了。思路提供給大家,代碼因為是公司在用的,就不貼出來了- -
http://blog.sina.com.cn/s/blog_7bed7b2b010169se.html

 

臉書網友討論
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2016-12-7 14:00 , Processed in 0.056624 second(s), 22 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表