我对多维风格的 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 插件的限制?
我尝试对此进行研究,但只找到与测试源文件夹的单一风味维度或非测试源文件夹的多维风味相关的主题。测试源文件夹的多维风格没有任何内容。
我正在尝试创建一个 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) 我有我的应用程序的几个版本:普通版,说mainapp和几个建立每个客户的具体,比如说custom1,custom2,custom3.我希望所有customX口味都有基调.
我试图这样做:
创建项目结构:
app\src\main
app\src\mainapp
app\src\commonflavor
app\src\custom3
Run Code Online (Sandbox Code Playgroud)
并配置:
productFlavors {
mainapp {
}
custom1 {
}
custom2 {
}
custom3 {
}
}
sourceSets {
custom1 {
java.srcDirs = ['src/commonflavor/java']
}
custom2 {
java.srcDirs = ['src/commonflavor/java']
}
custom3 {
java.srcDirs = ['src/commonflavor/java', 'src/custom3/java']
}
}
Run Code Online (Sandbox Code Playgroud)
在commonflavor我为所有customX风格添加常见的java类时,请说MainActivity.java和SecondActivity.java.但是custom3我需要分开SecondActivity.java.
在这种情况下,我有一个错误error: duplicate class: SecondActivity来自src/commonflavor/java和src/custom3/java.
现在我已经使用class dupllication解决了这个问题:
sourceSets {
custom1 { …Run Code Online (Sandbox Code Playgroud) buildConfigField与Constants.java每种口味的文件相比,通过gradle添加到我的味道有什么好处?
resValue与每种口味的常规资源相比,通过gradle添加到我的口味中的优势是什么?
谢谢!
我需要为测试库制作不同的风格.为什么?好吧,我希望项目完全安全,所以我想缩小一直启用(即使是调试版本类型).
在进行测试时,我正在使用项目中的不同类,所以我决定使用flavor更改proguard文件.它看起来像这样:
android {
...
buildTypes {
release {
minifyEnabled true
testProguardFile 'test-proguard-rules.pro'
}
debug {
minifyEnabled true
testProguardFile 'test-proguard-rules.pro'
}
}
...
productFlavors{
forTest{
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules1.pro', 'debug-rules.pro'
}
forRelease{
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro', 'debug-rules.pro'
}
}
}
Run Code Online (Sandbox Code Playgroud)
和proguard-rules*文件
ProGuard的规则:
-dontwarn blablabla.**
-dontwarn blabla.**
-keep class bla.** { *; }
Run Code Online (Sandbox Code Playgroud)
ProGuard的-rules1:
-dontshrink
-dontobfuscate
-dontwarn
Run Code Online (Sandbox Code Playgroud)
但这对我没有帮助.我想在没有混淆的情况下运行测试.Flavors没有minifyEnabled这样的参数,所以我试图找到任何解决方案.那么有关解决问题的任何建议吗?可能有人有同样的问题,并找到另一种解决方案(不使用口味)?
这个问题继续我的另一个问题,我想进一步改进.
我能够sourceSets使用以下代码对flavor(具有通用配置)进行分组:
(从上面链接问题的天才那里得到它)
import com.android.build.gradle.api.AndroidSourceSet
android {
sourceSets {
[flavor2, flavor4].each { AndroidSourceSet ss ->
ss.assets.srcDirs = ['repo-assets/flavor2']
ss.res.srcDirs = ['repo-res/flavor2']
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我想知道列表[flavor2, flavor4]是否可以从以下任何一个中提取:
除了风味名称,我打算将以下内容存储在外部源(上面的一个)中:
productFlavors)PORPOSE: 我想写一个通用的代码片段来迭代并动态创建productFlavors和sourceSets.我已经推广sourceSets到几乎90%,一个块现在足以满足各种口味.
它现在看起来像这样:
sourceSets {
[flavor1, flavor2, flavor3 ...].each { AndroidSourceSet ss ->
ss.assets.srcDirs = ['repo-assets/' + ss.name.split('_')[0]]
ss.res.srcDirs = ['repo-mipmap/' + ss.name.split('_')[0] , 'repo-strings/' + ss.name]
}
}
Run Code Online (Sandbox Code Playgroud)
也想像productFlavors上面提到的那样做同样的事情.
STUCK …
android android-build android-gradle-plugin android-productflavors android-sourcesets
我正在尝试修改我的gradle文件以允许基于Flavor和的我的应用程序的不同名称Build Type.到目前为止,我已成功通过Android Gradle插件文档Flavor使用Manifest Merging技术进行基于命名的简洁
这些是我的主屏幕上的应用程序的名称,包括我的debug和release构建.
Flavor Debug App Name Release App Name
-------- -------------- ----------------
entity_1 App Name App Name
entity_2 App Name App Name
... ... ...
entity_2 App Name App Name
hub Hub Hub
Run Code Online (Sandbox Code Playgroud)
它很接近,但......
Flavor Debug App Name Release App Name
-------- -------------- ----------------
entity_1 App Name - Entity_1_name App Name
entity_2 App Name - Entity_2_name App Name
... ... ...
entity_n …Run Code Online (Sandbox Code Playgroud) android android-productflavors manifest-merging android-build-type
如何使用manifest命令"replace"通过具有相同名称但在flavor包中的活动替换主包中的活动?
com.name.project/main/
-ActivityA
Run Code Online (Sandbox Code Playgroud)
替换为
com.name.project/pro/
-ActivityA
Run Code Online (Sandbox Code Playgroud) 我想知道是否有人试图将Android产品风味用于简单的Java Web项目(例如Spring Boot)并且可以向我展示最好的方法吗?我们使用IntelliJ进行Web服务开发,它应该像Android Studio一样反映所选的风格.
我们不想使用弹簧轮廓,也不想维护多个分支.
我有一个带两种口味的应用程序......只有其中一个需要一些权限.如何在构建apk期间仅为此风格请求这些权限?
这些是所需的权限:
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.INTERNET" />
Run Code Online (Sandbox Code Playgroud)