安卓应用插件化:
为了减小安卓应用单个包的大小,方便应用功能的动态更新、变动,需要对应用进行分解。
将一个功能众多的应用分解为: 一个主应用外壳 + n个功能插件
(1)主应用外壳提供给用户安装,在使用时可根据用户操作加载插件,执行特定功能。
(2)功能插件可在应用发布后,动态变动更新(而无需重装应用。留存用户、动态修改功能)
支付宝、微信等都是插件化的应用。
应用插件化示例:(扫码安装)
应用插件化简易实现:
根据插件原理将apk拆解为,apk应用壳 + n个功能apk插件
(1)apk插件制作:
1、在libs中,添加BaseActivity.jar (下载)
2、修改应用内所有Activity继承自BaseActivity
3、生成插件:编译生成apk,即可作为插件使用(是独立应用,也是插件)
/** 插件应用主Activity */
// public class MainActivity extends Ativity
public class MainActivity extends BaseActivity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
...
.
.
}
(2)apk主应用壳制作: (从应用壳中启动任意插件)
1、在libs中,添加EmptyActivity.jar (下载)
2、Manifest.xml中,添加<activity android:name="sci.apk.plugin.EmptyActivity" />
3、启动插件:EmptyActivity.ShowPlugin(this, apkPath);
public class MainActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.empty_activity_main);
}
public void OpenPlugin(View view)
{
String apkPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/backups/apps/AndroidPlugin_plugin1.apk";
if(!new File(apkPath).exists()) Toast.makeText(this, "插件不存在!", Toast.LENGTH_SHORT).show();
else
{
EmptyActivity.ShowPlugin(this, apkPath); // 启动插件
// EmptyActivity.Show(this, apkPath, "com.ltsdk.showdebug.MainActivity"); // 通过EmptyActivity执行插件apk指定Activity的功能
}
}
}
<application
android:allowBackup="true"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:icon="@drawable/empty_ic_launcher" >
<activity
android:name="com.app.empty_shell.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 通过EmptyActivity展示任意插件Activity -->
<activity android:name="sci.apk.plugin.EmptyActivity" />
</application>
应用插件化实现原理:
1、在apk主应用壳中,提供一个空壳 EmptyActivity,用于展示插件中的界面。该Activity封装了Activity的生命周期函数,根据传入的Activity参数信息,去插件apk中加载对应的类、资源等,提取插件逻辑在EmptyActivity中进行展示和执行。
2、插件apk,为了能在壳应用中展示,需要对所有的Activity功能逻辑进行统一的封装。BaseActivity是对功能逻辑进行插件化封装转接的类。
插件Activity继承自此BaseActivity,在需要资源和执行逻辑时,通过BaseActivity中提供的接口,转接至壳应用的EmptyActivity进行展示和执行;壳EmptyAcitivity在执行生命周期函数以及其它函数逻辑更新时。通过反射获取BaseActivity中的函数接口,执行逻辑。