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下来看看就好了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-26 12:29:46

Android插件化开发之OpenAtlas插件启动方式与插件启动广播的相关文章

Android插件化开发之Hook StartActivity方法

第一步.先爆项目demo照片,代码不多,不要怕 第二步.应该知道Java反射相关知识 如果不知道或者忘记的小伙伴请猛搓这里,Android插件化开发基础之Java反射机制研究 http://blog.csdn.net/u011068702/article/details/49863931 第三步.应该知道Java静态代理知识 如果不知道或者忘记的小伙伴请猛搓这里,Android插件化开发基础之静态代理模式 http://blog.csdn.net/u011068702/article/detai

Android插件化开发之Atlas插件适配

前三篇文章,介绍了OpenAtlas的一些基本用法以及patch的aapt的编译方法. - Android插件化开发之Atlas初体验 - Android插件化开发之Atlas生成插件信息列表 - Android插件化开发之Atlas资源打包工具补丁aapt的编译 OpenAtlas的原则就是避免引入冗余的库.也就是宿主中提供了第三方库后,插件中就不要再引入该库,编译的时候以provided形式提供即可.最简单的例子就是v4,v7兼容库,应该避免引入.为了让我妈的插件脱离OpenAtlas也能独

Android插件化开发之Atlas生成插件信息列表

上一篇文章,[Android插件化开发之Atlas初体验]( http://blog.csdn.net/sbsujjbcy/article/details/47446733),简单的介绍了使用Atlas的整个流程,但是如果你没有实践过的话估计还是一头雾水,从这篇文章开始,慢慢的切入细节.这篇文章的主题是生成插件信息列表. 细心的你或许发现了上篇文章中我们使用了一个叫openatlasbundler的项目生成了so以及一个json文件,说白了这个so只不过就是apk重命名的,而这个json文件中包

Android插件化开发之Atlas初体验

OpenAtlas一款强大的Android非代理动态部署框架,目前已经处于稳定定状态. 与传统的代理方式插件不同,OpenAtlas需要对注册动态部署的组件到manifest文件. 初体验,只不过就是把程序跑起来,跑通,后面的路还很长.这个过程中也是遇到了不少问题,刚开始拿到这个项目真是无处下手(没有看到有wiki),后来百度搜索了下找到四篇博文,大概就是OpenAtlas的作者写的吧 Android OpenAtlas初识 Android OpenAtlas之二 基本结构 OpenAtlas之

Android插件化开发之DexClassLoader动态加载dex、jar小Demo

一.温故动态加载ClassLoader机制 如果对Android的ClassLoader加载机制不熟悉,猛戳Android插件化开发动态加载基础之ClassLoader工作机制 http://blog.csdn.net/u011068702/article/details/53248960 二.介绍 我们知道在Android中可以跟java一样实现动态加载jar,但是Android使用德海Dalvik VM,不能直接加载java打包jar的byte code,需要通过dx工具来优化Dalvik

Androd插件化开发之Atlas资源打包工具补丁aapt的编译

我们先来看看Android Studio自动生成的R文件里的内容,你会发现,R文件里有很多内部类,而内部类里有很多int类型的值,他们都是以0x7f开头. 我们在编译一个Android应用程序的资源的时候,至少会涉及到两个包,其中一个是被引用的系统资源包,另外一个就是当前正在编译的应用程序资源包.每一个包都可以定义自己的资源,同时它也可以引用其它包的资源.那么,一个包是通过什么方式来引用其它包的资源的呢?这就是我们熟悉的资源ID了.资源ID是一个4字节的无符号整数,其中,最高字节表示Packag

Android Studio快速开发之道

概述 现如今开发越来越追求效率和节奏,节省出时间做更多的事情,除了开发技术上的封装等,开发工具的使用技巧也是很重要的,今天就根据自己的经验来给大家介绍一下Android Studio快速开发之道. Postfix completion 介绍 Postfix completion 是IntelliJ IDEA很早就有的功能,该功能基于已经输入的表达式和你添加的后缀来实现另一个你想要的表达式.例如在布尔表达式之后加上后缀if就是if语句 . 常用后缀介绍 下面介绍一下个人工作中觉得比较常用的几个后缀

android控件开发之ListView

android控件开发之ListView 本文主要讲述安卓开发中的ListView控件的使用方法 java代码: package com.example.listview; import java.util.ArrayList; import java.util.HashMap; import android.app.ListActivity; import android.os.Bundle; import android.view.Menu; import android.view.View

android控件开发之progress

android控件开发之progress 本博文主要讲述的是android开发中的progress进度条的使用方法,代码如下: MainActivity.java: package com.example.progress; import android.os.Bundle; import android.R.integer; import android.app.Activity; import android.view.Menu; import android.view.View; impo