插件开发的概念
对于一个功能特别多,代码量特别大的App(比如支付宝,360卫士等)来说,如果把所有的功能和代码都写在一个app,那么会造成如下问题:
稍微改动一个模块的一点代码都要编译整个工程,耗时耗力;
公共资源、业务、模块混在一起耦合度太高;
不方便测试;
造成app体积过大,用户下载体验差
那么插件式开发就是为了解决这个问题的。总结一下,插件开发就是指在一个app中只完成基础和主要功能模块,对于其他可选的功能模块采用安装下载插件的方式实现。比如360手机助手将硬件加速,WIFI热点等功能做成了插件,如果用户需要,再下载安装即可。
通常来讲,一个插件就是一个完成了某个功能模块的app。那么安装一个插件,就是指安装一个具有该功能模块的apk文件。
插件开发的解决方案
目前的插件开发解决方案主要有:
360的DroidPlugin,dynamic-load-apk,携程的DynamicAPK 等等。
其中360的DroidPlugin框架最稳定,最易用。我们先运行其Demo查看一下效果。
使用DroidPlugin的步骤如下:
创建module,依赖DroidPlugin库:
compile project(':Libraries:DroidPlugin')
在Application中初始化DroidPlugin:
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
PluginHelper.getInstance().applicationOnCreate(getBaseContext());
}
@Override
protected void attachBaseContext(Context base) {
PluginHelper.getInstance().applicationAttachBaseContext(base);
super.attachBaseContext(base);
}
}
编写代码,实现安装插件功能:
public void installNet(View v){
String filepath = Environment.getExternalStorageDirectory()+"/app-minifyEnabled.apk";
try {
PluginManager.getInstance().installPackage(filepath, 0);
Log.e(TAG, "installNet: 插件安装成功!");
} catch (RemoteException e) {
e.printStackTrace();
}
}
编写代码,实现启动插件功能:
public void lanchPlugin(View v){
PackageManager pm = getPackageManager();
Intent intent = pm.getLaunchIntentForPackage("com.itheima.appthin98");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
插件开发总结:
目前插件开发,只需了解大概流程和相关框架即可。它只适用于功能模块特别繁多的大厂产品,比如支付宝等。我们精力有限,显示先了解这些东西,重点掌握多渠道打包和增量更新等技术。