2016-03-15 31 views
6

我正面临着这个似乎无法解决的问题。这里是场景:针对具有ABI分割的特定体系结构的Gradle依赖关系

Im建筑apk使用gradle依赖关系和这个依赖关系是特定的体系结构所以对于x86的x86我需要不同的依赖关系和不同的手臂。

我的产品口味解决它:

productFlavors { 

    dev { ... } 
    develx86 { ... } 
    production { ... } 
    productionx86 { ... } 

} 

于是我这样定义的依赖性:

develCompile 'dependency_for_arm' 
develx86Compile 'dependency_for_x86' 

这工作不错。但最近我不得不在我的应用程序中添加一个renderscript的用法。我做了这样:

renderscriptTargetApi 22 
renderscriptSupportModeEnabled true 

并在此之后,当我上传到谷歌的apk发挥它说,它的APK是适合与ARM,X86。我不知道这是可能的。正如你可以认为它会在具有不同CPU的设备上崩溃(如果我为arm生成apk并且用户将在x86应用程序上执行它将崩溃)。

所以我decited使用ABI分裂:

splits { 
     abi { 
      enable true 
      reset() 
      include 'armeabi', 'x86' 
      universalApk false 
     } 
    } 

//Ensures architecture specific APKs have a higher version code 
//(otherwise an x86 build would end up using the arm build, which x86 devices can run) 
ext.versionCodes = [armeabi:0, x86:1] 

import com.android.build.OutputFile 

android.applicationVariants.all { variant -> 
    // assign different version code for each output 
    variant.outputs.each { output -> 
     int abiVersionCode = project.ext.versionCodes.get(output.getFilter(OutputFile.ABI)) ?: 0 
     output.versionCodeOverride = android.defaultConfig.versionCode + abiVersionCode 
    } 

但现在,当我看到生成APK文件,我的依赖性是当我打开部分风味特异没有纳入APK和APK会崩溃它使用来自这个依赖关系的API。

有人知道如何解决这个问题吗?或者有人知道为什么Google Play会说当我包含renderscript时apk同时适用于两种体系结构? (没有它,它正常工作,但我需要renderscript)。

谢谢你的时间。我会感谢任何帮助。

+0

任何运气?如果你找到答案,请发布答案 –

回答

0

对不起,我现在还不能评论内联。

什么是在apk中,特别是在res/raw /和lib /? 另外,你使用gradle-plugin 2.1.0吗? (因为您使用的是renderscriptTargetApi 22),您是否尝试过构建工具23.0.3?

2

如果你看看你的APK里面,lib文件夹,你应该看到,renderscript支持模式为其他体系结构添加了库,而不是你支持的那个。

您可以使用ABI特定的口味保持您的早期配置。 但为了确保其他架构没有库都包括在内,尝试添加abiFilters到您的口味:

productFlavors { 

    dev { ... ndk.abiFilters 'armeabi-v7a' } 
    develx86 { ... ndk.abiFilters 'x86' } 
    production { ... ndk.abiFilters 'armeabi-v7a' } 
    productionx86 { ... ndk.abiFilters 'x86' } 

} 
+0

谢谢你,我会尽力让你知道。 – Sajmon