标签:android openatlas 插件化 启动方式 启动广播
到现在为止已经写了6篇文章了
这篇文章主要介绍一下OpenAtlas插件的几种启动方式,在AtlasConfig这个类中,有几个静态字符串数组
public class AtlasConfig {
public static String[] DELAY = new String[]{};
public static String[] AUTO = new String[]{};
public static String[] STORE = new String[]{};
}
也就是OpenAtlas的插件的启动的三种方式,DELAY 为延时加载,即用到的时候才会去加载。AUTO 为随宿主启动而启动,而STORE看名字还不知道他的启动方式是怎么样的。我们看下什么地方引用了它,其实整个框架中就两个函数引用了它,在OptDexProcess类中
/**** 对已安装并且安装方式为STORE的Bundle进行dexopt操作 ****/
private void optStoreDex() {
for (Bundle bundle : Atlas.getInstance().getBundles()) {
if (!(bundle == null || contains(AtlasConfig.STORE, bundle.getLocation()))) {
try {
((BundleImpl) bundle).optDexFile();
Log.e("OptDexProcess", "optStoreDex");
} catch (Throwable e) {
if (e instanceof DexLoadException) {
throw ((RuntimeException) e);
}
Log.e("OptDexProcess", "Error while dexopt >>>", e);
}
}
}
}
/**** 对全部安装方式为Store的Bundle进行dexopt操作 ***/
private void optStoreDex2() {
for (String bundle : AtlasConfig.STORE) {
Bundle bundle2 = Atlas.getInstance().getBundle(bundle);
if (bundle2 != null) {
try {
((BundleImpl) bundle2).optDexFile();
Log.e("OptDexProcess", "optStoreDex2");
} catch (Throwable e) {
if (e instanceof DexLoadException) {
throw ((RuntimeException) e);
}
Log.e("OptDexProcess", "Error while dexopt >>>", e);
}
}
}
}
看函数好像是对dex继续优化。
在Android系统中,一个App的所有代码都在一个Dex文件里面。Dex是一个类似Jar的存
储了多有Java编译字节码的归档文件。因为Android系统使用Dalvik虚拟机,所以需要把
使用Java Compiler编译之后的class文件转换成Dalvik能够执行的class文件。这里需要强
调的是,Dex和Jar一样是一个归档文件,里面仍然是Java代码对应的字节码文件。
当Android系统启动一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的
工具来处理,叫DexOpt。DexOpt的执行过程是在第一次加载Dex文件的时候执行的。这
个过程会生成一个ODEX文件,即Optimised Dex。执行ODex的效率会比直接执行Dex文
件的效率要高很多。
但是呢,我在里面加入了日志,看输出,仍然看不到其输出,只有随宿主启动的才会进行odex优化,配置了STORE,也看不到优化的日志输出,这里姑且不去理会,也可能是我使用的方式不对,一般我们使用DELAY或者AUTO即可。我们对之前的几个插件进行配置。让test随宿主启动,让zxing延时加载,其他几个为STORE(其实在效果上和DELAY差不多,只不过可能内部真的进行了odex优化,然而我看不到日志输出而已),配置的位置呢,在我们宿主的Applictaion中即可,使用静态代码块。
public class BootApp extends AtlasApp {
static{
AtlasConfig.DELAY = new String[]{"com.lizhangqu.zxing"};
AtlasConfig.AUTO = new String[]{"com.lizhangqu.test"};
AtlasConfig.STORE = new String[]{"com.lizhangqu.fragment","com.lizhangqu.component"};
}
@Override
public void onCreate() {
super.onCreate();
}
}
下面的插件启动的日志输出。随宿主启动的插件
延时加载的插件,只要启动了它才会被加载。
还有一个重要的问题就是插件如果随宿主启动,我们要知道插件是否安装成功。安装成功后进行页面跳转。而插件只需要安装一次,安装完后就可直接启动了。这里OpenAtlas提供了一个广播,当插件安装完成后会广播该消息。我们注册该广播即可。
public class BootActivity extends Activity {
private BundlesInstallBroadcastReceiver atlasBroadCast;
private class BundlesInstallBroadcastReceiver extends BroadcastReceiver {
private BundlesInstallBroadcastReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
try {
startActivity(new Intent(BootActivity.this,MainActivity.class));
BootActivity.this.finish();
Log.e("TAG","BundlesInstallBroadcastReceiver,the bundle has install");
} catch (Exception e) {
}
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_boot);
if ("false".equals(System.getProperty("BUNDLES_INSTALLED", "false"))) {
this.atlasBroadCast = new BundlesInstallBroadcastReceiver();
registerReceiver(this.atlasBroadCast, new IntentFilter(PlatformConfigure.ACTION_BROADCAST_BUNDLES_INSTALLED));
}else{
startActivity(new Intent(BootActivity.this,MainActivity.class));
BootActivity.this.finish();
}
}
}
就这样,可以监听到插件的安装,当时该广播只有安装插件的时候会广播,安装成功后之后就不会再进行广播了,使用的时候注意一下就好了。
源代码,就不传csdn,放在github上,有兴趣的clone下来看看就好了。
版权声明:本文为博主原创文章,未经博主允许不得转载。
Android插件化开发之OpenAtlas插件启动方式与插件启动广播
标签:android openatlas 插件化 启动方式 启动广播
原文地址:http://blog.csdn.net/sbsujjbcy/article/details/47975677