使用 Flavors 和多个清单文件时安装了多个应用程序图标

Multiple app icons being installed when using Flavors and multiple manifest files

我目前有一个项目需要包含两种不同形式的代码库,即应用程序的遗留版本和更新版本。为此,我正在使用 Flavors,但 运行 遇到了安装两个应用程序图标的问题。原因是因为遗留代码库和更新后的代码库都有自己的 manifest.xml,并且在清单中是用于标识主启动 class 及其相关应用程序图标的声明。

 <!-- legacy code manifest -->
    <activity
        android:name="legacy.activity.RegistrationActivity"
        android:configChanges="orientation|screenSize"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:theme="@style/CustomAppTheme"
        android:windowSoftInputMode="adjustResize">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>

    <!-- updated code manifest -->
    <activity
        android:name="updated.activity.RegistrationActivity"
        android:configChanges="orientation|screenSize"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:theme="@style/CustomAppTheme"
        android:windowSoftInputMode="adjustResize">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>

我该如何解决这个问题?如果我从更新的代码库(即主代码库)中删除 intent-filter,Flavor 将不会安装两个图标。但是,我无法 运行 主代码库,因为我没有在我的清单中声明入口点。相反,如果我从 Flavor 中删除 intent-filter 并将其保留在我的主代码库中,Flavor 代码将不会 运行。两个RegistrationActivityclass不同,只是同名。遗留代码并没有真正共享很多更新的代码库。除了分成不同的项目之外还有什么建议吗?

有些人要求我在 gradle 中使用 Flavors 进行设置,这是它的快照。

productFlavors {
    standard {
        applicationId 'updated.android.example'
        manifestPlaceholders = [package_name: "updated.android.example", primary_lang: "en"]
        signingConfig signingConfigs.keystore
    }
    legacyTest {
        applicationId 'legacy.android.example.debug'
        manifestPlaceholders = [package_name: "legacy.android.example.debug",
                                target      : "Test", primary_lang: "en"]
        signingConfig signingConfigs.keystore
    }
    legacyProd {
        applicationId 'legacy.android.example.prod'
        manifestPlaceholders = [package_name: "legacy.android.example.prod",
                                target      : "Prod", primary_lang: "en"]
        signingConfig signingConfigs.keystore
    }

这一行:

<category android:name="android.intent.category.LAUNCHER"/>

说你有发射 activity。将它们设置为默认 activity 设置(这只是 "another activity",创建第三个 class 即启动器 - class。此 class 将自动重定向到根据您可能拥有的任何规格(例如 API 级别或品牌)的其他两个活动之一。您拥有关于启动的任何规格,设置它们并且用户将不知道有一个处理 activity.

当您有两个启动器活动时,它们显示为两个应用程序。这可能是因为系统无法确定自动重定向到什么。所以有两个取决于要启动什么。

How can I get around this? If I remove the intent-filter from the updated code base, which is the Main codebase,

不要删除它。更改。例如:

       <intent-filter>
            <action android:name="com.yourpackage.name.CLASSNAME" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>

您需要分开 <activity android:name="legacy.activity.RegistrationActivity"<activity android:name="updated.activity.RegistrationActivity" 两个清单,每种口味一个。

例如:

src/main/AndroidManifest.xml(除了:*.activity.RegistrationActivity) src/legacy/AndroidManifest.xml(有遗产。activity.RegistrationActivity) src/updated/AndroidManifest.xml(已更新。activity.RegistrationActivity)