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

时间:2017-03-02 18:52:29

标签: android android-manifest intentfilter

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

 <!-- 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将不会安装两个图标。但是,我无法运行主代码库,因为我没有在我的Manifest中声明一个入口点。相反,如果我从Flavor中删除intent-filter并将其保存在我的主代码库中,Flavor代码将无法运行。两个RegistrationActivity类是不同的,只是名称相同。 Legacy代码并没有真正共享更新的代码库。除了分成不同的项目之外的任何建议吗?

有些人要求我在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
    }

2 个答案:

答案 0 :(得分:1)

这一行:

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

说你有一个发起活动。将它们设置为默认活动设置(这只是“另一个活动”,创建第三个类,即启动器类。此类将根据您可能具有的任何规范自动重定向到另外两个活动之一,例如API级别或品牌。您有关于启动,设置它们的任何规范,用户将不知道有处理活动。

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

  

我该如何解决这个问题?如果我从更新的代码库中删除了intent-filter,它是主代码库,

请勿将其删除。更改。 E.g:

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

答案 1 :(得分:1)

您需要单独的<activity android:name="legacy.activity.RegistrationActivity"<activity android:name="updated.activity.RegistrationActivity"两个清单,每个清单一个。

例如:

src/main/AndroidManifest.xml(除了以下所有内容:* .activity.RegistrationActivity) src/legacy/AndroidManifest.xml(与legacy.activity.RegistrationActivity一起使用) src/updated/AndroidManifest.xml(使用updated.activity.RegistrationActivity)