2014-10-23 5 views
12

Ich habe Skripts gesehen, die die Build-Aufgaben von Gradle manipulieren und ich frage mich, ob es möglich ist, einen String außerhalb der `defaultConfig 'zu setzen, aber als Standard für alle zu behandeln Aromen.Definieren Sie eine Zeichenfolge in Gradle und verwenden Sie auch eine Aromaspezifische Anwendung. ID

Grundsätzlich habe ich mehrere Geschmacksrichtungen und alle von ihnen haben eine bestimmte ApplicationId. Ich möchte diese ID verwenden, um eine Zeichenfolgenressource festzulegen, die später in meinem Java-Code verwendet wird.

defaultConfig { 
    minSdkVersion 11 
    targetSdkVersion 21 
    versionCode 1 
    versionName "1.0" 
} 

productFlavors { 
    one { 
     applicationId "com.my.app.one" 
    } 
    two { 
     applicationId "com.my.app.two" 
    } 
} 

Ich mag eine Zeichenfolge wie folgt setzen:

resValue "string", "authority", applicationId + ".dataprovider" 

Was ich habe versucht:

  • Wenn ich es in dem defaultConfig Abschnitt setzte das applicationId noch null ist, so Ich bekomme eine falsche Zeichenfolge
  • Putting es zu jedem Geschmack Abschnitt funktioniert, aber da ich mehrere Aromen habe, erstellt eine Menge Code-Wiederholung

Auf der Suche nach einer Alternative.

P.S. Ich verwende Android Studio 0.8.12.

+0

Wie sieht es mit Ihren 'BuildTypes' aus? – Blundell

+0

@blundell es scheint, 'applicationId' ist dort nicht verfügbar, nur das Suffix. – Simas

Antwort

30

Gut nach vielen Suchen habe ich die Antwort darauf gefunden. Vielleicht wird jemand das nützlich finden.

productFlavors.all { 
    resValue "string", "authority", applicationId + ".dataprovider" 
} 

Dieses einfache Schnipsel setzt einen String in allen Geschmacksrichtungen nach haben ihre invidual Variablen gesetzt. Es ist ein bisschen wie ein defaultConfig, aber nicht ganz, da es nach den Aromablöcken ausgeführt wird.


Extra:

Schaltet ich sogar die applicationId einstellen lassen! Mein Endergebnis so weit ist:

def final String AUTHORITY = '.dataprovider' 

productFlavors.all { 
    applicationId "com.my.app." + name 
    resValue "string", "authority", applicationId + AUTHORITY 
    buildConfigField "String", "AUTHORITY", "\""+applicationId + AUTHORITY+"\"" 
} 

Jetzt kann ich jeden Geschmack Anbieter Autorität durch BuildConfig.AUTHORITY und @string/authority bekommen, die ich im Manifest verwenden und in meiner Klasse Datei jeweils:

<provider 
    android:name="com.my.app.DataProvider" 
    android:authorities="@string/authority" 
    android:exported="false" /> 


public class DataProvider extends ContentProvider { 
    public static final String PROVIDER = BuildConfig.AUTHORITY; 
    public static final Uri SEARCH_URI = Uri.parse("content://" + PROVIDER + "/search"); 
} 
+0

Mein Herr, Ihre Idee, BuildConfig mit der buildConfigField-Anweisung eine Konstante hinzuzufügen, hat meinen Tag gerettet! :-) Ich benutze es, um die ApplicationId zu AUTHORITY-Klasse-Konstanten in meinem contentproviders zu propagieren. –

+2

Ich habe gerade festgestellt, dass bereits BuildConfig.APPLICATION_ID generiert wird, neben anderen Konstanten für Build-Typ, Aromen inkl. Abmessungen und Versionsinformationen. Trotzdem hätte ich diese Information ohne Ihre Antwort nicht gesehen. –

+0

@ arne.jans Der Grund für die Länge dieser Antwort ist, dass ich eine aromaspezifische Autorität haben wollte, die auch eine Ressourcen-Zeichenfolge ist, so dass sie im Manifest verwendbar ist. Sie können das nicht nur mit 'BuildConfig.APPLICATION_ID' machen. – Simas

Verwandte Themen