【问题标题】:In Android Studio how do you add a different Manifest file for each product flavor?在 Android Studio 中,如何为每种产品风格添加不同的 Manifest 文件?
【发布时间】:2021-09-06 11:05:14
【问题描述】:

我有两种产品口味。这是应用程序的gradle:

flavorDimensions "default"
productFlavors{
    publicVersion{
        dimension "default"
    }
    privateVersion{
        dimension "default"
    }
}

我想为每种口味创建一个不同的清单文件。所以我创建了一个路径为 src/publicVersion/AndroidManifest.xml 的 Manifest 文件和另一个路径为 src/privateVersion/AndroidManifest.xml 的 Manifest 文件,然后我删除了主 Manifest 文件。

在我这样做之后,没有任何效果。 Android Studio 仍然要求在主目录中有一个 Manifest 文件。我尝试了所有关于 SO 的答案(比如在应用程序 gradle 文件中使用“sourceSet”),但它们没有用。也许最近的 Android Studio 更新已经改变了这样做的方式?

【问题讨论】:

    标签: android android-studio


    【解决方案1】:

    您可以覆盖单个风味中的完整清单或仅定义风味中的特色(恕我直言更好)。如果您只添加一种权限,您只需要有一个带有这个单一权限的清单,它将与主要权限合并。如果要修改 XML-Tag,可以使用 tools:node="merge" 和 tools:node="replace"。

    【讨论】:

    • 您好,除了“tools:node="merge" 和 tools:node="replace"”,我想我什么都懂。能举个例子吗?
    • 因为您的main 风格中包含<application> 标签,并且可能在您的个人风格中,您需要使用tools:node="merge",以便系统将两个版本的内容合并。如果要替换标签,请使用replace
    【解决方案2】:

    选项 1

    每种口味都有AndroidManifest.xml

    • app/src/flavor1/AndroidManifest.xml
    • app/src/flavor2/AndroidManifest.xml
    • app/src/flavor3/AndroidManifest.xml

    选项 2

    将权限移入依赖产品风格的AndroidManifest.xml,并将活动和所有其他公共信息留在一个核心AndroidManifest.xml

    app/src/main/AndroidManifest.xml 包含有关活动的常见信息,......但没有权限

    <manifest  
    xmlns:android="http://schemas.android.com/apk/res/android">
    
    <!-- permissions are imported via brand-specific AndroidManifest.xml -->
    
    <!-- common manifest elements -->
    <application
        android:name=".ui.FSApplication"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name">
    
        <!-- activities -->
        <activity
            android:name=".ui.activities.SplashActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
    
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    
        <activity
            android:name=".ui.activities.SecondActivity/>
    
        <!-- receiver ->
        <receiver android:name=".receiver.BlogPostReceiver"/>
    
    </application>
    </manifest>  
    

    app/src/flavor1/AndroidManifest.xml 仅包含 flavor1 产品风味的权限

    <?xml version="1.0" encoding="utf-8"?>  
        <manifest xmlns:android="http://schemas.android.com/apk/res/android">  
        <uses-permission android:name="android.permission.INTERNET" />
    </manifest>  
    

    app/src/flavor2/AndroidManifest.xml 中的 flavor2 也是如此

    <?xml version="1.0" encoding="utf-8"?>  
    <manifest xmlns:android="http://schemas.android.com/apk/res/android">  
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    </manifest> 
    

    更多信息请查看this

    【讨论】:

    • 在选项 1 中,您仍然必须在主目录中有一个 Manifest
    • 在选项 2 中,为什么活动需要在主清单文件中?
    • 你会将所有对所有口味都有效的东西放在主要清单中,并将特色放在口味中。这既可以是活动也可以是权限,而活动在所有风格中都没有什么坏处,您可能不想在某些风格中声明不必要的权限。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 2013-11-13
    • 2020-03-02
    • 2015-11-26
    • 2014-03-20
    • 1970-01-01
    相关资源
    最近更新 更多