当前位置:   article > 正文

VirtualAPK初探_virtualapk please add it in the host app as well.

virtualapk please add it in the host app as well.

关于Virtual APK 的集成


1、简介

是滴滴2017年6月3号开源,框架功能完备,支持 Android 四大组件,良好的兼容性,且入侵性较低,作为加载耦合插件方案是较好选择

主要分为宿主程序 以及插件,下面是集成的步骤 
  • 1
  • 2
  • 3

2、集成步骤

首先创建宿主程序:(主要的apk)

宿主程序的集成

1.在工程的build.gradle 中添加插件
     dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
        classpath 'com.didi.virtualapk:gradle:0.9.4'
·   }
  • 1
  • 2
  • 3
  • 4
2.在宿主的主工程中,应用插件,并导入工程
    apply plugin: 'com.didi.virtualapk.host'
    android {
        compileSdkVersion 26
        buildToolsVersion '25.0.2'
            defaultConfig {
                 .......
            }
            buildTypes {
             ....
             }
        }

        dependencies {
        ......
        compile 'com.didi.virtualapk:core:0.9.1'
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

说明
gridle版本建议应用2.3.3 太高了有问题;

3.在宿主的Application中重写attachBaseContext方法:
      protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        PluginManager.getInstance(base).init();
      }
  • 1
  • 2
  • 3
  • 4
4.要调用插件的页面activity 中:
    class MainActivity : AppCompatActivity(), View.OnClickListener {

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            loading.setOnClickListener(this)
            var cpuArch: String
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
                cpuArch = Build.SUPPORTED_ABIS[0]
            } else {
                cpuArch = Build.CPU_ABI
            }
            Log.d("ryg", "onCreate cpu arch is " + cpuArch)
            loadPlugin(this)
        }


        //加载插件
        override fun onClick(v: View?) {
            val pkg = "com.lishu.pluginproject"
            if (PluginManager.getInstance(this).getLoadedPlugin(pkg) == null) {
                Toast.makeText(this, "plugin ${pkg} not loaded", Toast.LENGTH_SHORT).show()
                return
            }
            // test Activity and Service
            val intent = Intent()
            intent.setClassName(this, "com.lishu.pluginproject.SecondActivity")
            startActivity(intent)
        }


        fun loadPlugin(base: Context) {
            val pluginManager = PluginManager.getInstance(base)
            val apk = File(Environment.getExternalStorageDirectory(), "my.apk")
            if (apk.exists()) {
                try {
                    pluginManager.loadPlugin(apk)
                } catch (e: Exception) {
                    e.printStackTrace()
                }
            }
        }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

到此,关于宿主程序的简单初始化,就结束了

插件的集成:

1、同样在插件的工程build.gradle中添加插件
dependencies {
    classpath 'com.android.tools.build:gradle:2.3.3'
    classpath 'com.didi.virtualapk:gradle:0.9.4'
}
  • 1
  • 2
  • 3
  • 4
2、 在工程中应用插件
apply plugin: 'com.didi.virtualapk.plugin'
  • 1

到这一步,插件工程也初步的集成成功;

3、安装Demo 并运行

1、首先在手机上安装上宿主程序

2、然后再插件中,用命令 gradlew clean assemblePlugin 打包成插件;

    A problem occurred configuring project ':app'.
    > Can't find ..\MyVirtualApk2\app\build\VAHost\versions.txt, please check up your host application
      need apply com.didi.virtualapk.host in build.gradle of host application
有可能会遇到这样的问题,这个时候,我们要先编译下 宿主程序   ,然后再运行打包插件的命令
  • 1
  • 2
  • 3
  • 4

3、应用 adb push 命令吧插件放到,sdcard 中;

    首先找插件app的build 目录:
    \outputs\apk\app-release-unsigned.apk 
    实例命令: adb push app-release-unsigned.apk  /sdcard/my.apk
    注意:这个命令是进入到apk 目录后直接执行的;
  • 1
  • 2
  • 3
  • 4

然后启动宿主程序,就可以了;

//现在有着兼容性的问题bug;;;;

E:\demo\PluginProject\app\build\generated\source\r\release\android\support\design\R.java:1459: 错误: 不兼容的类型: <空值>无法转换为int
public static final int[] AppBarLayout = { null, null, null, 0x7f010048, 0x6f010011 };

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/861107
推荐阅读
相关标签
  

闽ICP备14008679号