2016-03-29 3 views
4

Ich versuche, eine App in ABI spezifische apks zu teilen, aber die Versionsnummern aller apks sind die gleichen. Sie müssen anders sein, um in den Play Store hochgeladen zu werden. Fehle ich etwas?Android Gadle apk spaltet, Einstellung versionCode

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

diese Verwendung mit der neuesten AS und gradle Version erhalte ich: Gradle DSL-Methode nicht gefunden: ‚universalapk()‘ – David

Antwort

3

Ich denke, wenn Sie eine schnelle Google-Suche gemacht hätten, hätten Sie alle Antworten erhalten. Wie auch immer, so sollte Ihr Gerät aussehen. Sie haben es versäumt, den verschiedenen Architekturversionen einen Bezeichner zuzuweisen.

android 
    { 

    def versionMajor = 1 
     def versionMinor = 0 
     def versionPatch = 0 
     def versionBuild = 0 

     defaultConfig { 
      applicationId "com.example.app" 
      minSdkVersion 15 
      targetSdkVersion 22 

      versionCode versionMajor * 10000 + versionMinor * 1000 + versionPatch * 100 + versionBuild 
      versionName "${versionMajor}.${versionMinor}.${versionPatch}" 
     } 

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

    // map for the version code 
     project.ext.versionCodes = ['armeabi': 1, 'armeabi-v7a': 2, 'arm64-v8a': 3, 'mips': 5, 'mips64': 6, 'x86': 8, 'x86_64': 9] 

     android.applicationVariants.all { variant -> 
      // assign different version code for each output 
      variant.outputs.each { output -> 
       output.versionCodeOverride = 
         project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 0) * 1000000 + android.defaultConfig.versionCode 
      } 
     } 
    } 
+0

Dank. Ich habe vor einer Weile so etwas probiert und es hat nicht funktioniert. aber ich werde deinen Code wörtlich versuchen, wenn ich eine Chance bekomme. – Daykm

3

Ich denke, das könnte ein bisschen sauberer sein. Es ist vielleicht nicht als 100% sein, obwohl automatisierbar, aber ich mag es nicht, dass * 1000000 und Wörterbuch-Lookup-Trick:

ext { 
    versionCodeBase = 30 // 1 higher than current highest versionCode in Play store 
} 

android { 
    splits { 
     density { 
      enable true // just enable them all 
     } 
     abi { 
      enable true 
      universalApk false 
     } 
    } 

    android.applicationVariants.all { variant -> 
     variant.outputs.eachWithIndex { output, outputIndex -> 
      output.versionCodeOverride = project.ext.versionCodeBase + outputIndex 
      println variant.buildType.name + ' - ' + output.getFilter(OutputFile.ABI) + ' - ' + output.getFilter(OutputFile.DENSITY) + ': ' + output.versionCodeOverride 
     } 
    } 
} 

Hinweis Ich verwende eachWithIndex über die Varianten Looping.

Dies funktioniert, weil Dichte und Abi auf dem Gerät eines Benutzers nicht ändern werden. Mehr Arbeit wird in diesem Skript benötigt, wenn Sie separate APK-Dateien pro minSdkVersion zulassen möchten.

Lemme gerade auch die Ausgabe des Skripts hinzufügen:

