我的应用程序中有两个构建变体,一个是标准应用程序版本,第二个是自定义应用程序.
productFlavors {
customConfig {
minSdkVersion 14
applicationId 'es.com.custom'
targetSdkVersion 22
versionCode 3
versionName '3.0.0'
}
standard {
minSdkVersion 14
applicationId 'es.com.standard'
targetSdkVersion 22
versionCode 3
versionName '3.0.0'
}
Run Code Online (Sandbox Code Playgroud)
对于自定义,我必须实现新功能,但仅用于自定义,因此标准版本将不提供这些新功能.我不确定我该做什么.
1.-两个类,一个具有标准要求,一个具有定制要求
2.-在标准类中执行以下操作:
if (getPackageName()==customConfig )
// do the custom things
else
//do the standard things
Run Code Online (Sandbox Code Playgroud) 我正在开发一个白色品牌的应用程序。
我们创建每个客户不同的风味并且每个客户都Debug和ProductionAPI的,所以我试图建立起来的摇篮。
我该怎么做?
这是我尝试过的:
buildTypes {
debug {
// some configurations
}
release {
// some configurations
}
}
flavorDimensions "client"
productFlavors {
company1{
dimension "client"
buildConfigField("String", "BASE_URL", "\"https://app.company1/devApi/\"")
}
company2 {
dimension "client"
buildConfigField("String", "BASE_URL", "\"https://app.company2/devApi/\"")
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:我希望能够为BASE_URL每个 Flavor 和 Buildtype定义一个不同的。
风味公司1,BuildType调试
https://app.company1.com/devApi/
Run Code Online (Sandbox Code Playgroud)
Flavor company1, BuildType 发布
https://app.company1.com/prodApi/
Run Code Online (Sandbox Code Playgroud)
风味公司2,BuildType调试
https://dev.company2.com/api/
Run Code Online (Sandbox Code Playgroud)
Flavor company2, BuildType 发布
https://prod.company2.com/api/
Run Code Online (Sandbox Code Playgroud) android android-gradle-plugin android-productflavors android-build-type
我正在尝试在我的应用程序中使用风味。我遵循了各种指南,但每次都因同样的问题而无法构建。(因为基本上每个博客文章和 SE 问题都引用相同的文章和资源,所以我不会再这样做了)
为了调试,我决定简化问题并启动一个新项目(正常示例项目),并添加风味,每种风味只有一个元素:应用程序。这有效。各种其他更复杂的属性,例如使用 res/values/strings.xml 作为应用程序标签也可以正常工作。
然后,我使用我的应用程序尝试了最简单的风味设置,其中的grade.build如下所示,然后很快就失败并出现相同的错误。
flavorDimensions "app"
productFlavors {
dev {
dimension "app"
}
qa {
dimension "app"
applicationId "com.example.app1"
}
}
Run Code Online (Sandbox Code Playgroud)
注意:我还使用单独的入口点来实现运行时配置。这按预期工作并且已经使用了一段时间。
johan@komp:~/AndroidStudioProjects/parent_lite$ flutter run --flavor qa -t lib/main-qa.dart
Using hardware rendering with device Android SDK built for x86. If you get graphics artifacts, consider enabling software rendering with "--enable-software-rendering".
Launching lib/main-qa.dart on Android SDK built for x86 in debug mode...
Initializing gradle... 0.4s
Resolving dependencies... 1.2s
Running Gradle task 'assembleQaDebug'...
Running Gradle task 'assembleQaDebug'... Done 1.1s …Run Code Online (Sandbox Code Playgroud) 我有一个扩展方法:
fun StoresClientFragment?.onClickButtonBack(){
this?.listener?.onStoresFragmentClickBtnMenu()
}
Run Code Online (Sandbox Code Playgroud)
应用程序安装没有任何错误;但是当在运行时调用该方法时,它会给出以下错误:
java.lang.NoSuchMethodError:类 Lcom/app/common_client/commons/CommonsAppTypeGroupKt 中没有静态方法 onClickButtonBack (Lcom/app/common_client/ui/fragment /stores/StoresClientFragment;) V;或其超类(“com.app.common_client.commons.CommonsAppTypeGroupKt”的声明出现在 /data/app/com.myapp.client-DWp0y3iNC3tsmBZkowlpfw==/base.apk!classes2.dex 中)。
我启用了多重索引
在 build.gradle 中
android {
defaultConfig {
multiDexEnabled = true
}
}
dependencies {
implementation 'androidx.multidex:multidex:2.0.1'
}
Run Code Online (Sandbox Code Playgroud)
在应用程序类中
class ApplicationClient : MultiDexApplication(){
}
Run Code Online (Sandbox Code Playgroud)
在清单中
<application
android:name=".commons.application.ApplicationClient"
Run Code Online (Sandbox Code Playgroud)
注意:我正在使用产品风格和模块,该方法位于某些产品风格共享的 src 中
sourceSets {
flavorA {
java.srcDirs + = "src/sharedFolder/java" //here is 'onClickButtonBack' method
}
flavorB {
java.srcDirs + = "src/sharedFolder/java"
}
}
Run Code Online (Sandbox Code Playgroud) android kotlin android-studio android-productflavors android-module
当我将 gradle 版本增加到gradle-7.3.3from时gradle-7.2,我收到一个 gradle 同步错误,内容是Multiple entries with same key: main=[] and main=[].
当我将 ProductFlavors 名称更改为mainCore或其他名称时main,gradle 同步时不会出现错误。
我想知道如何继续使用mainproductFlavor。有任何想法吗?
.....
flavorDimensions "mode", "client"
productFlavors {
/////// Distribution Modes ///////
main {
dimension "mode"
versionName generateVersionName()
manifestPlaceholders = [
app_label: "@string/app_name",
appIcon: "@mipmap/ic_launcher",
appIconRound: "@mipmap/ic_launcher_round"
]
}
beta {
dimension "mode"
applicationIdSuffix ".beta"
manifestPlaceholders = [
app_label: "@string/app_name",
appIcon: "@mipmap/ic_launcher_beta",
appIconRound: "@mipmap/ic_launcher_beta_round"
]
} .....
Run Code Online (Sandbox Code Playgroud) 我想在构建阶段对资产做一些事情.这是我的gradle脚本.
project.afterEvaluate{
prepareDependencies.dependsOn("generateMyAssets")
}
task generateMyAssets() {
copy {
from('/') {
include '**/*.html'
filter {
line -> line.replaceAll(/(<img src=\")(?!(.*:.*))/, '<img src="assets:')
}
}
into 'assetsRegxped/'
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果有味道,如何灵活检索资产文件夹的名称(路径).另外我怎么才能改变构建版本?
我想基于不同的productFlavor构建我的应用程序的不同版本,但需要一定程度的灵活性,这是我无法实现的.
这是我的文件夹结构:
+src
+main
+java
+res
+base
+java
+res
+custom1
+java
+res
+custom2
+res
Run Code Online (Sandbox Code Playgroud)
公共代码在main(服务)上,基础ui在base(活动)上.然后定义新UI的应用程序的自定义版本在custom1(新活动)上.这个运行正常.但我需要使用基础 ui的另一个版本的应用程序(custom2),但需要更改一些res(图标,字符串或颜色).
我在build.gradle文件中尝试的是:
android{
...
productFlavors {
base {
...
}
custom1 {
...
}
custom2 {
...
}
}
sourceSets{
custom2{
java.srcDirs = ['src/base/java']
res.srcDirs = ['src/custom2/res', 'src/base/res']
}
}
}
Run Code Online (Sandbox Code Playgroud)
要指定CUSTOM2将使用源代码和资源基地和资源CUSTOM2.
问题是我得到了:
Error: Duplicate resources: <project_path>/src/base/res/values-es/strings.xml:string-en/app_name, <project_path>/src/custom2/res/values-es/strings.xml:string-en/app_name
Run Code Online (Sandbox Code Playgroud)
由于app_name定义上都基地和CUSTOM2,但我的目标是覆盖资源的定义在基地与的个CUSTOM2 …
android gradle android-studio build.gradle android-productflavors
在build.gradle,我有产品口味设置:
productFlavors
{
AlternateFlavour
{
applicationId "com.myapp.alternateflavour"
}
}
Run Code Online (Sandbox Code Playgroud)
然后在sourceSets部分中,我为这些风格使用不同的资源,资产和清单目录:
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
AlternateFlavour {
manifest.srcFile 'manifest-tmp/AlternateFlavour/AndroidManifest.xml'
java.srcDirs = ['src']
res.srcDirs = ['res-tmp/AlternateFlavour']
assets.srcDirs = ['assets-tmp/AlternateFlavour']
}
}
Run Code Online (Sandbox Code Playgroud)
好到目前为止.
在那个由部分自动生成的风味使用的清单中,我有:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.myapp.myapp"
android:versionCode="1010001"
android:versionName="V1.1.0.1" >
Run Code Online (Sandbox Code Playgroud)
但在根项目的原始清单中如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.myapp.myapp"
android:versionCode="1010000"
android:versionName="V1.1.0.DEBUG" >
Run Code Online (Sandbox Code Playgroud)
这会导致Gradle失败:
Error:
Attribute manifest@versionCode value=(1010001) from AndroidManifest.xml:4:5-28
is also present at AndroidManifest.xml:4:5-28 value=(1010000).
Attributes of <manifest> …Run Code Online (Sandbox Code Playgroud) android gradle android-build android-productflavors android-build-flavors
我有一个build.gradle文件设置与以下(我显然排除了为简洁起见无关紧要的部分):
android { defaultConfig { ndk { abiFilters 'armeabi', 'armeabi-v7a', 'x86' } }
productFlavors {
flavor1 { ... }
flavor2 { ... }
flavor3 { ... }
flavor4 { ... }
flavor5 { ... }
}
buildTypes {
debug {
externalNativeBuild { ndkBuild { cFlags '-DDEBUG' } }
...
}
release {
externalNativeBuild { ndkBuild { cFlags '-DRELEASE' } }
...
}
}
externalNativeBuild {
ndkBuild {
path 'jni/Android.mk'
}
}
Run Code Online (Sandbox Code Playgroud)
它工作,但它编译每个flavor + buildType的本机代码.所以不仅调试和发布,而且还有flavor1Debug,flavor2Release等,这需要永远
我如何告诉gradle只为两种构建类型执行externalNativeBuild,并将它们用于所有类型?
android gradle android-ndk android-gradle-plugin android-productflavors
是否可以对所有口味进行一次声纳分析?我有一个多风格的 Android 项目,其中不同风格文件夹中的某些文件有不同的实现。这些文件在风味测试文件夹中有相应的测试。所以在示例中我的 src 结构是:
/main/java/../ConfigurationService.kt
/flavor1/java/../ConfigurationService.kt
/flavor2/java/../ConfigurationService.kt
/test/java/../ConfigurationServiceTests.kt
/testFlavor1/java/../ConfigurationServiceTests.kt
/testFlavor2/java/../ConfigurationServiceTests.kt
Run Code Online (Sandbox Code Playgroud)
现在我可以使用,sonarqube.androidVariant但这会让我一次只能配置一个变体,所以如果我想检查第二种风格的分析,我需要使用不同的设置再次运行该任务,而这在 Gitlab CI 中无法显示多个变体分析。我能够在运行声纳之前配置单独的 jacoco 任务来生成所有类型的覆盖率报告。然后我尝试将源目录添加到 sonarplugin,如下所示:
sonarqube {
properties {
//standard plugin configuration
android.libraryVariants.each { variant ->
if (variant.buildType.name != "debug") return //we run sonar only on debug
def variantName = variant.name
def flavorName = variant.flavorName
properties["sonar.sources"] += "./src/${flavorName}/"
properties["sonar.tests"] += "./src/test${flavorName.capitalize()}"
// and so on for binaries, jacoco report paths etc.
}
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这最终会出现错误:
ConfigurationService.kt can't be indexed twice. Please check that inclusion/exclusion patterns …Run Code Online (Sandbox Code Playgroud) gradle sonarqube android-productflavors android-build-flavors
android ×8
gradle ×6
android-ndk ×1
build ×1
build.gradle ×1
flutter ×1
gradlew ×1
kotlin ×1
sonarqube ×1