首页 > 解决方案 > 为什么 Android Manifast 找不到我的活动?(使用带有应用程序后缀的构建变体时)

问题描述

感谢您的阅读和任何建议。我对 Android 还是很陌生(不到一年),到目前为止,在构建应用程序时只使用一种构建类型/变体(主要),现在我正在尝试创建 3 种不同的构建变体,以期待一个测试发布。(非常像在此页面上找到的:https ://developer.android.com/studio/build/build-variants#build-types )所以我现在正在尝试将其分离出来。

我的变体应为 .debug、.release。和 .staging 。我没有尝试使用 productFlavors,因为我的应用程序并没有单独的版本,只有这 3 个不同的构建变体。我不确定我是否必须使用产品风味,但对我来说(到目前为止)它似乎并不真正适用于我的应用程序。(如有不妥请指教)

我的应用程序也使用 google-services/Firebase,但那部分似乎对我有用。(每个构建变体的单独 google json 文件)

这是我的 gradle 的摘录:(我使用了与我所拥有的相对应的通用包名称)

android {
    {...}
    defaultConfig {
        applicationId "com.example.android.app"
        {...}
    }
    
    signingConfigs {
        {...}
    }
    buildTypes {
        release {
            applicationIdSuffix ".release"
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
          {...}
        }
        debug {
            applicationIdSuffix ".debug"
            debuggable true
            {...}
        }
        staging {
            initWith debug
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            applicationIdSuffix ".staging"
            signingConfig signingConfigs.staging
        }

    }
    sourceSets {        
        debug {
            setRoot 'src/debug'
            manifest.srcFile 'src/debug/AndroidManifest.xml'
        }
        staging {
            setRoot 'src/staging'
            manifest.srcFile 'src/staging/AndroidManifest.xml'
        }
        release {
            setRoot 'src/release'
            manifest.srcFile 'src/release/AndroidManifest.xml'
        }
    }
    {...}
}

这是我的清单标题:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.android.app.staging">

所以首先,因为我现在在我的 gradle 中指定了我的构建变体和应用程序后缀,所以它会引发以下错误:(但也许这已经是不正确的地方了)

清单合并失败:覆盖清单:在 AndroidManifest.xml:9:5-60 声明的包属性 value=(com.example.android.app.staging) 声明了不同的 value=(com.example.android.app.staging)在 AndroidManifest.xml:8:5-52 的主清单中 建议:删除 AndroidManifest.xml 中的覆盖声明并将其放在 build.gradle 中:flavorName { applicationId = "com.example.android.app.staging" }

但是当我删除package="com.example.android.app.staging"我的所有活动时,我再也找不到了,因为我想他们是从包属性中获取引用的。(删除包属性后,所有活动都变为红色,因此找不到ergo。(android:name=".MainActivity")。

我想补充一点,如果该信息相关,我仍然有我的“主要”srcSet,包括清单。我想一旦我把这一切分开,我会(我可以吗?)摆脱它/清空它。

那么,我需要做些什么才能在每个构建变体的每个清单中保持引用的完整性?

我想我可以将每个 Manifest 中的所有这些活动名称更改为:(android:name="com.example.android.app.staging.MainActivity"或 .release/.debug)但我认为构建工具会自动执行此操作 - 或者这是我必须做的吗?

我的目标只是拥有 3 个构建变体(.debug、.staging 和 .release)。在应用程序发布方面没有太多经验我不是 100% 相信这是正确的方法,但似乎对我的使用有意义。

感谢您的时间和建议。非常感激。

标签: androidandroid-studiobuild.gradleandroid-manifest

解决方案


好的,原来我的文件夹路径/文件夹结构错误;而且这里没有人会知道这一点,因为我什至没有发布它,因为我只是认为它是正确的。(呃,应该更清楚)

由于末尾的 applicationId 后缀,我自动假设我的包必须在末尾添加一个文件夹/路径,如下所示:

/src/release/java/com/example/android/app/release

经过一番来回,我终于查看了这条路径,发现它很奇怪,我最后会有一个以 release 为后缀的“发布根文件夹”。我刚刚删除了最后一个文件夹/路径并尝试了这种方式。瞧。这里全是白痴。xD

所以我的道路 - 显然 - 需要是这样的:

/src/release/java/com/example/android/app

然后我的 Android 清单中的包名也不再需要那个奇怪的后缀包名。(这也会导致我的代码中出现其他一些问题)

我怀疑很多人会遇到同样的愚蠢错误,但以防万一,我会留下这个话题并回答它,而不是删除我的耻辱。哈哈。


推荐阅读