我正在创建一个非常简单的应用程序,具有免费和付费版本,为此我使用 Android Gradle 插件中出色的 ProductFlavors 功能。我了解应该如何配置 build.gradle 文件并编写它,所以我的构建选项是:
看起来如下
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
signingConfig signingConfigs.someconfig
}
}
productFlavors {
free {
packageName "com.somepackagename.appfree"
}
paid {
packageName "com.somepackagename.appPaid"
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,我想做的就是限制一些功能并将 AdMod 添加到免费版本中,我该怎么做?我是否在主 java 类中添加 if-else 语句来检查它是免费还是付费?或者我可以覆盖免费目录中的java类吗?我该怎么做呢?
有没有可能一种味道是基于另一种味道的?
例如 构建.gradle:
productFlavors {
flavor1 {
flavorBase "main"
}
flavor2 {
flavorBase "main"
}
flavor3 {
flavorBase "main"
}
flavor4 {
flavorBase "flavor3"
}
flavor5 {
flavorBase "flavor3"
}
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试制作两种风格的应用程序。
摇篮:
defaultConfig {
applicationId "be.myname.firstapp"
minSdkVersion 15
targetSdkVersion 23 }
productFlavors {
raterate {
applicationId = "be.myname.firstapp"
}
scarsforlife {
applicationId = "be.myname.secondapp"
}
}
Run Code Online (Sandbox Code Playgroud)
我的主文件夹、fistapp 文件夹和 secondaryapp 文件夹中有一个 AndroidManifest。
第一个文件夹中的包名称:be.myname.fistapp,第二个文件夹中的包名称:be.myname.secondapp。
在主文件夹中,我首先有:be.myname.firstapp,但这与 be.myname.secondapp 冲突。现在我尝试了:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="${packageId}">
</manifest>
Run Code Online (Sandbox Code Playgroud)
并得到这个:
Attribute manifest@package at AndroidManifest.xml:3:5-27 requires a placeholder substitution but no value for <packageId> is provided.
AndroidManifest.xml Error:
Overlay manifest:package attribute declared at AndroidManifest.xml:3:5-45 value=(be.myname.secondapp)
has a different value=(be.myname.secondapp) declared in main manifest at AndroidManifest.xml:3:5-27
Suggestion: remove the …Run Code Online (Sandbox Code Playgroud) android模块和风格之间的主要区别是什么?
来自模块定义 https://developer.android.com/studio/projects/add-app-module.html
模块为应用程序的源代码、资源文件和应用程序级别设置(例如模块级别构建文件和 Android 清单文件)提供容器。每个模块都可以独立构建、测试和调试。
但对于口味我也可以说同样的话。
有人可以指出这两者之间的主要区别吗?
例如,我有一个 gradle 构建,如下所示:
signingConfigs {
configFlavor1 {
keyAlias 'alias1'
keyPassword 'password1'
storeFile file('location1')
storePassword 'password1'
v1SigningEnabled true
v2SigningEnabled true
}
configFlavor2 {
keyAlias 'alias2'
keyPassword 'password2'
storeFile file('location2')
storePassword 'password2'
v1SigningEnabled true
v2SigningEnabled true
}
configFlavor3 {
keyAlias 'alias3'
keyPassword 'password3'
storeFile file('location3')
storePassword 'password3'
v1SigningEnabled true
v2SigningEnabled true
}
}
flavorDimensions "dimen1", "dimen2"
productFlavors {
flavor1 {
dimension "dimen1"
}
flavor2 {
dimension "dimen1"
}
testing {
dimension "dimen2"
}
dev {
dimension "dimen2"
}
prod {
dimension "dimen2" …Run Code Online (Sandbox Code Playgroud) android gradle android-productflavors android-flavordimension android-signing
我有一个core模块是我的应用程序的基础。该模块有 2 种风格。当我尝试将其导入到app没有风味的模块中时,我收到以下错误:
> Could not resolve all task dependencies for configuration ':app:releaseRuntimeClasspath'.
> Could not resolve project :core.
Required by:
project :app
> Project :app declares a dependency from configuration 'implementation' to configuration 'internalRelease' which is not declared in the descriptor for project :core.
Run Code Online (Sandbox Code Playgroud)
这是我的核心 build.gradle 配置:
android {
compileSdkVersion 27
publishNonDefault true
defaultConfig {
minSdkVersion 16
targetSdkVersion 27
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
} …Run Code Online (Sandbox Code Playgroud) android build.gradle android-gradle-plugin android-productflavors android-build-flavors
小例子将描述这种情况:
flavorDimensions 'shape', 'api'
productFlavors {
fruit {
dimension "shape"
}
vegtable {
dimension "shape"
}
production {
dimension "api"
}
development {
dimension "api"
}
}
Run Code Online (Sandbox Code Playgroud)
任务: 我需要为fruitProduction和fruitDevelopment风格保留不同的签名配置。
我研究了 gradle 文档,但没有找到合适的任务,可以覆盖特殊风格的配置。
android android-productflavors android-build-flavors android-flavors apk-signing
例如,我有 3 个模块(A、B 和 C),其中 A 依赖于 B,B 依赖于 C(A->B->C)。模块 A 是构建过程的入口点,没有其他模块依赖于它,例如 Android 应用程序中的 :app 模块。模块 A 和 C 具有相同的风味维度和相同的风味集(例如风味 1、风味 2、风味 3、风味 4 等)。模块 B 没有任何风格。
现在的问题是:如何将这些依赖关系定义为“可传递的”,使模块 A i 模块 C 的风格始终匹配?
模块 A(风味 1) -> 模块 B -> 模块 C(风味 1)
模块 A(风味 2) -> 模块 B -> 模块 C(风味 2)
模块 A(口味 3) -> 模块 B -> 模块 C(口味 3)
ETC..
如果所有 3 个模块具有相同的风格,Gradle 会自动匹配它们,但由于 B 没有风格,因此会发生错误,这已在这个问题中描述过:Singleflavor module based on multi Flavor Library in Gradle but non …
android gradle android-gradle-plugin android-productflavors android-build-flavors
大约一周前,我开始开发一个白标应用程序,其中每个应用程序唯一不同的是一些颜色值、图像源和 API 端点,但应用程序本身执行完全相同的操作。
因此,在过去的几天里,我尝试学习如何从同一个项目构建多个应用程序...(这里主要关注 Android)在我的旅程中,我找到了一些指南,并设法通过遵循本指南来使其工作在我的 build.gradle 中设置产品风格。
productFlavors {
firstapp {
applicationIdSuffix '.firstapp'
resValue "string", "build_config_package", "com.myapp"
}
secondapp {
applicationIdSuffix '.secondapp'
resValue "string", "build_config_package", "com.myapp"
}
}
Run Code Online (Sandbox Code Playgroud)
好的,现在我可以react-native run-android --variant=firstappDebug在开发时运行模拟应用程序,然后在发布时模拟应用程序gradlew assembleFirstappRelease,并能够生成多个(在本例中为 2 个)不同的构建。
但是,由于我是一个初学者,我无法找到正确的方法来编写特定风格的代码,以便在我为特定风格构建时呈现。
此外,我遵循了其他指南,或多或少地展示了如何做到这一点,但同样,我缺乏正确执行某些步骤的知识,所以我失败了。我不知道应该在哪个文件中纠正第 2 步中的代码,也不知道第 3 步BuildConfig.FLAVOR中的、NSBundle.mainBundle()和是什么, UtilityManager.getTarget()RNBuildConfig.FLAVOR
总之......我仍在努力学习以成长,我会更深入地研究环境变量......但我觉得有必要向社区寻求帮助。
我想针对我的应用程序的特定风格禁用 R8(因此设置 android.enableR8=false)。有谁知道该怎么做,或者是否可能?我可以以某种方式指定 gradle.properties 文件吗?或者它如何工作?
android ×9
gradle ×4
apk-signing ×1
build ×1
build.gradle ×1
java ×1
javascript ×1
react-native ×1