【Android 插件化】Hook 插件化框架 ( 加载插件包资源 )(二)

3、创建 Resources


创建 Resources , 传入 AssetManager 对象作为主要参数 , 其它参数都可以从应用的 Resources 中获取 ;


     

// 创建 Resources 并返回
        return mResources = new Resources(
                assetManager,
                mBase.getResources().getDisplayMetrics(),
                mBase.getResources().getConfiguration()






二、自定义 Application 中设置插件资源


加载到插件资源后 , 重写 Application 的 public Resources getResources() 方法 , 返回插件包方法 ;


   

@Override
    public Resources getResources() {
        if (pluginResources != null)
            return pluginResources;
        return super.getResources();
    }


完整代码示例 :


package com.example.plugin_hook;
import android.app.Application;
import android.content.res.Resources;
import android.util.Log;
import java.io.File;
import kim.hsl.plugin.PluginManager;
public class MyApplication extends Application {
    private static final String TAG = "plugin_MyApplication";
    /**
     * 插件资源
     */
    private Resources pluginResources;
    @Override
    public void onCreate() {
        super.onCreate();
        // 如果已经存在文件, 先删除 , 防止拷贝过程中出错
        File pluginFile = new File(getFilesDir() + "/plugin.apk");
        if (pluginFile.exists()){
            pluginFile.delete();
        }
        // 先将 assets 中的插件包拷贝到 内置存储中
        CommandUtils.copyAssets2File(
                this,
                "plugin.apk",
                getFilesDir() + "/plugin.apk");
        // 将文件从 assets/plugin.apk 拷贝到 /data/user/0/com.example.plugin_hook/files/plugin.apk
        Log.i(TAG, "将文件从 assets/plugin.apk 拷贝到 " + getFilesDir() + "/plugin.apk");
        // 初始化插件包
        PluginManager.getInstance(this).init();
        Log.i(TAG, "插件化 初始化完毕");
        // 设置插件包中的资源文件
        pluginResources = PluginManager.getInstance(this).getmResources();
    }
    @Override
    public Resources getResources() {
        if (pluginResources != null)
            return pluginResources;
        return super.getResources();
    }
}







三、插件 Activity 组件中设置插件资源


在 Activity 中重写 public Resources getResources() 方法 , 核心是返回插件资源 ;


   

@Override
    public Resources getResources() {
        if (getApplication() != null && getApplication().getResources() != null) {
            return getApplication().getResources();
        }
        return super.getResources();
    }


完整代码示例 :


package com.example.plugin;
import androidx.appcompat.app.AppCompatActivity;
import android.app.Activity;
import android.content.res.Resources;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
    private static final String TAG = "plugin_MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i("plugin", "启动了插件 Activity");
    }
    public void log(){
        Log.i(TAG, "Plugin MainActivity");
    }
    @Override
    public Resources getResources() {
        if (getApplication() != null && getApplication().getResources() != null) {
            return getApplication().getResources();
        }
        return super.getResources();
    }
}




上一篇:新型智慧城市需新信息体系支撑


下一篇:Hadoop Hive概念学习系列之HiveQL编译基础(十)