Skip to content

常见问题解答

superq_sky edited this page Mar 13, 2019 · 34 revisions

请尽快更新至 最新版本 ,老版本将不再维护。

在 dev 分支持续开发尝鲜版,包含新特性并修复部分遗留bug,请关注并试用。

官方交流QQ群:656602897。提问前请先查阅右侧导航中的相关文章,大多数常见问题都可直接找到解决方案

如果你们的产品采用了VirtualAPK,请告知我们。

The directory of host application doesn't exist!

PluginDemo renyugang$ gradle clean assemblePlugin
Incremental java compilation is an incubating feature.

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':app'.
> The directory of host application doesn't exist!

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

错误分析:宿主工程的application模块的路径不存在,一般是指路径配错了

解决方式:

virtualApk {
    packageId = 0x6f
    targetHost = '../../VirtualAPK/app' // 检测这个路径是否正确,相对路径或者绝对路径都行
    applyHostMapping = true
}

java.lang.ArrayIndexOutOfBoundsException: 2

PluginDemo renyugang$ gradle clean assemblePlugin
Caused by: java.lang.ArrayIndexOutOfBoundsException: 2
at com.didi.virtualapk.VAPlugin$_pickSplitEntries_closure8.doCall(VAPlug
in.groovy:188)
at com.didi.virtualapk.VAPlugin.pickSplitEntries(VAPlugin.groovy:186)
at com.didi.virtualapk.VAPlugin$_apply_closure1$_closure16.doCall(VAPlug
in.groovy:66)
at com.didi.virtualapk.VAPlugin$_apply_closure1.doCall(VAPlugin.groovy:5
2)
at org.gradle.listener.ClosureBackedMethodInvocationDispatch.dispatch(Cl
osureBackedMethodInvocationDispatch.java:40)
at org.gradle.listener.ClosureBackedMethodInvocationDispatch.dispatch(Cl
osureBackedMethodInvocationDispatch.java:25)

BUILD FAILED

错误分析:请检查dependencies中aar的依赖方式

解决方式: 按如下建议修改

dependencies {
    √ compile 'com.didi.virtualapk:core:0.9.0'
    √ compile project (":CoreLibrary")

    // group和version字段必须有
    √ compile(group:'test', name:'CoreLibrary-release', version:'0.1', ext:'aar')

    × releaseCompile 'com.didi.virtualapk:core:0.9.0'
    × compile(name:'CoreLibrary-release', ext:'aar')
}

编译插件时空指针

ResourceMerger### don't have any retained resources
:app:processShanghaiReleaseResources FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:processShanghaiReleaseResources'.
> Cannot invoke method getAt() on null object

解决方式:请确保插件中至少有一个自己的资源

插件的activity能正常打开,但是插件中的资源读取失败

解决方式:依次检查:

  1. 先检查 packageId 的取值范围(在下面)是否正确
  2. 再检查插件依赖的所有com.android.support包在宿主都有显式依赖,并且版本和宿主保持一致
  3. 读取失败的资源id是否和宿主的资源重名,重名资源会在构建插件包时被自动剔除

Failed to notify project evaluation listener

* What went wrong:
A problem occurred configuring project ':app'.
> Failed to notify project evaluation listener.
   > com/android/builder/dependency/ManifestDependency

解决方式:修改Gradle和build tools的版本,与demo保持一致。JDK使用8.0。

java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity

解决方式:构建插件请使用gradle assemblePlugin,而不能直接通过AndroidStudio run出来一个插件apk。

关于Android M及以上版本SD卡的访问权限问题

从Android 6.0开始,系统采用了新的权限机制,为了保证插件的加载,请保证APP具有SD卡的访问权限。如果你的app没有在android 6.0上做足够的测试,请不要设置targetSdk为23。

关于Android M及以上版本动态申请权限问题

从Android 6.0开始,系统采用了新的权限机制,但是暂时不支持在插件中动态申请权限。

插件的gradle文件中对于packageID设置有什么范围吗?

  • 采用正常的android资源命名方式,PPTTNNNN:PackageId + TypeId + EntryId。
  • 运行时获取资源需要通过packageId来映射apk中的资源文件,不同apk的packageId值不能相同,所以插件的packageId范围是介于系统应用(0x01,0x02,...具体占用多少值视系统而定)和宿主(0x7F)之间。
  • 多个插件的packageId和packageName一样,在宿主中需要确保是唯一的。

生成的插件apk中会发现有些png图片是黑色的,大小为0,这是怎么回事?

为了减小包的大小对于那些没有引用的资源进行压缩了,在gradle中配置shrinkResources true即可,位置和minifyEnabled true一起。

关于Activity的configchanges

因为configChanges的选项组合太多,坑位比较多,这个暂时不准备支持 因为在日常使用的时候就横竖常用。

iR是什么意思?

install Release ,gradle中的一种小驼峰命名的缩写方式。如果发现冲突,可以通过assembleRelease来实现构建宿主工程。

0.9.1版本的VirtualAPK构建插件在构建插件的时候assets目录下的文件会被删除

这是0.9.1版本的bug,更高版本已经修复,请更新版本。

宿主和插件同时依赖公共的本地jar文件或library module,支持在构建插件时自动剔除吗?

不支持。构建插件的依赖自动剔除功能仅支持内容稳定不变,路径稳定的资源,而本地的jar或其它资源的路径和内容都是可变更的,因此无法直接自动剔除,如果需要剔除,请将资源打包导出部署到maven或其它依赖管理服务器。如果资源不可公开发布,可在内网部署私有maven服务。

java.lang.UnsatisfiedLinkError: dlopen failed:

 java.lang.UnsatisfiedLinkError: dlopen failed: "/data/data/com.xxx.plugin/app_valibs/libxxx.so" is 32-bit instead of 64-bit
        at java.lang.Runtime.loadLibrary0(Runtime.java:1016)
        at java.lang.System.loadLibrary(System.java:1669)
        at ...

插件安装使用so的abi必须与宿主保持一致,而宿主的abi类型在app安装时根据apk配置确定,并不再改变。请按以下步骤检查项目配置:

  1. 宿主apk中未使用so,则按设备默认abi类型安装。如果插件中使用so并报此错误,则需要在宿主中放一个占位的同abi类型so。
  2. 插件中使用的liba.so中直接引用了libb.so导出的符号,需要在加载a.so前显式加载b.so,否则可能会报找不到b.so的错误。详见Android中的System.loadLibrary对于依赖so的加载分析,如:
System.loadLibrary("b");
System.loadLibrary("a");