Ersetzen eines Strings in AndroidManifest.xml für ein Buildvariant funktioniert nicht für Gradle Android Plugin Version> 0.5.4

Vor ein paar Wochen hatte ich die folgende Frage: Wie erstelle ich einen String für einen Bausatz mit Grade?

Ich habe auch die Frage selbst beantwortet.

  • Native Stack Trace auf ICS?
  • Google Cloud Messaging in Delphi XE5?
  • Wie man ausgewählte Dateien aus Android mit Adb-Pull kopiert
  • Ausfall auf Build mit Gradle auf Kommandozeile mit einem Android Studio Projekt: Xlint Fehler
  • Wie man Code von apk Datei extrahiert
  • Facebook 3.0 Android zweite Login-Versuch gibt "Session State geschlossen"
  • Alles funktioniert bis jetzt gut: Ich habe gerade erkannt, dass meine Kopieraufgabe nicht mehr funktioniert. Ich habe ein paar Stunden auf dem Problem verbracht, bis ich merkte, dass es auf das Gradle Android Plugin Version abhängt: Alles bis 0.5.4 funktioniert gut. Für höhere Versionen werde ich nicht in meine Kopieraufgabe kommen.

    Hier ist die Konsolenausgabe:

    // gradle android plugin version: 0.5.6 and 0.5.5 --> copy tas doesn't work :etscanner:prepareFlavor1Flavor1ReviewDependencies :etscanner:compileFlavor1Flavor1ReviewAidl :etscanner:generateFlavor1Flavor1ReviewBuildConfig :etscanner:mergeFlavor1Flavor1ReviewAssets :etscanner:compileFlavor1Flavor1ReviewRenderscript :etscanner:mergeFlavor1Flavor1ReviewResources :etscanner:processFlavor1Flavor1ReviewManifest :etscanner:processFlavor1Flavor1ReviewResources :etscanner:compileFlavor1Flavor1ReviewNote: Some input files use or override ad eprecated API. Note: Recompile with -Xlint:deprecation for details. Note: <path>.DetailAdapter .java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. :etscanner:dexFlavor1Flavor1Review :etscanner:processFlavor1Flavor1ReviewJavaRes UP-TO-DATE :etscanner:validateFlavor1Flavor1Signing :etscanner:packageFlavor1Flavor1Review :etscanner:zipalignFlavor1Flavor1Review // gradle android plugin version: 0.5.4 --> copy task work :etscanner:prepareFlavor1Flavor1ReviewDependencies :etscanner:compileFlavor1Flavor1ReviewAidl :etscanner:generateFlavor1Flavor1ReviewBuildConfig :etscanner:mergeFlavor1Flavor1ReviewAssets :etscanner:compileFlavor1Flavor1ReviewRenderscript :etscanner:mergeFlavor1Flavor1ReviewResources :etscanner:processFlavor1Flavor1ReviewManifest ...hey you are in the copy task! :etscanner:processFlavor1Flavor1ReviewResources :etscanner:compileFlavor1Flavor1ReviewNote: Some input files use or override ad eprecated API. Note: Recompile with -Xlint:deprecation for details. Note: <path>DetailAdapter .java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. :etscanner:dexFlavor1Flavor1Review :etscanner:processFlavor1Flavor1ReviewJavaRes UP-TO-DATE :etscanner:validateFlavor1Flavor1Signing :etscanner:packageFlavor1Flavor1Review :etscanner:zipalignFlavor1Flavor1Review :etscanner:assembleFlavor1Flavor1Review 

    Es ist wirklich eine seltsame Sache … Hat jemand eine Idee, wie man das beheben kann?

    UPDATE 1 2013-08-23

    Meine build.gradle Datei:

     buildscript { repositories { // maven central repo doesn't work with gradle android plugin version 0.5.+ // error message is describe in this post: // https://plus.google.com/117954254390243608387/posts/RVBjoDMkLV5 //mavenCentral() maven { url 'http://nexus/content/groups/public/' } } dependencies { classpath 'com.android.tools.build:gradle:0.5.4' // copy task doesn't work for following versions: //classpath 'com.android.tools.build:gradle:0.5.5' //classpath 'com.android.tools.build:gradle:0.5.6' //classpath 'com.android.tools.build:gradle:0.5.+' } } apply plugin: 'android' dependencies { compile 'com.android.support:support-v4:13.0.+' // support lib //compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar' compile project(':libraries:actionbarsherlock') compile project(':libraries:google-play-services_lib') } android { compileSdkVersion 17 buildToolsVersion "17.0.0" defaultConfig { minSdkVersion 8 targetSdkVersion 17 versionName = "2.3" versionCode = 4 } // SIGN CONFIGS signingConfigs { flavor1 { storeFile file("keystore/myKeystore.keystore") storePassword = "store_password" keyAlias = "alias" keyPassword = "key_password" } flavor2 { storeFile file("keystore/myKeystore.keystore") storePassword = "store_password" keyAlias = "alias" keyPassword = "key_password" } debug { storeFile file("keystore/debug.keystore") storePassword = "android" keyAlias = "androiddebugkey" keyPassword = "android" } } // FLAVORS productFlavors { flavor1 { packageName 'myPackageName' signingConfig signingConfigs.flavor1 } flavor2 { packageName 'myPackageName' signingConfig signingConfigs.flavor2 } } // BUILDTYPES buildTypes { falvor1Review { versionNameSuffix = versionNameSuffixOfReviewVersion signingConfig signingConfigs.flavor1 } flavor2Review { versionNameSuffix = versionNameSuffixOfReviewVersion signingConfig signingConfigs.flavor2 } debug { packageNameSuffix ".debug" versionNameSuffix = versionNameSuffixOfReviewVersion signingConfig signingConfigs.debug } } // Override Data in Manifest android.applicationVariants.each { variant -> variant.processManifest.doLast { copy { // *** SET COPY PATHS *** try { from("${buildDir}/manifests") { //println "from: ${buildDir}/manifests" include "${variant.dirName}/AndroidManifest.xml" //println "included: ${variant.dirName}/AndroidManifest.xml" } } catch (e) { println "error: " + e } into("${buildDir}/manifests/${variant.name}") //println "into (neues Manifest): ${buildDir}/manifests/${variant.name}" // *** DEFINE VARS *** def brandVersion = variant.buildType.name def brandVersionString = brandVersion.toString() def appName = "empty" // *** SET APP NAME *** if (brandVersionString.contains("flavor1")) { appName = "my app name for flavor 1" } else if (brandVersionString.contains("flavor2")) { appName = "my app name for flavor 2" } println "...hey you are in the copy task" // *** REPLACE LINES IN MANIFEST *** // --- add appName filter { String line -> line.replaceAll("<application android:allowBackup=\"true\" android:icon=\"@drawable/ic_launcher\" android:label=\"todo\" android:theme=\"@style/AppTheme\">", "<application android:allowBackup=\"true\" android:icon=\"@drawable/ic_launcher\" android:label=\"" + appName + "\" android:theme=\"@style/AppTheme\">"); } } } // *** SET PATH TO NEW MANIFEST *** variant.processResources.manifestFile = file("${buildDir}/manifests/${variant.name}/${variant.dirName}/AndroidManifest.xml") //println "newManifest: ${buildDir}/manifests/${variant.name}/${variant.dirName}/AndroidManifest.xml" } } 

    UPDATE 2 2013-08-23

    Gestern hatte ich ein anderes merkwürdiges Verhalten von AS 0.2.5, es machte einige seltsame Builds: Wie du in meinem Filter sehst, ist mein früherer appName im Manifest "todo":

     <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="todo" android:theme="@style/AppTheme"> 

    Als ich den Build machte, war der AppName in der App der richtige. Aber im Application Launcher und in Settings / Apps wurde "todo" als appName angezeigt.

    Nach dem Bau des Projektes in AS 0.2.0 funktioniert alles gut.

  • Android Hallo GridView Tutorial wird keine Bilder anzeigen
  • Best Practices: Layouts auf Android (Programmatic vs XML)
  • Verwenden von Daten aus Kontextanbietern oder Anfordern von Google Fotos Leseberechtigung?
  • Verhalten von mobilen App-Browsern mit Google-Sitzungen und Account-Chooser
  • Android Wear Benachrichtigung wird nicht angezeigt, wenn FLAG_NO_CLEAR verwendet wird
  • Google Maps v2 Set Zoom Ebene
  • 3 Solutions collect form web for “Ersetzen eines Strings in AndroidManifest.xml für ein Buildvariant funktioniert nicht für Gradle Android Plugin Version> 0.5.4”

    Ich hatte das gleiche Problem wie Sie und las durch die Release Notes für 0.5.5 wo ich die Antwort gefunden habe.

    "Der Zugriff auf den Variantencontainer erzwingt nicht, die Aufgabe zu erzwingen, das bedeutet android.[application|Library|Test]Variants sind während der Auswertungsphase leer.

    Wenn du die Lösung von Alécio ausprobieren möchtest und auf eine neuere Version von Gradle verstoßen möchtest, wie zB

    WARNUNG [Projekt::] varant.getProcessManifest () ist veraltet. Rufen Sie es an einer von varant.getOutputs () an.

    Sie müssen 'varant.outputs.each {output ->' verwenden, um über jede Ausgabe zu iterieren, siehe den unten stehenden Code

     applicationVariants.all { variant -> def flavor = variant.productFlavors[0].name def flavorPackageName = variant.productFlavors[0].applicationId variant.outputs.each { output -> output.processManifest.doLast { println("configuring AndroidManifest.xml for " + flavor); copy { from("${buildDir}/intermediates/manifests") { include "${variant.dirName}/AndroidManifest.xml" } into("${buildDir}/intermediates/filtered_manifests") } def manifestFile = new File("${buildDir}/intermediates/filtered_manifests/${variant.dirName}/AndroidManifest.xml") def content = manifestFile.getText() def updatedContent = content.replaceAll("STRING_TO_BE_REPLACED", "NEW_STRING") manifestFile.write(updatedContent) } output.processResources.manifestFile = new File("${buildDir}/intermediates/filtered_manifests/${variant.dirName}/AndroidManifest.xml") } } 

    Der folgende Code kann innerhalb des androiden Blocks in deinem Gradle-Build platziert werden.

     android { ... buildTypes { ... applicationVariants.all { variant -> def flavor = variant.productFlavors[0].name def flavorPackageName = variant.productFlavors[0].applicationId variant.processManifest.doLast { println("configuring AndroidManifest.xml for " + flavor); copy { from("${buildDir}/intermediates/manifests") { include "${variant.dirName}/AndroidManifest.xml" } into("${buildDir}/intermediates/filtered_manifests") } def manifestFile = new File("${buildDir}/intermediates/filtered_manifests/${variant.dirName}/AndroidManifest.xml") def content = manifestFile.getText() def updatedContent = content.replaceAll("STRING_TO_BE_REPLACED", "NEW_STRING") manifestFile.write(updatedContent) } variant.processResources.manifestFile = new File("${buildDir}/intermediates/filtered_manifests/${variant.dirName}/AndroidManifest.xml") } } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.