【问题标题】:Fabric Beta and APK splitsFabric Beta 和 APK 拆分
【发布时间】:2015-11-02 22:31:51
【问题描述】:

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

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

我有多种风格和 2 种构建类型(调试和发布)。我想将具有适用于所有平台的本机库的通用 apk 文件放在 fabric beta 上。据我了解,这是通过 ext.betaDistributionApkFilePath 属性支持的。

我可以在 buildType 级别或风味级别定义它。问题是我需要构建类型和风格来选择我的变体 - 像这样:

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 文件,然后退出。
  • 谢谢马克,只要知道通用 APK 的路径,这应该可以工作。构建时该路径是否正确填充?
  • 如果我在配置中硬编码 ext.betaDistributionApkFilePath,没有变量,它会找到通用 apk 文件就好了,例如ext.betaDistributionApkFilePath="app/build/outputs/apk/app-flavor1-universal-debug.apk"。我要做的是根据构建风格(lite/pro)和构建类型(发布/调试)动态设置该路径。每个构建风格和类型组合都有一个唯一的 applicationId。
  • 如果我在构建风格中设置 ext.betaDistributionApkFilePath,我可以使用变量引用风格名称,但我无法设置构建类型。如果我在 buildTypes 中设置变量,我可以将构建类型作为变量引用,但不能将风味名称作为变量引用。
  • 名称的 productFlavor 部分不正确,但已在上面修复。 System.out.println() 指向一个存在的路径 - 似乎与上传任务无关。

标签: android android-gradle-plugin crashlytics crashlytics-beta crashlytics-android


【解决方案1】:

对于每个现有变体,您可以添加将在 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 时找不到该任务
  • 此任务是在您使用 Crashlytics NDK 时创建的。我在一年前写了这段代码,所以现在我不确定它是否真的有必要。您可以放下这部分并检查它是否有效。
  • 我最终采取了不同的路线,但从我的测试来看,我认为现在可能是无关紧要的。感谢您的快速响应!
猜你喜欢
  • 2017-11-22
  • 1970-01-01
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
  • 2018-01-25
  • 2017-12-05
  • 1970-01-01
  • 2019-03-24
相关资源
最近更新 更多