Fabric Beta和APK分割

7

我根据ABI而不是密度来拆分我的应用程序,如下所示:

    splits {
       abi {
           enable true
           reset()
           include 'x86', 'armeabi', 'armeabi-v7a', 'mips', 'arm64-v8a'
           universalApk true
       }
    }

我有多种口味以及2种构建类型(debug和release)。我想将包含所有平台本地库的通用apk文件上传到fabric beta。据我了解,这可以通过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);
       }
   }
}

很遗憾,目前似乎无法实现这个功能 - 现在有没有其他的方法?

这个行为就像没有定义变量一样 - 警告我有多个apk文件,然后退出。 - Mark
谢谢Mark,只要通用APK的路径已知,这应该可以正常工作。在构建时,该路径是否被正确填充? - Mike Bonnell
如果我在配置中硬编码ext.betaDistributionApkFilePath而没有使用变量,那么它会很好地找到通用APK文件,例如:ext.betaDistributionApkFilePath="app/build/outputs/apk/app-flavor1-universal-debug.apk"。 我正在尝试根据构建flavor(lite/pro)和构建类型(release/debug)动态设置该路径。 每个构建flavor和类型组合都有一个唯一的applicationId。 - Mark
如果我在构建风味中设置ext.betaDistributionApkFilePath,我可以使用变量引用风味名称,但无法设置构建类型。如果我在buildTypes中设置变量,我可以使用变量引用构建类型,但无法引用风味名称作为变量。 - Mark
名称中的productFlavor部分不正确,但已在上面进行了修正。而System.out.println()指向的路径是存在的——似乎对上传任务没有影响。 - Mark
显示剩余2条评论
1个回答

8

对于每个现有的变体,您可以添加一个在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
        }
      }
    }
  }
}

为什么需要crashlyticsUploadSymbols?当我运行 ./gradlew tasks --all 时,找不到这个任务。 - Forrest Bice
当您使用Crashlytics NDK时,会创建此任务。我一年前编写了这段代码,现在不确定它是否真的必要。您可以删除此部分并检查其是否起作用。 - Michael
我最终采取了不同的方法,但从我的测试结果来看,我认为现在可能是多余的。感谢您的快速回复! - Forrest Bice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接