2017-05-18 20 views
16

Używałem tego w poprzedniej wtyczce gradle i działało dobrze.Zmień nazwę pliku wyjściowego w nowej wtyczce Android 3.0.0-alpha1

applicationVariants.all { v -> 
v.outputs.each { output -> 
    output.outputFile = new File(
      output.outputFile.parent, 
      output.outputFile.name.replace("app-release.apk", "companyName-app-v${variant.versionName}.apk")) 
}} 

Po ostatniej aktualizacji do wersji 3.0.0-alpha1 wyświetla błąd.

Przeczytałem link https://developer.android.com/studio/preview/features/new-android-plugin-migration.html, ale nie udało się znaleźć dokładnego źródła błędu.

Czy brakuje mi jakiegoś rozwiązania?

Odpowiedz

13

Aby zmienić nazwę APK, można zmienić go na adres:

android.applicationVariants.all { variant -> 
    variant.outputs.all { 
     outputFileName = "companyName-app-v${variant.versionName}.apk" 
    } 
} 

Jeśli używasz each(), aby wykonać iterację obiektów wariantów, trzeba rozpocząć korzystanie wszystko(). Jest tak, ponieważ each() iteruje tylko przez obiekty , które już istnieją w czasie konfiguracji - ale te obiekty nie istnieją w czasie konfiguracji z nowym modelem. Jednak all() dostosowuje się do nowego modelu, podnosząc obiekt podczas dodawania podczas wykonywania.

Source

+0

Pomimo tego, co mówi oficjalna dokumentacja, nie działa. –

+0

Szukanie bliżej variant.outputs zwraca kolekcję typu com.android.build.gradle.api.BaseVariantOutput, a nie DefaultDomainObjectCollection, więc nie można zastosować do niej wszystkich zamknięć. –

0

Wydaje się, że problem jest już addressed, a odpowiedź brzmi, że obecnie nie jest obsługiwana, ale zostanie wprowadzony nowy interfejs API.

+0

Przeczytałem link, ale chciałem tylko wiedzieć, czy jest inny sposób na osiągnięcie tego samego. Jeśli jest jakiś inny interfejs API, który może mi pomóc w realizacji tego zadania, chętnie się o tym dowiem. – Chaks

+0

Wydaje się teraz jedynym właściwym sposobem dla niezbyt prostych projektów - wystarczy użyć starej wersji i zacząć używać nowej, gdy stanie się bardziej dojrzała – sandrstar

+0

Obecnie robi to samo. – Chaks

0

jestem na Canary 3, a to jest praca dla mnie. Ale zobacz kludge do nazwy ABI? Nie mogłem wymyślić, gdzie można uzyskać ABI w nowej strukturze, więc wyodrębniono go z domyślnej nazwy (ssie). Jeśli ktokolwiek zna lepszy sposób na uzyskanie nazwy ABI podczas używania podziałów (aby zmienić kod wersji na ABI), chciałbym usłyszeć. Może czas, aby zamieścić osobne pytanie. W każdym razie działa to na prod APK builds.

def ext = rootProject.extensions.getByName("ext") 
ext.versionCodes = ['armeabi': 1, 'armeabi-v7a': 2, 'x86': 8] 

android.applicationVariants.all { variant -> 
    if (variant.buildType.name != "debug") { 
     variant.outputs.all { vOutput -> 
      // there has got to be a better way to get the ABI name than this kludge 
      def nameTokens = vOutput.name.split("-"); 
      def abiName = nameTokens[1] 
      abiName = nameTokens[2].contains("v7a") ? abiName + "-v7a" : abiName 
      def versionNumber = ext.versionCodes.get(abiName) * 1000 + variant.versionCode 
      def newApkName = "${getAppName()}-${variant.flavorName}-${variant.versionName}-${versionNumber}.apk" 
      outputFileName = newApkName 
     } 
    } 
} 

z tych plików produkowane z "Build APKs" dla versionCode 1 versionName "1.0.0" z armeabi-v7a i x86 ABI odpowiednio:

AppName-Prod-1.0.0-2001.apk 
AppName-Prod-1.0.0-8001.apk 

nie mogłem znaleźć żadne doc na nazwach ABI w nowej konfiguracji. Stary sposób ich uzyskania jest oczywiście zepsuty :-)