Android插件化之VirtualAPK框架初试

作者: 键盘上的麒麟臂 | 来源:发表于2018-11-16 16:49 被阅读12次

    因为需求要做插件化,所以写篇文章写个小demo来记录一下,这篇文章只是写个demo,而不做总结和讲解。

    一.前言

    1.什么是插件化,网上很大大佬有很好的解释,这里我不重复,简单来说就是要一个apk加载另一个apk的内容。

    主apk我们成为宿主,被加载内容的apk我们称为插件

    2.为什么使用VirtualAPK

    关于插件化有很多方案和框架可以使用,至于我为什么选择VirtualAPK,主要有两点原因:
    (1)这个框架目前还在维护
    (2)接入方便,文档清晰

    3.框架地址

    https://github.com/didi/VirtualAPK

    二.写Demo接入VirtualAPK

    要接入VirtualAPK,我们要跟着文档走,打开连接地址,然后点开wiki,上面会有接入的流程。
    注意:不管用什么框架,最好的文档都是官方的文档,就算在接入过程有问题也应该先去找Issues有没有相应的贴,实在没有才用搜索引擎去搜索问题。

    读过这个框架之后我们知道要做两个项目,一个是宿主项目,一个是插件项目。那我用AS开发的话可以写一个工程然后两个module,这边比较方便管理


    我这里宿主就是:app模块,插件就是:plugintest模块

    在 README.md中有写导入过程



    跟着做,我们在:app模块中配置
    (1)最外层gradle加入virtualapk

    buildscript {
        
        repositories {
            google()
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:3.0.0'
            classpath 'com.didi.virtualapk:gradle:0.9.8.6'
    
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
    }
    

    (2)在app模块的gradle中加入插件和依赖


    到这里宿主apk就已经配好了,简直方便啊。然后再来配置插件的gradle


    (3)在plugintest模块的gradle中加入插件和依赖


    这样就配置好了,这插件简直是方便,比起我当时用微信的Timer,配置方便太多。
    可能有些朋友不是很熟gradle,我多啰嗦两句
    virtualApk{}是插件com.didi.virtualapk.plugin的配置,就像我们默认生成的android{}是com.android.application插件的配置。
    (1)packgeId是有一个范围的,好像是2到多少的我忘了
    (2)targetHost是宿主工程的路径,因为插件要获取宿主工程的内容,所以要给个路径给插件,反正就指导宿主的app文件夹下。
    2.初始化插件

    配置完成之后,我们需要在宿主工程,也就是我的:app模块做插件的初始化


    跟着文档做就行,先在application初始化



    然后加载插件,要在哪里加载插件,这就要看你需要在哪里使用插件的内容,加载插件就是加载你存储中的apk



    这里我插件apk要放在../Android/包名/test 文件夹下, apk要改名成pluginTest.apk
    3.导出插件apk

    配置好并初始化好之后我们就可以先导出插件apk,再把插件apk放到上面的文件夹中,再运行宿主app就行。
    这里需要注意一点,这是我踩的坑,你不能给你的布局使用activity_main.xml这个名称,不然导出插件会不正确,我是在Issues看到的,所以说出现问题先去找Issues

    那么要怎么导出插件apk呢,前提是你先要build一下宿主apk,然后再用命令行来打包插件apk,每次,和打jar包一样,用命令打就行。

    打开项目的wiki


    因为我是windows操作系统哈,所以输入命令 gradlew clean assembleRelease --stacktrace

    如果有配置上的错误的话,会打印出来,但是肯定不会打印很详细,所以有问题的话还是要靠一点经验。
    能正常打包的话



    会在build内生成一个文件夹plugin,说道这里就又要再多啰嗦一句,这个命令打出来的包是正式包,所以在配置gradle时记得写签名

    最后把这个apk改名放到这个文件夹里就可以了

    这样我们就完成了一个简单的VirtualAPK框架的demo,不得不说这个框架使用起来非常方便,当然别看现在做的这么顺利,其实到实际开发的时候肯定会遇到坑的。所以有一个良好的阅读文档的习惯是非常重要的。

    三.最后贴我宿主项目的代码吧

    也就做了一个跳转的操作,跳转的activity是插件的activity

    public class OneActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_one);
            initPlugin();
            initView();
        }
    
        /**
         *  加载插件
         */
        private void initPlugin(){
            PluginManager pluginManager = PluginManager.getInstance(this);
            File file = new File(getExternalFilesDir("test"),"pluginTest.apk");
            if (file.exists()){
                try {
                    pluginManager.loadPlugin(file);
                }catch (Exception e){
    
                }
            }
        }
    
        private void initView(){
            Button btn = (Button) findViewById(R.id.btn);
            btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent();
                    intent.setClassName("com.example.plugin.plugintest","com.example.plugin.plugintest.TwoActivity");
                    startActivity(intent);
                }
            });
        }
    
    }
    

    相关文章

      网友评论

        本文标题:Android插件化之VirtualAPK框架初试

        本文链接:https://www.haomeiwen.com/subject/fjjyfqtx.html