博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态配置LauncherActivity/根据不同资源文件生成apk
阅读量:5945 次
发布时间:2019-06-19

本文共 3092 字,大约阅读时间需要 10 分钟。

需求

1.同一份代码,采用三份不同的资源文件,生成三个不同的apk;

2.同一份代码,采用相同代码和资源文件,仅有LauncherActivity不同,生成两个apk;

经过一番查询,以上需求可以通过Gradle中配置ProductFlavors完美解决。

BuildVariants基本知识

使用manifestPlaceholders改变 meta-data

标签meta-data是提供组件额外的数据用的,它本身就是一个键值对,可以自定义名称和值。它可以包含在以下组件当中:activity\application\service\receiver。

manifestPlaceholders的作用 :在build.gradle文件中定义字符串并将值映射到 AndroidManifest清单文件的指定位置.

1.AndroidMenifest.xml中添加meta-data

复制代码

2.build.gradle(Moudle)中添加(以下两种写法相同)

productFlavors{    eyewatch {	    manifestPlaceholders = [APP_CHANNEL: "eyewatch"] }    ipremium {        manifestPlaceholders = [APP_CHANNEL: "ipremium"] }    echo {        manifestPlaceholders = [APP_CHANNEL: "echo"] }  }复制代码
productFlavors {	eyewatch {}	ipremium {}	echo {}		productFlavors.all { flavor ->			flavor.manifestPlaceholders = [APP_CHANNEL: name]					}		}复制代码
构建变体BuildType

当创建工程时,Android Studio会自动生成debug/release两种buildtype,我们可以根据自己定义生成更多的buildtype

productFlavors支持与 defaultConfig 相同的属性(defaultConfig 实际上属于 类)。这意味着,您可以在 defaultConfig {} 代码块中提供所有风味的基本配置,每种风味均可更改任何这些默认值。

buildType x productFlavor x flavorDimensions = 生成的APK数量

assemble命令简介
./gradlew assembleDebug 编译并生成Debug包,包含productFlavors下所有定义的产品或渠道包./gradlew assembleRelease 编译并生成Release包,包含productFlavors下所有定义的产品或渠道包./gradlew assembleProductARelease 复制代码
flavor跟main的文件合并规则
1.java中代码合并,如果有相同的文件是会报错重复错误的,所以main文件夹中,应该存放共有的代码,而flavor文件夹中存放自己所需要的独立的代码。2.res中资源的合并,优先级是flavor高于main,即flavor中资源会加入或覆盖main中资源。如果falvor渠道要求指定的icon和appName,则在special中res中替换到默认的icon,在string.xml中改正相应的appName即可。复制代码

需求1.同一份代码,不同资源文件

在/src中,main同级目录新建对应falvor名称的文件夹。各个falvor文件内目录应与main目录结构完全一致,需要替换的资源文件名字也要相同。如/eyewatch/drawable/bg.png 与 /main/drawable/bg.png。

defaultConfig {        applicationId "com.echo.settings"        minSdkVersion 19        targetSdkVersion 22        versionCode 1        versionName "1.2"        flavorDimensions "versionCode"        //执行lint检查,有任何的错误或者警告提示,都会终止构建,我们可以将其关掉。        lintOptions {            abortOnError false            checkReleaseBuilds false        }        buildTypes {            debug {                // 显示Log                buildConfigField "boolean", "LOG_DEBUG", "true"                versionNameSuffix "-debug"                minifyEnabled false                zipAlignEnabled false                shrinkResources false                android.applicationVariants.all { variant ->                    variant.outputs.all {                        outputFileName = "Settings_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"                    }                }            }        }// 多渠道打包productFlavors {    echo {}    eyewatch {}    ipremium {}}productFlavors.all { flavor ->    flavor.manifestPlaceholders = [APP_CHANNEL_VALUE: name]}复制代码

需求2.同一份代码,不同LauncherActivity

在/src中main同级目录中创建对应flavor文件夹,复制一份manifest.xml文件。

将原LauncherActivity下 添加 tools:node="merge",Intent-filter中添加 tools:node="remove"

复制代码

在对应想要启动的Activity下设置即可。

复制代码


转载于:https://juejin.im/post/5ad56bad6fb9a028cb2e1f94

你可能感兴趣的文章
java的基本数据类型
查看>>
WPF中的CheckBox的_ (underscore / 下划线)丢失
查看>>
正则表达式匹配数字
查看>>
前端模块化
查看>>
QIBO CMS SQL Injection Via Variable Uninitialization In \member\special.php
查看>>
二维数组---模拟斗地主
查看>>
【转】(DT系列六)devicetree中数据和 struct device有什么关系
查看>>
【前端性能】必须要掌握的原生JS实现JQuery
查看>>
mysql系统变量
查看>>
svn cleanup failed–previous operation has not finished; run cleanup if it was interrupted
查看>>
JavaScript 编码规范(中文/Airbnb公司版)
查看>>
DNX/ASP.NET 5的xUnit入门向导
查看>>
正则表达式—匹配连续重复的字符
查看>>
如何在一个月内改善你的生活
查看>>
beyond compare比较工具设置
查看>>
Java中的事务
查看>>
Spring Ajax一个简单样例
查看>>
传递给数据库 'master' 中的日志扫描操作的日志扫描号无效
查看>>
导入https证书
查看>>
SAP R3和JAVA交换数据之JCO
查看>>