Android - 从 Flavor 中删除 Activity

Android - Removing Activity from Flavor

如何从应用风格中删除 activity?这是一个简化的示例,我有一个具有以下两种风格(付费和免费)的应用程序。该应用程序很小,只有 3 个活动(MainActivity、ActivityOne 和 ActivityTwo)。付费应用不需要任何限制,因为它将使用完整的代码库。但是,免费应用程序要求用户可以访问 MainActivity 和 ActivityTwo,而不是 ActivityOne。编译代码时如何执行 "Manifest Merge" 以使 ActivityOne 不存在于免费版本中?换句话说应该如何创建src/free/AndroidManifest.xml才能使免费应用程序没有ActivityOne?

下面是应用的 build.gradle 文件:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "com.example.calculator"
        minSdkVersion 21
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors {
        paid {
            applicationId "com.example.paid"
            resValue "string", "app_name", "Paid Calculator"
            versionName "1.0-full"
        }
        free {
            applicationId "com.example.free"
            resValue "string", "app_name", "Free Calculator"
            versionName "1.0-free"
        }
    }
    sourceSets {
        paid {
            manifest.srcFile 'src/paid/AndroidManifest.xml'
        }
        free {
            manifest.srcFile 'src/free/AndroidManifest.xml'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:cardview-v7:21.0.0'
    compile 'com.android.support:recyclerview-v7:21.0.0'
    compile 'com.android.support:design:22.2.0'
    compile 'com.android.support:appcompat-v7:22.2.0'
}

下面是应用程序的清单文件它位于 src/main/AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.calculator">

    <application
        android:name="com.example.calculator.ui.activities.AppController"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:theme="@style/AppTheme">
        <activity
            android:name=".ui.activities.MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".ui.activities.ActivityOne"
            android:label="@string/title_activity_one"
            android:parentActivityName=".ui.activities.MainActivity">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".ui.activities.MainActivity" />
        </activity>
        <activity
            android:name=".ui.activities.ActivityTwo"
            android:label="@string/title_activity_two"
            android:parentActivityName=".ui.activities.MainActivity">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".ui.activities.MainActivity" />
        </activity>
    </application>
</manifest>

在您的免费风格中,在AndroidManifest中您可以指定:

<activity android:name=".ui.activities.ActivityOne" tools:node="remove"/>

标记 tools:node="remove" 将使合并删除任何具有 android:name=".ui.activities.ActivityOne"

的活动

您可以使用占位符设置 android:enabled 属性

AndroidManifest.xml:

<activity 
    android:name=".ui.activities.ActivityOne" 
    android:enabled="${isPaidVersion}"/>

build.config:

defaultConfig {
  ...
  manifestPlaceholders = [isPaidVersion: "false"]
}

productFlavors {
    paid {
        ... 
        manifestPlaceholders = [isPaidVersion:"true"]
    }
    free {
        ...
    }
}