Articles of android productflavors

使用CSV / TXT文件中的名称列表(带属性)动态生成productFlavors和sourceSets

这个问题继续我的另一个问题 ,我想进一步改进。 我能够使用以下代码在sourceSets下对sourceSets (具有通用配置)进行sourceSets : (从上面链接问题的天才那里得到它) 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’] } } } 现在,我想知道列表[flavor2, flavor4]是否可以从以下任何一个中提取: 一个XML文件,我可以通过它迭代以获得所有的味道(我将放在那里) 一个CSV文件,我可以通过它迭代并获取值。 一个自定义类,我可以在一个单独的文件中编写,并从类中的静态成员中获取数据。 除了味道名称,我打算将以下内容存储在外部源(上面的一个): 应用程序ID(我将拉到productFlavors ) 广告单元ID(每种风格两个) 一些其他自定义值,如类别等。 PORPOSE:我想编写一个通用的代码片段来迭代并动态创建productFlavors和sourceSets 。 我将sourceSets概括为近90%,现在一个块已经足够了所有口味。 它现在看起来像这样: sourceSets { [flavor1, flavor2, flavor3 …].each { AndroidSourceSet ss -> ss.assets.srcDirs = [‘repo-assets/’ + […]

Android Studio产品风味仅被认可为两种风格中的一种

我正在创建一个应该有两种口味的应用程序,无板篮球和足球。 当我根据https://developer.android.com/tools/building/configuring-gradle.html设置我的项目时,只有其中一种口味被认可,即无板球和其他风味的包装,即足球不是。 这是我的build.gradle文件 apply plugin: ‘com.android.application’ android { compileSdkVersion 22 buildToolsVersion “22.0.1” defaultConfig { applicationId “net.brawtasports.brawtasportsgps” minSdkVersion 11 targetSdkVersion 22 versionCode 1 versionName “1.0” } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’ } } productFlavors { netball { applicationId “net.brawtasports.brawtasportsgps.netball” versionName “1.0” } football { applicationId “net.brawtasports.brawtasportsgps.football” versionName “1.0” } } sourceSets { […]

使用kotlin的自定义flavor中的ClassNotFoundException

我定义了自己的味道并设置了sourceSet: sourceSets { main.java.srcDirs += ‘src/main/kotlin’ // WORKS myflavor.java.srcDirs += ‘src/myflavor/kotlin’ // DOESN’T WORK } 这是我的项目结构: 但是……我收到以下错误: java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{xyz/xyz.MainActivity}: java.lang.ClassNotFoundException: Didn’t find class “xyz.MainActivity” on path: DexPathList[[zip file “/data/app/xyz/base.apk”],nativeLibraryDirectories=[/vendor/lib, /system/lib]] at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) at android.app.ActivityThread.access$800(ActivityThread.java:144) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5221) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) […]

如何使用不同的插件聚合mutli-project构建的测试报告?

如何迭代每个不同types项目的测试结果并将其收集在一个报告中? 示例项目设置: 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 到目前为止我所拥有的: 这将聚合所有项目的所有测试结果: task aggregateResults(type: Copy) { outputs.upToDateWhen […]

仅构建默认值(无风味/变体)

我为我的构建定义了一堆产品风格。 但是在某些情况下我想要构建没有味道。 但是,当我尝试构建一个没有味道的版本时,即 gradlew assembleRelease 它会经历并构建所有变体,这需要很长时间。 我想开始发布版本并忽略所有风格。 那可能吗? 我确信我可以添加一个名为’default,并构建它的空味道。 好像我不应该这样做。 编辑: defaultConfig { resValue “string”, “hello”, “Hello default” } productFlavors { foo { resValue “string”, “hello”, “Hello Foo” } bar { resValue “string”, “hello”, “Hello Bar” } } 似乎现在的答案是提供你自己的’默认’味道 productFlavors { defaults { // yup its empty cause I just want to build with the […]

Android – 从Flavor中删除活动

如何从app风格中删除活动? 这是一个简化的例子,我有一个应用程序,它有以下两种口味(付费和免费)。 该应用程序很小,只有3个活动(MainActivity,ActivityOne和ActivityTwo)。 付费应用程序不需要任何限制,因为它将使用完整的代码库。 然而,免费应用程序要求它可以让用户访问MainActivity和ActivityTwo,而不是ActivityOne。 如何在编译代码时执行“Manifest Merge”,以便免费版本中不存在ActivityOne? 换句话说,应该如何创建src / free / AndroidManifest.xml以使免费应用程序没有ActivityOne? 下面是app的build.gradle文件: apply plugin: ‘com.android.application’ android { compileSdkVersion 21 buildToolsVersion “21.1.2” defaultConfig { applicationId “com.example.calculator” minSdkVersion 21 targetSdkVersion 21 versionCode 1 versionName “1.0” } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’ } } productFlavors { paid { applicationId “com.example.paid” resValue “string”, “app_name”, […]

具有解析推送通知的Android Gradle产品风味

我正在尝试通过Parse发送推送通知并集成产品风格。 当我实现产品风味时,我无法接收Parse推送通知。 有没有人有任何关于纠正这个问题的建议 Gradle app文件: apply plugin: ‘com.android.application’ android { compileSdkVersion 19 buildToolsVersion “21.1.2” defaultConfig { applicationId “com.example.project” minSdkVersion 16 targetSdkVersion 21 } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.txt’ } } productFlavors{ freeApp{ applicationId “com.example.project.free” } premiumApp{ applicationId “com.example.project.paid” } } } dependencies { compile files(‘libs/android-async-http-1.4.2-66-g4b6eb97.jar’) compile files(‘libs/android-support-v13.jar’) compile files(‘libs/bolts-android-1.2.0.jar’) compile files(‘libs/Parse-1.9.2.jar’) […]

java.lang.LinkageError:MainActivity

我在我的应用程序中使用productFlavours 。 我也在使用multi dex。 defaultConfig { multiDexEnabled true minSdkVersion 17 targetSdkVersion 22 … } productFlavors { prodFlavor1{…} prodFlavor2{…} } dependencies { compile ‘com.android.support:multidex:1.0.1’ … } 在Application类中: @Override public void onCreate() { MultiDex.install(getApplicationContext()); super.onCreate(); } 我为5以下版本的Android版本添加了以上代码。 然后,以下结构,具有2个稍微不同的MainActivity版本(MainActivity扩展AppCompatActivity)在应用程序的某个时刻开始,按下按钮。 app/src/prodFlavor1/…/MainActivity app/src/prodFlavor2/…/MainActivity 在prodFlavor1 , MainActivity在prodFlavor1之后立即启动。 在prodFlavor2 , MainActivity 。 这个工作很长一段时间,甚至在我用multidex添加那个部分后,但突然弯腰工作,没有任何解释。 即使我删除了引用multidex的代码,我也会得到同样的东西。 当我切换到prodVersion2一切正常。 但当我切换到prodVersion1我得到: startActivity(new Intent(TutorialActivity.this,MainActivity.class)); Android 6的Nexus 5: Process: […]

Gradle预处理资产

我想在构建阶段对资产做一些事情。 这是我的gradle脚本。 project.afterEvaluate{ prepareDependencies.dependsOn(“generateMyAssets”) } task generateMyAssets() { copy { from(‘/’) { include ‘**/*.html’ filter { line -> line.replaceAll(/(<img src=https://stackoverflow.com/questions/22366334/gradle-preprocess-assets/\")(?!(.*:.*))/, '<img src="assets:') } } into 'assetsRegxped/' } } 我的问题是,如果风味如何灵活检索资产文件夹的名称(路径)。 另外我怎么才能改变构建版本?

带有风味的Android主题模块

所以这有点有趣,我不确定如何在android studio中设置它。 我有几个模块,我在各种应用程序中使用了一些可重用的组件,但是使用flavor将某些主题注入可重用组件会很不错。 我没有为我写的每个应用程序的每个组件创建一个新的味道,而是考虑使用1个主题模块,每个我编写的应用程序都有一个风味,它有颜色方案等等。 这是我想要它设置的方式: App1:依赖项 可重用的lib1 可重用的lib3 可重用的lib4 主题 – App1风味 App2:依赖项 可重用的lib1 可重用的lib2 可重用的lib4 主题 – App2风味 现在我更愿意,如果可重用的libs可以简单地依赖于主题而不需要知道要构建哪种风格,并且主要的应用程序proj依赖于主题可以引用该应用程序的风格(使用此答案https://stackoverflow.com / a / 24316133/1316346 )。 原因是每个可重用模块都不能在其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’) } App2 build.gradle: dependencies […]