2016-05-17 6 views
1

Ich habe eine Anwendung, die nur Dienste, Empfänger und Aktivitäten, die nicht direkt von der Verwendung (es gibt keine Launcher-Aktivität).Bedingte hinzufügen <activity> Tag auf AndroidManifest.xml mit Gradle

Aber jetzt muss ich eine Aktivität hinzufügen, die als Startaktivität verwendet werden soll ABER diese Launcher-Aktivität muss nur vorhanden sein, wenn die App bestimmte Variablen während BUILD gesetzt hat.

Also im Grunde, wenn der gradle Build Aufruf richte ich eine Variable HAS_LAUNCHER=1 und in meinem build.gradle Ich habe so etwas wie:

defaultConfig { 
    ... 

    def hasLauncher = System.getenv("HAS_LAUNCHER") 
    if (hasLauncher != null && hasLauncher == "1") { 
     // Something here to include the activity tag in the AndroidManifest.xml 
    } 
} 

Und in meinem AndroidManifest Ich habe den <activity> Tag, wenn das hinzufügen if Bedingung erfüllt ist:

<activity 
    android:name=".LauncherActivity" 
    android:label="Launcher" 
    android:theme="@style/AppTheme"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN"/> 
     <category android:name="android.intent.category.LAUNCHER"/> 
    </intent-filter> 
</activity> 


Wie kann ich erreichen, dass ohne eine neue Dimension der produ mit ctFlavors? (die App hat bereits eine Dimension mit 3 Flavors und 2 BuildTypes, also möchte ich nicht noch mehr Ausgaben machen)

+1

eine Sache, die Sie verwenden können, ist das ' enabled 'Attribut des Aktivitäts-Tags – njzk2

+0

"diese Launcher-Aktivität muss vorhanden sein" - was bedeutet "präsent" in diesem Zusammenhang? Meinst du, dass die Aktivität nur in bestimmten Builds aktiviert werden darf? BTW, du scheinst etwas vor deinem '


' zu vermissen. – CommonsWare

+0

@CommonsWare Ja, die Launcher-Aktivität sollte nur in bestimmten Builds in der APK sein, während andere Builds nur die Dienste, Empfänger und andere Aktivitäten haben sollten. (Und ja, ich habe die ASK-Taste aus Versehen gedrückt, aber jetzt habe ich die Frage bearbeitet) –

Antwort

1

kann zu spät sein, aber nach vielen Tagen auf der Suche nach einer Lösung habe ich in diesem getan übrigens:

gradle defaultConfig

defaultConfig { 
    resValue "bool", "showActivity", "true" 
... 

In den builTypes

buildTypes { 
    release { 
     resValue "bool", "showActivity", "false" 
     debuggable false 
     minifyEnabled false 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
    } 

In manifest

<activity 
    android:name="xxx.xx.xxx" 
     android:enabled="@bool/showActivity" 
     android:label="@string/myActivity" 
     android:icon="@android:drawable/ic_menu_preferences"> 
    ... 

Auf diese Weise können Sie die Sichtbarkeit der Aktivitäten von Gradle aus steuern. Beachten Sie, dass Sie auch in Code verwenden können, erstellen Sie einfach eine Bool Ressource showActivity, wird es durch gradle Wert ersetzt werden, und Sie werden in der Lage sein, es zu lesen

context.getResources().getBoolean(R.bool.showActivity) 
Verwandte Themen