我基于ABI而不是密度分割我的应用程序,如下所示:
splits { abi { enable true reset() include 'x86','armeabi','armeabi-v7a','mips','arm64-v8a' universalApk true } }
我有多种口味和2种构建类型(调试和发布).我想把通用的apk文件放在面料测试版上,该文件包含适用于所有平台的原生库.据我所知,这是通过ext.betaDistributionApkFilePath属性支持的.
我可以在buildType级别或者在flavor级别定义它.问题是我需要构建类型和风格来获取我的变体 – 这样的事情:
android.applicationVariants.all { variant -> variant.ext.betaDistributionApkFilePath = "${buildDir}/outputs/apk/app-${variant.productFlavors[0].name}-universal-${variant.buildType.name}.apk" }
要么
gradle.taskGraph.beforeTask { Task task -> if(task.name ==~ /crashlyticsUploadDistribution.*/) { System.out.println("task name: ${task.name}"); android.applicationVariants.all { variant -> System.out.println("match: crashlyticsUploadDistribution${variant.name}"); if(task.name ==~ /(?i)crashlyticsUploadDistribution${variant.name}/){ ext.betaDistributionApkFilePath = "${buildDir}/outputs/apk/app-${variant.productFlavors[0].name}-universal-${variant.buildType.name}.apk" System.out.println(ext.betaDistributionApkFilePath); } } }
不幸的是,这似乎不起作用 – 目前有没有办法做到这一点?
解决方法
对于每个现有变体,您可以添加将在Crashlytics任务之前执行的操作,并根据变体名称设置ext.betaDistributionApkFilePath.这就是它的样子:
android.applicationVariants.all { variant -> variant.outputs.each { output -> // Filter is null for universal APKs. def filter = output.getFilter(com.android.build.OutputFile.ABI) if (filter == null) { tasks.findAll { it.name.startsWith( "crashlyticsUploadDistribution${variant.name.capitalize()}") }.each { it.doFirst { ext.betaDistributionApkFilePath = output.outputFile.absolutePath } } tasks.findAll { it.name.startsWith( "crashlyticsUploadSymbols${variant.name.capitalize()}") }.each { it.doFirst { ext.betaDistributionApkFilePath = output.outputFile.absolutePath } } } } }