Android - 从Flavor中删除活动

CBA*_*110 8 android android-activity android-gradle-plugin android-productflavors

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

下面是app 的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'
}
Run Code Online (Sandbox Code Playgroud)

下面是应用程序的清单文件它位于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>
Run Code Online (Sandbox Code Playgroud)

ana*_*gaf 10

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

AndroidManifest.xml中:

<activity 
    android:name=".ui.activities.ActivityOne" 
    android:enabled="${isPaidVersion}"/>
Run Code Online (Sandbox Code Playgroud)

build.config:

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

productFlavors {
    paid {
        ... 
        manifestPlaceholders = [isPaidVersion:"true"]
    }
    free {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)


Gab*_*tti 5

在您的自由风味中,AndroidManifest您可以指定:

<activity android:name=".ui.activities.ActivityOne" tools:node="remove"/>
Run Code Online (Sandbox Code Playgroud)

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

  • @gabriele 我不知道一年前它是否有效,但是 ** 现在你的答案是错误的并且具有误导性**,我在你的建议之后浪费了我的时间。然后,你为什么不重新编辑你的答案来解决它,而不是回复我的反对票? (5认同)
  • @PoianaApuana 在否决答案之前,您应该考虑相同答案的年龄。是2年前写的,意思是同时发生了很多变化,可能是当时最好的答案,但不是今天最好的答案。清单占位符在 2 年前不存在...... (2认同)
  • 今天刚刚尝试了这个解决方案,它按预期工作,因此它要么是构建系统中的错误,要么是错误的优先级,如此处所述 https://developer.android.com/studio/build/manifest-merge (尝试使用 3.2.1)。 1) (2认同)