天天看點

android 熱更新檔功能實作初探-資源引用<二>

在研究dexposed時候,怎麼使用另外一個apk的資源。

我們知道,activity的工作主要是由ContextImpl來完成的, 它在activity中是一個叫做mBase的成員變量。注意到Context中有如下兩個抽象方法,看起來是和資源有關的,實際上context就是通過它們來擷取資源的,這兩個抽象方法的真正實作在ContextImpl中。也即是說,隻要我們自己實作這兩個方法,就可以解決資源問題了。

public abstract AssetManager getAssets();

public abstract Resources getResources();

以下是我的實作方式:

首先需要把新的包資源添加到宿主包中:

/**
     * 添加 新的 apk檔案資源 到宿主apk檔案中
     *
     * @param dexPath 新的apk檔案
     * @return 資源管理
     */
    public static AssetManager createAssetManager(String dexPath) {
        try {
            AssetManager assetManager = AssetManager.class.newInstance();
            // 反射添加新的dex包的
            Method addAssetPath = assetManager.getClass().getMethod("addAssetPath", String.class);
            addAssetPath.invoke(assetManager, dexPath);
            return assetManager;
        } catch (Exception e) {
            return null;
        }
    }
           

然後把資源路徑放入資源中

/**
     * 建立 新的資源resources 添加
     *
     * @param activity     上下文
     * @param assetManager 資源路徑管理
     * @return 新的資源(包含 新加包,宿主包)
     */
    public static Resources createResources(Activity activity, AssetManager assetManager) {
        Resources superRes = activity.getResources();
        Resources resources = new Resources(assetManager, superRes.getDisplayMetrics(), superRes.getConfiguration());
        return resources;
    }
           

這樣我們就擷取到了新的  Resources 資源了,我們就可以使用新的資源加載patch 包中的資源了。

參考部落格:http://www.cnblogs.com/lee0oo0/p/3665066.html