什么插件化
每一个业务组件都是一个独立的apk,然后通过主app动态加载部署业务组件apk。
插件化好处
- 业务组件解耦,能够实现业务组件热插拔
- 更改产品迭代模式,可分为主app以及次业务app
- 改善产品更新过程,可以在不影响用户的情况下实现业务组件更新以及bug修复
插件化 “思想”
主App被系统 “安装” 调用,这个过程由系统提高,而插件apk并非被系统安装,简而言之,需要将插件apk看成一个 “非apk” 文件,只是一个结构复杂的文件,在主app需要时会调用这个文件的一些资源。调用插件即用某种特殊的方式打开这个文件。
插件化步骤
分析主app
- 主App打包完成后,会形成dex,images,xml资源
- dex靠PathClassLoader加载
- 图片以及xml资源靠Resource加载
代码实现
- 创建DexClassLoader加载插件代码
- 创建Resource加载资源文件
- 管理插件Activity生命周期
项目结构
注:主APP项目运行在手机上,插件APP项目打包成APK,保存到主项目私有目录下,他们都引用连接的library
插件实体对象
package com.shangyi.android.pluginlibrary;
import android.content.pm.PackageInfo;
import android.content.res.AssetManager;
import android.content.res.Resources;
import dalvik.system.DexClassLoader;
/**
* <pre>
* .----.
* _.'__ `.
* .--(Q)(OK)---/$\
* .' @ /$$$\
* : , $$$$$
* `-..__.-' _.-\$/
* `;_: `"'
* .'"""""`.
* /, FLY ,\
* // \\
* `-._______.-'
* ___`. | .'___
* (______|______)
* </pre>
* 包 名 : com.shangyi.android.pluginlibrary
* 作 者 : FLY
* 创建时间 : 2019/5/8
* 描述: 插件apk信息的实体对象
*/
public class PluginApk {
public PackageInfo mPackageInfo;//apk的解析
public DexClassLoader mDexClassLoader;//dex靠PathClassLoader加载
public Resources mResources;// 图片以及xml资源靠Resource加载
public AssetManager mAssetManager;//用于支持创建Resources
public PluginApk(PackageInfo mPackageInfo, DexClassLoader mDexClassLoader, Resources mResources) {
this.mPackageInfo = mPackageInfo;
this.mDexClassLoader = mDexClassLoader;
this.mResources = mResources;
this.mAssetManager = mResources.getAssets();
}
}
插件apk的管理类
package com.shangyi.android.pluginlibrary;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.AssetManager;
import android.content.res.Resources;
import android.util.Log;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import dalvik.system.DexClassLoader;
/**
* <pre>
* .----.
* _.'__ `.
* .--(Q)(OK)---/$\
* .' @ /$$$\
* : , $$$$$
* `-..__.-' _.-\$/
* `;_: `"'
* .'"""""`.
* /, FLY ,\
* // \\
* `-._______.-'
* ___`. | .'___
* (______|______)
* </pre>
* 包 名 : com.shangyi.android.pluginlibrary
* 作 者 : FLY
* 创建时间 : 2019/5/8
* 描述: 插件apk的管理
*/
public class PluginManager {
private static PluginManager instance;
private PluginManager() {
}
public static PluginManager getInstance() {
if (instance == null) {
instance = new PluginManager();
}
return instance;
}
private Context mContext;
private PluginApk mPluginApk;
public void init(Context context) {
this.mContext = context;
}
/**
* 检测是否调用初始化方法