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(); } }