6

sto dividendo la mia applicazione sulla base di ABI, non sulla densità, in questo modo:Tessuto Beta e APK divide

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

ho più i sapori, e 2 tipi di build (debug e rilascio). Voglio mettere il file apk universale, che ha lib native per tutte le piattaforme, su fabric beta. Da quello che ho capito, questo è supportato tramite l'attributo ext.betaDistributionApkFilePath.

Posso definirlo sia a livello buildType, sia a livello di gusto. Il problema è che ho bisogno sia di tipo accumulo e sapore a prendere mia variante - qualcosa di simile:

android.applicationVariants.all { variant -> 
    variant.ext.betaDistributionApkFilePath = "${buildDir}/outputs/apk/app-${variant.productFlavors[0].name}-universal-${variant.buildType.name}.apk" 
} 

o

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); 
     } 
    } 
} 

Purtroppo questo non sembra funzionare - non v'è alcun modo per farlo questo al momento?

+0

Questo si comporta proprio come non avere la variabile definita - mi avverte di più file apk e quindi esce. – Mark

+0

Grazie Mark, questo dovrebbe funzionare fino a quando è noto il percorso verso l'APK universale. Quando si costruisce il percorso viene popolato correttamente? –

+0

Se eseguo l'hard-code di ext.betaDistributionApkFilePath nella configurazione, senza variabili, trova il file apk universale corretto, ad es. ext.betaDistributionApkFilePath = "app/build/uscite/apk/app-flavor1-universal-debug.apk". Quello che sto cercando di fare è impostare dinamicamente quel percorso in base sia al gusto di build (lite/pro), sia al tipo di build (release/debug). Ogni combinazione di sapore e tipo di build ha un ID di applicazione univoco. – Mark

risposta

6

Per ogni variante esistente è possibile aggiungere un'azione che verrà eseguita prima delle attività di Crashlytics e impostare ext.betaDistributionApkFilePath in base al nome della variante. Ecco come appare:

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

Perché è richiesto 'crashlyticsUploadSymbols'? Non riesco a trovarlo durante l'esecuzione delle attività './gradlew --all' –

+0

Questa attività viene creata quando si utilizza Crashlytics NDK. Ho scritto questo codice un anno fa, quindi ora non sono sicuro che sia davvero necessario. Puoi lasciare questa parte e controllare se funziona. – Michael

+0

Ho finito per prendere una strada diversa, ma dai miei test penso che potrebbe essere estraneo ora. Grazie per la pronta risposta! –