我正在尝试使用Android Build系统中的resConfig和resConfigs.
我的项目有这两个选项的问题,所以我用android studio开始了一个新的空白项目.我附上了我的build.gradle,我只在其中添加了resConfigs"en","fr"
android {
defaultConfig {
...
resConfigs "en", "fr"
...
}
}
Run Code Online (Sandbox Code Playgroud)
并定义了2种基本口味
productFlavors {
fr {
resConfig "fr"
}
en {
resConfig "en"
}
}
Run Code Online (Sandbox Code Playgroud)
然后我创建了一个2 strings.xml文件并翻译了hello_world默认标签
/src/main/res/values/strings.xml(默认)
/src/main/res/values-en/strings.xml
/src/main/res/values-fr/strings.xml
有了这个,我希望在MyApplication/app/builds/intermediates/res/en/debug中只看到3个值文件夹,因为我在resConfigs中定义只使用"en"和"fr"并过滤其他任何内容
/ values/
/values-en/
/values-fr /
虽然,所有语言值文件夹仍然在那里,所以resConfigs没有明显过滤任何东西.
我还希望在运行enDebug flavor变量时从values-en看到标签hello_world,因为我指定了flavor en将使用resConfig"en",尽管当我运行测试应用程序时,我看到来自/ values-fr/strings的标签. xml而不是/values-en/strings.xml,因为平板电脑上的语言配置为法语加拿大
我是否误解了resConfig背后的目的?如果是这样,我应该如何强制只使用语言运行并且不依赖于操作系统区域设置?此解决方案必须与flavorDimensions兼容,因为我在我正在尝试配置的真实应用程序中使用它们.
注意:我也提交了一个错误,因为我认为这个resConfig行为确实存在问题https://code.google.com/p/android/issues/detail?id=180694
谢谢
如何迭代每个不同类型项目的测试结果并将其收集到一个报告中?
Root Project
|
|- Java Project
|- test task
|
|- Android Library Project (has Build Types)
|- testDebug task
|- testRelease task
|
|- Android application Project (has Product Flavors and Build Types)
|- testFreeDebug task
|- testFreeRelease task
|- testPaidDebug task
|- testPaidRelease task
Run Code Online (Sandbox Code Playgroud)
到目前为止我所拥有的:
这将聚合所有项目的所有测试结果:
task aggregateResults(type: Copy) {
outputs.upToDateWhen { false }
subprojects { project ->
from { project*.testResultsDir }
}
into { file("$rootDir/$buildDir/results") }
}
task testReport(type: TestReport) {
outputs.upToDateWhen { false } …Run Code Online (Sandbox Code Playgroud) android gradle test-reporting android-gradle-plugin android-productflavors
我有一些应用程序的构建风格.我想一次构建所有不同风格的apks,并在my/output文件夹中找到它们.我不想选择每种风味并单独构建它.我怎样才能做到这一点?
我有android gradle构建的问题.长话短说,我创造了两种口味:
productFlavors{
abcDemoFree{
}
abcDemo{
}
}
Run Code Online (Sandbox Code Playgroud)
Eeach flavor为此活动提供了自己的Activity(Settings.java)和布局(settings_layout.xml).从main开始,两个文件都被删除了,因此Settings.java和settings_layout.xml只存在于各种风格中.
abcDemoFree
- java
- Settings.java
- res
- settings_layout.xml
abcDemo
- java
- Settings.java
- res
- settings_layout.xml
Run Code Online (Sandbox Code Playgroud)
Android Studio创建了4种构建变体:
abcDemoFreeDebug
abcDemoFreeRelease
abcDemoDebug
abcDemoRelease
Run Code Online (Sandbox Code Playgroud)
一切都很好,我能够创建apk我期待从每个味道的行为.问题是当我切换到一个buildVariant时,例如abcDemoDebug,android studio报告来自另一种风格的资源文件的bug,在我的例子中来自abcDemoFreeDegub/res/settings_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
这些线
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
Run Code Online (Sandbox Code Playgroud)
生成错误:URI未注册.
如何摆脱这些错误?或者这可能是正常行为?
在我的Android项目中,有几种产品风格:
buildTypes {
release {}
debug {}
staging {}
}
productFlavors {
freeVersion {}
proVersion {}
partnerVersion {}
}
Run Code Online (Sandbox Code Playgroud)
另外,我使用Google Analytics:
apply plugin: 'com.google.gms.google-services'
dependencies {
compile 'com.google.android.gms:play-services-analytics:8.4.0'
}
Run Code Online (Sandbox Code Playgroud)
如何在其中一个中排除google-services?例如,在:
freeVersion {}
Run Code Online (Sandbox Code Playgroud) 我们的应用程序中有2种产品口味,一种口味有一种类型(FlavorSpecificClass),另一种则没有.我们在src/test文件夹中对FlavorSpecificClass进行了junit测试,当我们在我们的核心变体上时,它将无法编译,因为该变体中不存在该类.
我找不到一种方法来为每个变体分别进行单元测试,除非我注释掉对FlavorSpecificClass的引用,否则代码不会在我们的核心变体中编译.我怎么能绕过这个?
我正在开发一个白色品牌的应用程序。
我们创建每个客户不同的风味并且每个客户都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)