2015-01-21 10 views
5

Ich habe eine App mit mehreren Build-Varianten. Die Varianten werden verwendet, um Versionen derselben App für verschiedene Unternehmen zu erstellen. Also, ich habe verschiedene Varianten, die unterschiedliche Anwendungen bauen:Wie ändere ich die AndroidManifest.xml-Datei basierend auf Build-Varianten?

  • com.acme.app1
  • com.schmoe.app2
  • com.yop.app3
  • etc ...

Die build.gradle Datei-Handles das sehr gut:

 productFlavors { 
    app1 { 
     applicationId "com.acme.app1" 
    } 

    app2 { 
     applicationId "com.schmoe.app2" 
    } 

    app3 { 
     applicationId "com.yop.app3" 
    } 

} 

Hier mein pro bluten. Ich integriere Dropbox in meine Apps. Die Datei AndroidManifest.xml muss für jede Variante so geändert werden, dass sie den entsprechenden Anwendungsschlüssel enthält (der in meiner Zeichenfolgendatei gespeichert ist). Dropbox hat folgende neben der Manifest-Datei:

  <activity 
     android:name="com.dropbox.client2.android.AuthActivity" 
     android:launchMode="singleTask" 
     android:configChanges="orientation|keyboard"> 

     <intent-filter> 
      <!-- Change this to be db- followed by your app key --> 
      <data android:scheme="db-abcdef" /> 
      <action android:name="android.intent.action.VIEW" /> 
      <category android:name="android.intent.category.BROWSABLE"/> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </activity> 

Jede Build-Variante muss die folgende Zeile ändern:

<data android:scheme="db-abcdef" /> 

auf den entsprechenden Wert für jede App-Variante. Mit anderen Worten, ich muss einen Teil der obigen Zeichenfolge basierend auf der Build-Variante ersetzen. Zum Beispiel

App1

<data android:scheme="db-111111" /> 

App2

<data android:scheme="db-222222" /> 

Anw3

<data android:scheme="db-333333" /> 

Die Linie ist für jede Variante bis zu dem Text "db-".

Was ich brauche ist, den variablen Teil der Zeichenfolge (die x-Werte) "db-xxxxxx" durch eine Zeichenfolge aus meiner Zeichenfolgedatei dynamisch zu ersetzen.

Ich denke, dass dies mit Gradle Skripten getan werden kann, aber ich bin ein komplettes Newb mit Gradle. HILFE!

Wenn Sie helfen können, bitte seien Sie sehr spezifisch über das, was wo geht, seit ich bei GRADLE-Dateien und Skripten sinke. Danke im Voraus!

Antwort

4

Sie können dies auf die gleiche Weise wie den App-Namen ändern, indem Sie eine Zeichenfolge-Ressource verwenden. In Ihrem Manifest enthalten:

<data android:scheme="@string/db_scheme" /> 

Als nächstes Sie Ressourcen Ordner für die verschiedenen Build-Typen und in jeder hinzufügen, legen Sie eine benutzerdefinierte Kopie einer Ressource-Datei, sagen res/values/flavor.xml:

<?xml version="1.0" encoding="utf-8" standalone="no"?> 
<resources> 
    <string name="app_name">Customer 1 App</string> 
    <string name="db_scheme">db-111111</string> 
</resources> 

Dieser Wille Sie können verschiedene API-Schlüssel, Schemata, App-Namen, Symbole usw. für Ihre verschiedenen Geschmacksrichtungen verwenden.

+0

Gibt es einen Weg, um die Saiten zu verketten? Der String in der String-Datei ist nur der Teil nach db-. Übersetzt: Nehmen wir an, der App-Schlüssel ist 123456. Der String-Eintrag ist "123456". Ich muss das mit "db-" verketten und "db-123456" machen. Offensichtlich konnte ich es mit db- speichern und dann vor dem Aufruf der API analysieren, aber ich war nur neugierig. – JustLearningAgain

+0

Ich habe ein Problem. Die in meiner App geladene Zeichenfolge lädt den richtigen Schlüssel. Aber der Schlüssel, der in der Manifestdatei geladen wird, lädt die Zeichenfolge aus der Hauptvariante und NICHT die Variante, die ich kompiliere. Gibt es eine Möglichkeit, das Manifest anzuweisen, die richtige Varianten-String-Datei zu laden? – JustLearningAgain

11

Sie können die Zeichenfolge in build.gradle sparen:

productFlavors { 
    app1 { 
     applicationId "com.acme.app1" 
     resValue "string", "my_app_key", "db-abc" 
    } 

    app2 { 
     applicationId "com.schmoe.app2" 
     resValue "string", "my_app_key", "db-def" 
    } 

    app3 { 
     applicationId "com.yop.app3" 
     resValue "string", "my_app_key", "db-ghi" 
    } 
} 

Und es dann gerne verwenden:

<data android:scheme="@string/my_app_key" /> 
+0

Das funktioniert. Ich gebe dies eine Abstimmung, aber die Antwort von 323go ist näher an dem, was ich brauche. Es erfordert nicht, dass ich den Wert an 2 Stellen habe. Danke für die Hilfe. Dies wird mir bei einigen anderen Dingen helfen, nach denen ich suche. – JustLearningAgain

Verwandte Themen