VirtualAPK 踩坑实录

VirtualAPK 官网 https://github.com/didi/VirtualAPK

框架接入,四大组件原理分析,资源原理分析,在 wiki 中的第三方技术文章里都有很详细的介绍

VirtualAPK 群号:656602897

我在下载源码 读了两天之后,开始接入

接入中有很多坑,现在一 一描述,希望能给后人一些帮助

首先,这个框架在 2018 年的 9 月算是业内最好的开源框架了,相比于 360 的 DroidPlugin 已经一年多没更新

滴滴仍在维护,已经兼容 android P 是当时最优的选择,接下来就说一下接入的坑

首先是超级巨坑三兄弟:

  1. have you declared this activity in your AndroidManifest.xml
  2. at com.didi.virtualapk.internal.utils.PackageParserCompat.parsePackage(PackageParserCompat.java:46)
  3. Error:Execution failed for task ':app:processDebugResources'.    > Could not get unknown property 'textSymbolOutputDir' for task ':app:processDebugResources' of type com.android.build.gradle.tasks.ProcessAndroidResources.

这三个都是由 gradle 版本以及 框架版本 配置不当导致的

宿主标配:

project build.gradle:

classpath 'com.android.tools.build:gradle:3.0.0'
classpath 'com.didi.virtualapk:gradle:0.9.8.6'

module build.gradle:

apply plugin: 'com.didi.virtualapk.host'
compile "com.didi.virtualapk:core:0.9.8"

gradle-wrapper.properties:
  distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip

下面这个超级超级重要!!!

gradle.properties :

android.useDexArchive=false

 

插件标配:

project build.gradle:

classpath 'com.android.tools.build:gradle:3.0.0'
classpath 'com.didi.virtualapk:gradle:0.9.8.6'

module build.gradle:

apply plugin: 'com.didi.virtualapk.plugin'
virtualApk {
    packageId = 0x6f      // The package id of Resources.
   // targetHost='../host/app' // The path of application module in host project.
    targetHost = '../HostDemo/app'
    applyHostMapping = true      // [Optional] Default value is true.
}

gradle-wrapper.properties:
  distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip

下面这个超级超级重要!!!

gradle.properties :

android.useDexArchive=false

 

按照标配配置完之后,剩下的问题都是打包的小问题了。

另:网上说的 什么插件只能是 2.14.1  gradle 是 2.1.3,那都是历史了,是 框架为 0.9.0 的时候的事

现在都 2018 年了,都 0.9.8.6 了,没那些限制了。

 

第一个坑

这是宿主工程的页面:这是插件单独运行时的页面

这是跳转时,加载插件显示的页面 

现象:1.运行了 Activity 中与资源无关的代码 (Toast),但是没加载资源文件(XML布局依然是宿主的)

            2.还可能报强转型错误。说你插件包中强转型有问题。

解决办法:用 gradle 构建命令生成apk

我是用git构建的 
进入F:\ARWorkSpace\VirualAPKPluginDemo,点击右键Git Bash Here 
输入

./gradlew clean assemblePlugin(这个本人测试通过) 

自己从 studio上面的 build 按钮弄出来的包是不能用的。用就会出现这种状态。

原因: gradle 命令构建会在各插件资源中会打上 0x3f 这个偏移量,自己 build 不会加这个偏移量,故找不到插件资源

virtualApk {
    // 插件资源表中的packageId,需要确保不同插件有不同的packageId.
    packageId = 0x3f

    // 宿主工程application模块的路径,插件的构建需要依赖这个路径
    targetHost = '../VirtualAPKHostDemo/app'

    //默认为true,如果插件有引用宿主的类,那么这个选项可以使得插件和宿主保持混淆一致
    applyHostMapping = true
}

 

坑二:gradle 构建时报错

此为gradle 2.14.1 包有问题,去网上下了一个新的 ,替换了旧的就可以了

下载地址:【http://services.gradle.org/distributions/gradle-2.14.1-all.zip】

替换目录:【Users\user\.gradle\wrapper\dists\gradle-2.14.1-all\ah86jmo43de9lfa8xg9ux3c4h】

 

坑三:多插件时,启动第二个插件闪退。

原因

targetHost = '../VirtualAPKHostDemo/app'

此处设置了,各插件都引用宿主工程的路径

我第二个插件的路径与宿主工程路径不一致,虽然构建成功,但是会闪退

解决办法:将插件二工程,移到主工程文件夹下

 

坑四: 启动插件报错 找不到资源 ID 

原因:1.宿主资源与插件资源名称一样   2.两个插件 资源 ID 的偏移量可能设置成了一样的

 

坑五:启动报错 找不到插件中的jar包 (插件中 project gradle 中没 compile jar 只有 app 的 gradle 中 compile 了 jar)

解决办法:在宿主中 compile 一份即可

 

坑六:插件包为 release 包时,宿主必须也为 release 包

不然会报 Package Manager  Permission 的错误

 

坑七:dataBinding 为 null

插件 databinding 为 null 的,降一个版本 gradle:0.9.8.4,core:0.9.6 之后,就可以用了

 

 

这就是我接入踩的所有的坑了 坑二 感谢 大大的微笑  https://blog.csdn.net/chwshuang/article/details/52261940 

这篇博客替我脱坑,没这篇博客,我可能已经从入门到放弃了

 

我的demo:https://github.com/CD3108/VirtualAPK.git

QQ:781217278@qq.com 标明来意

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值