问题描述
感谢您的阅读和任何建议。我对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中的程序包名称也将不再需要带有奇数后缀的程序包名称。(这也会导致我的代码中出现其他一些问题)
我怀疑很多人都会遇到同样的愚蠢错误,但是以防万一,我会保留这个话题并回答,而不是丢掉我的耻辱。哈哈。