为什么 Android Manifast 找不到我的活动? (使用带有应用程序后缀的构建变体时)
Why can't Android Manifast find my Activities? (when using Build Variants with Application Suffixes)
感谢您的阅读和任何建议。我对 Android(不到一年)还是很陌生,到目前为止在构建应用程序时只使用过一个构建 type/variant(主要),现在正在尝试创建 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'
}
}
{...}
}
这是我的清单 Header:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.android.app.staging">
所以首先,因为我现在在我的 gradle 中指定了我的构建变体和应用程序后缀,它会抛出以下错误:(但也许这是已经不正确的地方)
Manifest merger failed : Overlay manifest:package attribute declared at AndroidManifest.xml:9:5-60 value=(com.example.android.app.staging)
has a different value=(com.example.android.app.staging) declared in main manifest at AndroidManifest.xml:8:5-52
Suggestion: remove the overlay declaration at AndroidManifest.xml and place it in the build.gradle:
flavorName {
applicationId = "com.example.android.app.staging"
}
但是当我删除 package="com.example.android.app.staging"
时,我所有的活动都找不到了,因为我想他们是从包属性中获取引用的。 (删除包属性后,所有活动都变成红色,因此找不到。(android:name=".MainActivity"
)。
我想补充一点,如果该信息相关的话,我仍然有我的“主要”srcSet,包括清单。我想一旦我把所有这些都分开了,我会(我可以吗?)摆脱掉 it/empty 它。
那么我需要做什么才能在每个构建变体的每个清单中保持引用的完整性?
我想我可以将每个清单中的所有这些 activity 名称更改为:android:name="com.example.android.app.staging.MainActivity"
(或 .release/.debug)但我认为构建工具会自动执行此操作 - - 或者这是我必须做的?
我的目标只是拥有 3 个构建变体(.debug、.staging 和 .release)。在应用程序发布方面没有太多经验,我不是 100% 确信这是正确的方法,但似乎对我的使用有意义。
感谢您的宝贵时间和建议。非常感谢。
好的,原来我的文件夹 path/folder 结构有误;这里没有人会知道这一点,因为我什至 post 都不知道,因为我只是假设它是正确的。 (呃,应该知道得更好)
因为applicationId后缀在最后,我自动假设我的包必须在最后添加一个folder/path,像这样:
/src/release/java/com/example/android/app/release
折腾了好久终于看了这条路,觉得奇怪,最后会有一个后缀为release的“release root folder”。我刚刚删除了最后一个 folder/path 并尝试了那样。瞧。这里全是白痴。 xD
所以我的路径 - 显然 - 需要是这样的:
/src/release/java/com/example/android/app
然后我的 Android 清单中的包名称也不再需要那个奇怪的后缀包名称。(这也会导致我的代码中出现其他一些问题)
我怀疑很多人会 运行 犯同样的愚蠢错误,但为了以防万一,我会留下这个话题并回答它,而不是删除我的耻辱。哈哈
感谢您的阅读和任何建议。我对 Android(不到一年)还是很陌生,到目前为止在构建应用程序时只使用过一个构建 type/variant(主要),现在正在尝试创建 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'
}
}
{...}
}
这是我的清单 Header:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.android.app.staging">
所以首先,因为我现在在我的 gradle 中指定了我的构建变体和应用程序后缀,它会抛出以下错误:(但也许这是已经不正确的地方)
Manifest merger failed : Overlay manifest:package attribute declared at AndroidManifest.xml:9:5-60 value=(com.example.android.app.staging) has a different value=(com.example.android.app.staging) declared in main manifest at AndroidManifest.xml:8:5-52 Suggestion: remove the overlay declaration at AndroidManifest.xml and place it in the build.gradle: flavorName { applicationId = "com.example.android.app.staging" }
但是当我删除 package="com.example.android.app.staging"
时,我所有的活动都找不到了,因为我想他们是从包属性中获取引用的。 (删除包属性后,所有活动都变成红色,因此找不到。(android:name=".MainActivity"
)。
我想补充一点,如果该信息相关的话,我仍然有我的“主要”srcSet,包括清单。我想一旦我把所有这些都分开了,我会(我可以吗?)摆脱掉 it/empty 它。
那么我需要做什么才能在每个构建变体的每个清单中保持引用的完整性?
我想我可以将每个清单中的所有这些 activity 名称更改为:android:name="com.example.android.app.staging.MainActivity"
(或 .release/.debug)但我认为构建工具会自动执行此操作 - - 或者这是我必须做的?
我的目标只是拥有 3 个构建变体(.debug、.staging 和 .release)。在应用程序发布方面没有太多经验,我不是 100% 确信这是正确的方法,但似乎对我的使用有意义。
感谢您的宝贵时间和建议。非常感谢。
好的,原来我的文件夹 path/folder 结构有误;这里没有人会知道这一点,因为我什至 post 都不知道,因为我只是假设它是正确的。 (呃,应该知道得更好)
因为applicationId后缀在最后,我自动假设我的包必须在最后添加一个folder/path,像这样:
/src/release/java/com/example/android/app/release
折腾了好久终于看了这条路,觉得奇怪,最后会有一个后缀为release的“release root folder”。我刚刚删除了最后一个 folder/path 并尝试了那样。瞧。这里全是白痴。 xD
所以我的路径 - 显然 - 需要是这样的:
/src/release/java/com/example/android/app
然后我的 Android 清单中的包名称也不再需要那个奇怪的后缀包名称。(这也会导致我的代码中出现其他一些问题)
我怀疑很多人会 运行 犯同样的愚蠢错误,但为了以防万一,我会留下这个话题并回答它,而不是删除我的耻辱。哈哈