6

我分裂我的應用程序基於ABI,而不是密度,就像這樣:面料Beta版和APK分裂

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

我有多種口味,和2構建類型(debug和release)。我想把通用apk文件放在織物測試版上,它具有適用於所有平臺的本機庫。據我所知,這是通過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); 
     } 
    } 
} 

可惜,這似乎並沒有工作 - 有沒有辦法做到目前呢?

+0

這就像沒有定義變量 - 警告我有關多個apk文件,然後退出。 – Mark

+0

感謝Mark,只要知道通用APK的路徑,就應該開展工作。建築是否正確填充該路徑? –

+0

如果我在配置中對ext.betaDistributionApkFilePath進行硬編碼,並且沒有變量,它會發現通用apk文件很好,例如ext.betaDistributionApkFilePath = 「應用程序/生成/輸出/ APK/APP-flavor1-萬向debug.apk」。我想要做的是根據構建風格(lite/pro)和構建類型(release/debug)動態設置路徑。每種構建風味和類型組合都有一個獨特的applicationId。 – Mark

回答

6

對於每個現有的變體,您可以添加一個在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 
     } 
     } 
    } 
    } 
} 
+0

爲什麼需要'crashlyticsUploadSymbols'?運行'./gradlew tasks --all'時找不到該任務 –

+0

使用Crashlytics NDK時會創建此任務。一年前我寫了這段代碼,所以現在我不確定它是否真的有必要。你可以放下這部分,並檢查它是否有效。 – Michael

+0

我結束了採取不同的路線,但從我的測試,我認爲現在可能是無關的。感謝您的快速響應! –