android - 为什么 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% 相信这是正确的方法,但似乎对我的使用有意义。
感谢您的时间和建议。非常感激。
解决方案
好的,原来我的文件夹路径/文件夹结构错误;而且这里没有人会知道这一点,因为我什至没有发布它,因为我只是认为它是正确的。(呃,应该更清楚)
由于末尾的 applicationId 后缀,我自动假设我的包必须在末尾添加一个文件夹/路径,如下所示:
/src/release/java/com/example/android/app/release
经过一番来回,我终于查看了这条路径,发现它很奇怪,我最后会有一个以 release 为后缀的“发布根文件夹”。我刚刚删除了最后一个文件夹/路径并尝试了这种方式。瞧。这里全是白痴。xD
所以我的道路 - 显然 - 需要是这样的:
/src/release/java/com/example/android/app
然后我的 Android 清单中的包名也不再需要那个奇怪的后缀包名。(这也会导致我的代码中出现其他一些问题)
我怀疑很多人会遇到同样的愚蠢错误,但以防万一,我会留下这个话题并回答它,而不是删除我的耻辱。哈哈。
推荐阅读
- c - 是否有一种安全的方法来指定一个对象的值可能因为它从未被使用而未初始化?
- ios - 使用 CallKit 的 TokBox 音频会话问题
- c++ - SDL 和 SDL_image 程序在 Eclipse 中什么都不做
- javascript - 如何使用带有 createTextNode() 的列表的第一个子项
- php - PHP GuzzleHttp 。如何发送 json 帖子?
- android - 解析 UI 层次结构 XML 文件时出错:ubuntu 中的 ui automator 层次结构文件无效
- mysql - GROUP BY Id 和 DATE 时获取 COUNT 的 id
- android - 前台服务在奥利奥 10 分钟后停止提供位置更新
- reporting-services - Reporting Services (SSRS) 删除导出文件的名称
- sql - 在 SQL Server 2008 中使用 case 语句减去 2 行