使用Gradle在AndroidManifest.xml上有条件地添加<activity>标签

Tho*_* H. 2 android build gradle android-manifest

我有一个应用程序只有使用不直接访问的服务,接收器和活动(没有启动器活动).

但是现在我必须添加一个用作启动器活动的活动但是只有当应用程序在BUILD期间设置了一些特定变量时,此启动器活动才必须存在.

所以基本上,当调用gradle构建时,我设置了一个变量HAS_LAUNCHER=1,在我的build.gradle中,我有类似的东西:

defaultConfig {
    ...

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

在我的AndroidManifest中,我必须<activity>if条件成立时添加标记:

<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>
Run Code Online (Sandbox Code Playgroud)


如何在不使用productFlavors的新维度的情况下实现这一目标?(该应用程序已经有3种风格和2种buildTypes的维度,所以我不想做更多的输出)

Fed*_*rik 5

可能为时已晚,但经过多天寻找解决方案,我已经这样做了:

gradle defaultConfig

defaultConfig {
    resValue "bool", "showActivity", "true"
...
Run Code Online (Sandbox Code Playgroud)

在builTypes中

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

在清单中

    <activity
     android:name="xxx.xx.xxx"
        android:enabled="@bool/showActivity"
        android:label="@string/myActivity"
        android:icon="@android:drawable/ic_menu_preferences">
    ...
Run Code Online (Sandbox Code Playgroud)

这样您就可以从gradle控制活动可见性.请注意,您也可以在代码中使用,只需创建一个bool资源showActivity,它将被gradle值替换,您将能够读取它

context.getResources().getBoolean(R.bool.showActivity)
Run Code Online (Sandbox Code Playgroud)