Android Manifast为什么找不到我的活动? 当使用带有应用后缀的构建变体时

问题描述

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

我的变体应为.debug,.release。和.staging。我并不是要使用productFlavors,因为我的应用程序确实没有单独的版本,只有这3种不同的构建版本。我不确定我是否必须使用Flavors产品,但对我而言(到目前为止)看来,它实际上并不适用于我的应用程序。 (请告知是否错误

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

这是我的毕业典礼的摘录:(我使用的通用软件包名称与我拥有的名称相对应)

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) 在AndroidManifest.xml:8:5-52的主清单中声明了不同的value =(com.example.android.app.staging) 建议:在AndroidManifest.xml上删除覆盖声明,并将其放置在build.gradle中: flavourName { applicationId =“ com.example.android.app.staging” }

但是,当我删除package="com.example.android.app.staging"时,我的所有活动都不再能找到,因为我想他们是从package属性中获得引用的。 (在删除属性后,所有活动都会变为红色,因此无法找到人为因素。(android:name=".MainActivity")。

我想补充一点,如果该信息相关的话,我仍然有包括清单在内的“主要” srcSet。我想一旦将所有这些分离,就可以(可以吗?)将其清除/清空。

那我该怎么做才能在每个清单中为每个构建变体保持引用完好无损?

我想我可以将每个清单中的所有活动名称更改为类似以下内容android:name="com.example.android.app.staging.MainActivity"(或.release / .debug),但我认为构建工具会自动执行此操作-或这就是我所要做的必须做什么?

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

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

解决方法

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

因为最后有applicationId后缀,所以我自动假定我的程序包必须在末尾添加一个文件夹/路径,如下所示:

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

经过一番来回的摸索,我终于看了一下这个路径,发现它很奇怪,我会在最后加上一个以release为后缀的“ release root folder”。我只是删除了最后一个文件夹/路径并尝试了这种方式。 E voila。这里满是白痴。 xD

所以我的路径-很明显-必须是这样的:

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

然后,我在Android Manifests中的程序包名称也将不再需要带有奇数后缀的程序包名称。(这也会导致我的代码中出现其他一些问题)

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