Android插件化开发之OpenAtlas插件启动方式与插件启动广播

到现在为止已经写了6篇文章了

  • Android插件化开发之OpenAtlas初体验
  • Android插件化开发之OpenAtlas生成插件信息列表
  • Android插件化开发之OpenAtlas资源打包工具补丁aapt的编译
  • Android插件化开发之OpenAtlas插件适配
  • Android插件化开发之解决OpenAtlas组件在宿主的注册问题
  • Android插件化开发之OpenAtlas中四大组件与Application功能的验证

这篇文章主要介绍一下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下来看看就好了。

  • https://github.com/lizhangqu/OpenAtlasDemo

你可能感兴趣的:(android,插件化,启动方式,启动广播,OpenAtlas)