debug - mips64 - null: 30 
debug - x86_64 - null: 31 
debug - x86 - null: 32 
debug - armeabi-v7a - null: 33 
debug - armeabi - null: 34 
debug - mips - null: 35 
debug - arm64-v8a - null: 36 
debug - mips64 - xxxhdpi: 37 
debug - x86_64 - xxxhdpi: 38 
debug - x86 - xxxhdpi: 39 
debug - armeabi-v7a - xxxhdpi: 40 
debug - armeabi - xxxhdpi: 41 
debug - mips - xxxhdpi: 42 
debug - arm64-v8a - xxxhdpi: 43 
debug - mips64 - mdpi: 44 
debug - x86_64 - mdpi: 45 
debug - x86 - mdpi: 46 
debug - armeabi-v7a - mdpi: 47 
debug - armeabi - mdpi: 48 
debug - mips - mdpi: 49 
debug - arm64-v8a - mdpi: 50 
debug - mips64 - ldpi: 51 
debug - x86_64 - ldpi: 52 
debug - x86 - ldpi: 53 
debug - armeabi-v7a - ldpi: 54 
debug - armeabi - ldpi: 55 
debug - mips - ldpi: 56 
debug - arm64-v8a - ldpi: 57 
debug - mips64 - xxhdpi: 58 
debug - x86_64 - xxhdpi: 59 
debug - x86 - xxhdpi: 60 
debug - armeabi-v7a - xxhdpi: 61 
debug - armeabi - xxhdpi: 62 
debug - mips - xxhdpi: 63 
debug - arm64-v8a - xxhdpi: 64 
debug - mips64 - hdpi: 65 
debug - x86_64 - hdpi: 66 
debug - x86 - hdpi: 67 
debug - armeabi-v7a - hdpi: 68 
debug - armeabi - hdpi: 69 
debug - mips - hdpi: 70 
debug - arm64-v8a - hdpi: 71 
debug - mips64 - xhdpi: 72 
debug - x86_64 - xhdpi: 73 
debug - x86 - xhdpi: 74 
debug - armeabi-v7a - xhdpi: 75 
debug - armeabi - xhdpi: 76 
debug - mips - xhdpi: 77 
debug - arm64-v8a - xhdpi: 78 
release - mips64 - null: 30 
release - x86_64 - null: 31 
release - x86 - null: 32 
release - armeabi-v7a - null: 33 
release - armeabi - null: 34 
release - mips - null: 35 
release - arm64-v8a - null: 36 
release - mips64 - xxxhdpi: 37 
release - x86_64 - xxxhdpi: 38 
release - x86 - xxxhdpi: 39 
release - armeabi-v7a - xxxhdpi: 40 
release - armeabi - xxxhdpi: 41 
release - mips - xxxhdpi: 42 
release - arm64-v8a - xxxhdpi: 43 
release - mips64 - mdpi: 44 
release - x86_64 - mdpi: 45 
release - x86 - mdpi: 46 
release - armeabi-v7a - mdpi: 47 
release - armeabi - mdpi: 48 
release - mips - mdpi: 49 
release - arm64-v8a - mdpi: 50 
release - mips64 - ldpi: 51 
release - x86_64 - ldpi: 52 
release - x86 - ldpi: 53 
release - armeabi-v7a - ldpi: 54 
release - armeabi - ldpi: 55 
release - mips - ldpi: 56 
release - arm64-v8a - ldpi: 57 
release - mips64 - xxhdpi: 58 
release - x86_64 - xxhdpi: 59 
release - x86 - xxhdpi: 60 
release - armeabi-v7a - xxhdpi: 61 
release - armeabi - xxhdpi: 62 
release - mips - xxhdpi: 63 
release - arm64-v8a - xxhdpi: 64 
release - mips64 - hdpi: 65 
release - x86_64 - hdpi: 66 
release - x86 - hdpi: 67 
release - armeabi-v7a - hdpi: 68 
release - armeabi - hdpi: 69 
release - mips - hdpi: 70 
release - arm64-v8a - hdpi: 71 
release - mips64 - xhdpi: 72 
release - x86_64 - xhdpi: 73 
release - x86 - xhdpi: 74 
release - armeabi-v7a - xhdpi: 75 
release - armeabi - xhdpi: 76 
release - mips - xhdpi: 77 
release - arm64-v8a - xhdpi: 78 
+0

Beachten Sie, dass dies nicht ideal ist. Die Versionscodes müssen korrekt bestellt werden, xxxhdpi-Geräte nehmen zum Beispiel den höchsten Versionscode an, der für sie funktioniert. Wenn xhdpi ein höherer Versionscode als xxxhdpi ist, wird die xhdpi-App ausgeführt. Sie mit der Nachschlagetabelle in der anderen Antwort zu sortieren, ist keine so schlechte Idee. – xorgate

2

Aus irgendeinem Grund habe ich immer Fehler bekam, wenn die vorgestellten Lösungen. Ich habe mehrere productFlavors und meine Lösung sieht nun wie folgt aus:

android { 
    flavorDimensions 'app', 'store' 
    productFlavors { 
     appFlavorOne { 
      dimension 'app' 
      applicationId "com.my.application.id" 
      versionCode 123 
      versionName '1.2.3' 
     } 
     appFlavorTwo { 
      dimension 'app' 
      applicationId "com.my.other.application.id" 
      versionCode 100 
      versionName '1.0.0' 
     } 
    } 
    splits { 
     abi { 
      enable true 
      reset() 
      include 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86' 
      universalApk true 
     } 
    } 

    // APK Splits based on ABI, map for the version code. Uncomment for appFlavorTwo Builds! 
    project.ext.versionCodes = ['null':0, 'armeabi': 1, 'armeabi-v7a': 2, 'arm64-v8a': 3, 'x86': 4] 
    android.applicationVariants.all { variant -> 
     // assign different version code for each output 
     variant.outputs.each { output -> 
      output.versionCodeOverride = android.productFlavors.appFlavorOne.versionCode + project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 0) 
      output.versionNameOverride = android.productFlavors.appFlavorOne.versionName + ' (' + (project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 0) == 0 ? 'universal' : output.getFilter(com.android.build.OutputFile.ABI)) + ')' 
      println output.versionNameOverride + ' (' + output.versionCodeOverride + ')' 
     } 
    } 
}