我有app应该有两种口味:免费和付费.两个版本分别完美运行.但是当我想立刻安装其中的两个时,我收到错误:[INSTALL_FAILED_CONFLICTING_PROVIDER].我试图改变android:authorities和buildConfigField值完全不同但它不会改变任何东西 - 应用程序将无法安装.我还删除了主Android Manifest中的提供者声明 - 没有.请帮我.
我的文件夹结构:
src
|- free
| |- AndroidManifest.xml
|- main
| |- all files and res catalogues (java, res, values etc.)
| |- AndroidManifest.xml
|- premium
|- AndroidManifest.cml
Run Code Online (Sandbox Code Playgroud)
我的gradle文件:
apply plugin: 'com.android.application'
android {
compileSdkVersion 19
buildToolsVersion '20.0.0'
final PROVIDER_FREE = "com.example.free.contentprovider"
final PROVIDER_PRO = "com.example.pro.contentprovider"
defaultConfig {
minSdkVersion 14
targetSdkVersion 20
}
buildTypes {
release {
minifyEnabled false // new version
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
productFlavors {
free {
applicationId "com.example.free"
versionCode 141201004 …Run Code Online (Sandbox Code Playgroud) java android gradle android-contentprovider android-productflavors
正如标题所说,这就是问题所在.我有一个带有模块的android风格的应用程序.该应用程序在android-studio和TeamCity服务器中使用gradle编译.我们有自定义任务来创建看起来像这样的代码覆盖:
task codeCoverageReport(type: JacocoReport) {
// Gather execution data from all subprojects
executionData fileTree(project.rootDir.absolutePath).include("**/build/jacoco/*.exec")
//Build class & source dirs
def classExcludes =['**/R.class',
'**/R$*.class',
'**/BuildConfig.class',
'**/*$InjectAdapter*.class',
'**/*$ModuleAdapter*.class',
'**/*$ViewInjector*.class']
sourceDirectories = files();
classDirectories = files();
subprojects.each{
sourceDirectories += files(it.projectDir.absolutePath + '/src/main/java')
def path1 = it.buildDir.absolutePath + '/intermediates/classes/debug'
def path2 = it.buildDir.absolutePath + '/classes/main'
classDirectories += fileTree(dir: path1, excludes: classExcludes, includes: ['**/*.class'])
classDirectories += fileTree(dir: path2, excludes: classExcludes, includes: ['**/*.class'])
}
reports {
xml.enabled true
html.enabled true
html.destination "${buildDir}/reports/jacoco"
csv.enabled false
}
doFirst …Run Code Online (Sandbox Code Playgroud) 所以这有点有趣,我不确定如何在android studio中设置它.我有几个模块,我在各种应用程序中使用了一些可重用的组件,但是使用flavor将某些主题注入可重用组件会很不错.我没有为我编写的每个应用程序的每个组件创建新的风格,而是考虑使用1个主题模块,每个我编写的应用程序都有一个风味,它有颜色方案等等.这是我想要它设置的方式:
App1: dependencies reusable lib1 reusable lib3 reusable lib4 theme - App1 flavor App2: dependencies reusable lib1 reusable lib2 reusable lib4 theme - App2 flavor
现在我更喜欢可重用的libs可以简单地依赖于主题而不需要知道要构建哪种风格,并且主要的应用程序proj依赖于主题可以引用该应用程序的风格(使用此答案/sf/answers/1702129341/).原因是每个可重用模块都不能在其build.gradle依赖项中使用单个应用程序,否则会破坏引用它们的其他应用程序.为每个我写的应用程序制作每个可重用模块的味道也很繁琐.有没有办法实现这样的事情?这是我试过的:
App1 build.gradle:
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:22.1.1'
compile project(path: ':Theme', configuration: 'app1Release')
compile project(':Lib1')
compile project(':Lib2')
compile project(':Lib4')
}
Run Code Online (Sandbox Code Playgroud)
App2 build.gradle:
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:22.1.1'
compile project(path: ':Theme', configuration: 'app2Release')
compile project(':Lib1')
compile project(':Lib3')
compile project(':Lib4')
}
Run Code Online (Sandbox Code Playgroud)
Lib1 build.gradle:
dependencies {
compile …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
我正在设置一个包含不同productFlavor的Android库.图书馆有轻盈和完整的味道.文件设置正确:
src/main/java/com/example/...用于轻类的
src/full/java/com/example/...完整类的主
src/light/java/com/example/...类
Android Studio正确地理解了这一点,并添加了一个(full)完整的味道.
问题:依赖关系okhttp是按预期工作但不是appcompat-v7.使用一切ViewPager,FragmentActivity,RecyclerView.我已经尝试添加依赖项,fullCompile但它也没有用.Android Studio无法解析依赖关系,导入无法正常工作,除了确定okhttp,exoplayer依此类推.
我试过Invalidate Cache/Restart,clean Project,Resync gradle,没有工作.
图书馆 build.gradle
apply plugin: 'com.android.library'
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
...
buildTypes {
release {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
minifyEnabled false
}
}
lintOptions {
abortOnError false
}
publishNonDefault true
productFlavors { …Run Code Online (Sandbox Code Playgroud) android android-support-library android-gradle-plugin android-productflavors
我们遇到了一个项目的问题,该项目具有多个(2)产品风味尺寸和磨损模块.在构建一个版本时,我们没有编译错误,手机应用程序工作,但磨损应用程序永远不会同步观看.
手机应用模块build.gradle包含(示例和仅提取)
flavorDimensions 'brand', 'type'
productFlavors {
nikon {
dimension 'brand'
}
canon {
dimension 'brand'
}
compact {
dimension 'type'
}
slr {
dimension 'type'
}
}
dependencies {
wearApp project(':wear')
}
Run Code Online (Sandbox Code Playgroud)
Wear app模块build.gradle包含相同的尺寸配置
publishNonDefault true
flavorDimensions 'brand', 'type'
productFlavors {
nikon {
dimension 'brand'
}
canon {
dimension 'brand'
}
compact {
dimension 'type'
}
slr {
dimension 'type'
}
}
dependencies {
}
Run Code Online (Sandbox Code Playgroud)
我们检查了磨损应用程序是否在apk中通过安装在手机上并触发官方android穿戴应用程序的磨损应用程序同步选项.在日志记录中,您packageId可以获得同步观察的s 的概述:
I/WearablePkgInstaller: Setting DataItem …Run Code Online (Sandbox Code Playgroud) android build.gradle android-gradle-plugin android-productflavors wear-os
我对多维风格的 test 和 androidTest 源目录有疑问。
给出以下口味:
flavorDimensions "taste", "serving"
productFlavors {
chocolate {
flavorDimension "taste"
}
strawberry {
flavorDimension "taste"
}
kiwi {
flavorDimension "taste"
}
sample {
flavorDimension "serving"
}
whole {
flavorDimension "serving"
}
}
Run Code Online (Sandbox Code Playgroud)
在 Android Studio 中识别“非测试”源目录(任何风格组合)都没有问题:
src/样本、src/整个、src/巧克力、src/草莓、src/猕猴桃、src/chocolateSample、src/chocolateWhole、src/strawberrySample、src/strawberryWhole、src/kiwiSample、src/kiwiWhole
我的问题是“测试”源目录。
仅识别单维度 口味: src/testSample、src/testWhole、src/testChocolate、src/testStrawberry、src/testKiwi。
多维度口味不包括: src/testChocolateSample、src/testChocolateWhole、src/testStrawberrySample、src/testStrawberryWhole、src/testKiwiSample、src/testKiwiWhole
“androidTest”等效源目录也是如此。
我的印象是 app.iml 没有正确生成。虽然我们知道我们永远不应该这样做,但如果我手动添加丢失的条目,文件夹就会被正确识别。
为什么这应该适用于非测试源目录,但适用于测试源目录却失败?这是已知问题还是 gradle 插件的限制?
我尝试对此进行研究,但只找到与测试源文件夹的单一风味维度或非测试源文件夹的多维风味相关的主题。测试源文件夹的多维风格没有任何内容。
我有一个包含2个模块的项目:library和app。
该library模块当然是一个库,仅具有release和debug构建类型。
该app模块具有4种口味以及release和debug构建类型,总共提供8种构建变体。它还声明了对library模块的依赖关系,如下所示:
compile project(path:':library', configuration:'release')
我希望能够library根据应用程序的build变体设置配置:releasebuild变体应使用release库的版本,debugbuild变体应使用debug库的版本。
显而易见的答案是列出这8个变体中的每一个,并进行适当的配置并且可以正常工作,但这并不是最佳的答案:这很丑陋,会使构建脚本过于混乱。
我已经尝试了一些方法project.configurations.all{}和applicationVariants.all{},但我无法找到一个明确的方法来设置相关性配置。
有没有更清洁的方法可以做到这一点?
目前我正在使用Flutter来构建我的应用程序。
我遵循了一些关于构建不同环境条目文件的指南:
https : //iirokrankka.com/2018/03/02/separating-build-environments/
它创建main_dev.dart和main_prod.dart.
我还学会了为 iOS 和 Android 构建风味:https :
//medium.com/@salvatoregiordanoo/flavoring-flutter-392aaa875f36
现在我可以--flavor <FLAVOR>在命令中使用它来构建不同的风味应用程序。
现在我在尝试结合两种技能时遇到了一个问题。
以下是我想要实现的目标:
development风味->main_dev.dart入口文件
production风味->main_prod.dart入口文件
在 iOS 端,我可以在 .xcconfig 文件中定位入口文件,如下所示:
// ios/Flutter/development.xcconfig
#include "Generated.xcconfig"
FLUTTER_TARGET=lib/main_dev.dart
Run Code Online (Sandbox Code Playgroud)
我知道我可以-t lib/main_dev.dart在flutter run命令后添加。
但是我想问一下是否有任何解决方案可以
在Android端的flavor config中设置flutter目标文件?
感谢任何帮助。
我正在尝试创建一个 Flavor 配置以避免每个模块和库 gradle 文件中出现样板代码。
为此,我尝试转换 Piotr Zawadzki 解决方案(https://medium.com/stepstone-tech/modularizing-your-flavored-android-project-5db75c59fb0d),该解决方案使用 groovy with() 方法与包含的闭包相结合风味配置。
ext.flavorConfig = { // 1
flavorDimensions "pricing"
productFlavors {
free {
dimension "pricing"
ext.myApplicationIdSuffix = '.free' // 2
}
paid {
dimension "pricing"
ext.myApplicationIdSuffix = '.paid'
}
}
productFlavors.all { flavor -> // 3
if (flavor.hasProperty('myApplicationIdSuffix') && isApplicationProject()) {
flavor.applicationIdSuffix = flavor.myApplicationIdSuffix
}
}
}
def isApplicationProject() { // 4
return project.android.class.simpleName.startsWith('BaseAppModuleExtension')
// in AGP 3.1.x with library modules instead of feature modules:
// return project.android …Run Code Online (Sandbox Code Playgroud)