productFlavors多马甲打包

先上官方文档,写的很不错了,地址:https://developer.android.com/studio/build/build-variants?utm_source=android-studio#product-flavors
这里只是总结下用法和一些注意点。

背景

有时候公司需要我们打很多马甲包(改包名和名字,其他一样的)、或者对不同应用市场的渠道包(应用图标不同、启动图或者厂商的推送分开集成)等需求,就可能需要创建很多项目去单独修改,很是麻烦。但是google提供了这种多变种配置来处理这种清空

配置构建变体

debug和release变体

可以在模块级 build.gradle 文件中的 android 代码块内创建和配置构建类型。当您创建新模块时,Android Studio 会自动为您创建“debug”构建类型和“release”构建类型。虽然“debug”构建类型没有出现在构建配置文件中,但 Android Studio 会使用 debuggable true 配置它。这样,您就可以在安全的 Android 设备上调试应用,并使用常规调试密钥库配置 APK 签名。——官方解释
就是我们可以在模块级中给debug和release配置不同的参数和配置项,比如签名信息、是否开启zip、区分包命名、manifestPlaceholders等参数等,方便你测试不同情景。我觉得其实这是一个更好的约束,是对release包防护吧。

注意

注意:官方文档里定义了如下属性

 debug {applicationIdSuffix ".debug"debuggable true}

applicationIdSuffi意思就是针对目标版本替换了新包名。其实我们对于debug和release区别只是要求配置参数不同,而不是要求不同包名,对于大部分需求其实不需要包名的对照,而是需要配置参数的对照。当然你需要同时安装debug包或者release包还是可以配置的。

常规配置

 buildTypes {//定义2个def buildreleasedef builddebugbuildrelease = {minifyEnabled truezipAlignEnabled trueshrinkResources trueproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.cfg'buildConfigField "boolean", "LOGENABLE", logbuildConfigField "String", "APIENV", '"' + environment + '"'manifestPlaceholders = [AMAP_KEY          : "release", CC_EXPORTED     : 'false', LICENSE_KEYBOARD: '654321']}builddebug = {minifyEnabled falsezipAlignEnabled falseshrinkResources false//设置签名signingConfig signingConfigs.testConfigproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.cfg'buildConfigField "boolean", "LOGENABLE", logbuildConfigField "String", "APIENV", '"' + environment + '"'manifestPlaceholders = [AMAP_KEY          : "debug", CC_EXPORTED     : 'true', LICENSE_KEYBOARD: '123456']}release buildreleasedebug builddebug}

反正你觉得要隔离debug和release都可以这里区分。

配置风味版本

如果需要多条产品线配置不同内容,并且在一个编译版本上,就需要配置productFlavors代码块。在新的3.0版本上,需要配置flavorDimensions增加多个纬度。

flavorDimensions "app"//设置渠道productFlavors {teacher {dimension "app"manifestPlaceholders = [package          : "com.hujin.student",WAN_CHANNEL_VALUE: "teacher",name             : "老师端"]signingConfig signingConfigs.debugapplicationId "com.hujin.wan"}student {dimension "app"manifestPlaceholders = [package          : "com.hujin.student",WAN_CHANNEL_VALUE: "studnet",name             : "学生端"]signingConfig signingConfigs.debugapplicationId "com.hujin.student"}}

更多配置

这样就会生成debug-release * teacher-student 四个包。
还可以配置多个纬度的包,设置不同的dimension。还可以设置过滤规则variantFilter

flavorDimensions "app","size"//设置渠道productFlavors {teacher {dimension "app"manifestPlaceholders = [package          : "com.hujin.student",WAN_CHANNEL_VALUE: "teacher",name             : "老师端"]signingConfig signingConfigs.debugapplicationId "com.hujin.wan"}student {dimension "app"manifestPlaceholders = [package          : "com.hujin.student",WAN_CHANNEL_VALUE: "studnet",name             : "学生端"]signingConfig signingConfigs.debugapplicationId "com.hujin.student"}normal{dimension "size"}big{dimension "size"}}//过滤某个 不能过滤debug 和 release 标示variantFilter { variant ->def names = variant.flavors*.nameif (names.contains("normal") && names.contains("student")) {System.out.println("过滤成功")setIgnore(true)}}

这样就会生成debug-release * teacher-student * big-normal - studentNormalDebug包 - studentNormalRelease包 共 六个包。具体在student左边侧边栏下部可以查看:

可以点击选择切换不同的包后自动同步,完成切换。
除此之外,还可以设置sourceSets

  sourceSets {teacher {java.srcDirs = ['src/main/java']manifest.srcFile 'AndroidManifest.xml'res.srcDirs = ['src/main/res']}student {java.srcDirs = ['src/student/java']res.srcDirs = ['src/student/res']manifest.srcFile 'src/student/AndroidManifest.xml'}}

还可以配置不同的dependencies

dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'androidx.appcompat:appcompat:1.2.0'implementation 'androidx.constraintlayout:constraintlayout:2.0.1'studentImplementation 'org.greenrobot:eventbus:3.1.1'debugImplementation  'com.readystatesoftware.chuck:library:1.1.0'}

例外还可以设置BuildConfig,这个可以有很多操作空间了,比如设置不同host。

flavorDimensions "app"//设置渠道String hostStudent = "www.baidu.com";String hostMain = "www.qq.com";productFlavors {teacher {dimension "app"manifestPlaceholders = [package          : "com.hujin.student",WAN_CHANNEL_VALUE: "teacher",name             : "老师端"]signingConfig signingConfigs.debugbuildConfigField ("String", "HOST", '"'+ hostMain + '"')applicationId "com.hujin.wan"}student {dimension "app"manifestPlaceholders = [package          : "com.hujin.student",WAN_CHANNEL_VALUE: "studnet",name             : "学生端"]signingConfig signingConfigs.debugbuildConfigField ("String", "HOST", '"'+ hostStudent + '"')applicationId "com.hujin.student"}}

设置了HOST,build后会在BuildConfig下生成HOST字段了,然后再设置网络请求就可以用BuildConfig.HOST设置达到不同的host效果。

public final class BuildConfig {public static final boolean DEBUG = Boolean.parseBoolean("true");public static final String APPLICATION_ID = "com.hujin.wan";public static final String BUILD_TYPE = "debug";public static final String FLAVOR = "teacher";public static final int VERSION_CODE = 1;public static final String VERSION_NAME = "1.0";// Fields from product flavor: teacherpublic static final String HOST = "www.qq.com";
}public final class BuildConfig {public static final boolean DEBUG = Boolean.parseBoolean("true");public static final String APPLICATION_ID = "com.hujin.student";public static final String BUILD_TYPE = "debug";public static final String FLAVOR = "student";public static final int VERSION_CODE = 1;public static final String VERSION_NAME = "1.0";// Fields from product flavor: studentpublic static final String HOST = "www.baidu.com";
}

举个例子

比如这里配置了studeng风格的包,我需要分别设置不同资源和代码。

对于studeng风格的,资源方面会自动优先寻找studeng包下的资源,如果没有找到则会找默认包下面的资源。

对于代码不同需要设置sourceSets如上面所说,最重要的是对于不同的包下的

 sourceSets {teacher {java.srcDirs = ['src/main/java']manifest.srcFile 'AndroidManifest.xml'res.srcDirs = ['src/main/res']}student {java.srcDirs = ['src/student/java']res.srcDirs = ['src/student/res']manifest.srcFile 'src/student/AndroidManifest.xml'}}

AndroidManifest.xml的合并需要特别注意:具体查看
https://my.oschina.net/wolfcs/blog/550127?fromerr=bHHJWN7F文章。
这里特意设置了不同的风格有自己的AndroidManifest.xml文件。
主:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"package="com.hujin.wan"><applicationandroid:allowBackup="true"android:name="MyApplication"android:icon="@mipmap/ic_launcher"android:label="${name}"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"tools:ignore="GoogleAppIndexingWarning"><activity android:name=".TestActivity"/><activity android:name=".MainActivity"android:label="${name}"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><meta-dataandroid:name="WAN"android:value="${WAN_CHANNEL_VALUE}" /></application></manifest>

student:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><applicationtools:replace="android:icon, android:theme"android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="${name}"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"tools:ignore="GoogleAppIndexingWarning"><activity android:name="com.hujin.student.MainActivity"android:label="${name}"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><meta-dataandroid:name="WAN"android:value="${WAN_CHANNEL_VALUE}" /></application></manifest>

注意点:

  • 风格包下的不需要再设置包名了,要不然会冲突。
  • 不同icon和风格可适用如下配置tools:replace="android:icon, android:theme"
  • 最好风格包下的类,最好全路径来设置(我的项目上出现类找不到)
  • 运行不起来的,可以看下Project Structure-Bulid-Variants下不同变体的各属性是否缺失

android productFlavors多马甲打包相关推荐

  1. Android一键多渠道分发打包实战和解析

    当项目需要有更多的客户的时候,你就会考虑将apk上架到应用商店了,无奈天朝Android应用商店真的是百家争鸣,据某地不完全统计已经有900+.若将Apk上架到所有的应用商店是个好主意,但是据统计也就 ...

  2. Gradle 实现 Android 多渠道定制化打包

    最近在项目中遇到需要实现 Apk 多渠道.定制化打包, 查找了一些资料,成功实现了上述功能,在此记录以备不时之需,温故而知新,可以为师矣~ 需求可以总结如下:  如何实现多个 Apk 安装在同一设备 ...

  3. [置顶]Gradle 实现 Android 多渠道定制化打包

    Gradle 实现 Android 多渠道定制化打包 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近在项目中遇到需要实现 Apk 多渠道.定制化打包, Google .百度查找了一些资料, ...

  4. android 使用signingConfigs进行打包

    转载自:https://blog.csdn.net/bzlj2912009596/article/details/78188570 android 使用signingConfigs进行打包 今天,简单 ...

  5. android多渠道打包插件,Android几种多渠道打包的步骤详解

    1.什么是多渠道打包 在不同的应用市场可能有不同的统计需求,需要为每个应用市场发布一个安装包,这里就引出了Android的多渠道打包.在安装包中添加不同的标识,以此区分各个渠道,方便统计app在市场的 ...

  6. gradle 打包Android,用Gradle 插件打包android程序

    类型:社交聊天大小:1012KB语言:中文 评分:.0 标签: 立即下载 android gradle 的插件终于把混淆代码的task集成进去了,加上最近,android studio 用的是grad ...

  7. Android Studio 一个工程打包多个不同包

    Android Studio 一个工程打包多个不同包 转: https://blog.csdn.net/kdsde/article/details/88639194 AS主要是利用gradle来实现这 ...

  8. 使用ionic cordova build android --release --prod命令打包报错解决方法

    使用ionic cordova build android --release --prod命令打包报有如下错误及解决方法 只要把以下内容添加到build-extras.gradle或(build** ...

  9. android+命令行编译,打包生成apk文件,Android 使用Android Studio + Gradle 或 命令行 进行apk签名打包...

    默认为debug mode,使用的签名文件在: $HOME/.android/debug.keystore 比如 C:\Users\chengcj1.android\debug.keystore 1. ...

最新文章

  1. 【Qt】解决在linux上使用Qt的媒体模块(Qt += multimedia)缺少模块multimedia的问题
  2. 机器人能否取代人工?阿迪达斯付出血的教训,含泪关闭智能工厂
  3. sqlserver2000内存突破4g_酷比魔方iPlay30评测:10.5英寸大屏,支持4G全网通
  4. Altium_Designer-PCB的覆铜步骤
  5. Bootstrap入门(二十九)JS插件6:弹出框
  6. 《大学数学遐想》系列之后记
  7. linux网路编程之TCP状态转换及端口复用
  8. JavaScript算法(实例三)数组排序--冒泡排序 / sort() / reverse() / 比较函数
  9. PAT乙级(1033 旧键盘打字)
  10. python jsonpath
  11. 高性能分布式锁-redisson
  12. 2018-2019-2 网络对抗技术 20165322 Exp8 Web基础
  13. Java跳出多重循环的方法
  14. Python说文解字_杂谈07
  15. JAVA如何校验txt的文本编码格式
  16. Flash8-动态显示汉字乱码问题的解决
  17. 如何使用python批量压缩图片_python 实现图片批量压缩的示例
  18. python学习日志3--ARIMA时间序列模型预测
  19. 如何测试微信的点赞功能
  20. MySQL 8.0 全文检索功能 根据中文字符检索相关数据

热门文章

  1. 【网络知识点】网络基本架构
  2. UCS2编码c语言源码,关于汉字编码到Unicode(UCS2)80的变换
  3. Web基础配置篇(十一): Zookeeper的安装配置及使用
  4. 保密文件服务器,文件服务器部署方案之二:简单共享
  5. 手绘地图如何制作为电子地图实现智慧导览系统之切割瓦片图
  6. 150余位全国各省市信创分管领导调研华云数据“信创云基座” 为华云数据创新发展点赞
  7. 博弈论:完美信息的拓展性博弈-极小极大算法(Minimax)
  8. 数据库基本知识和操作语句
  9. Win10配置JDK环境变量电脑重启后java、javac命令无法使用
  10. 按摩椅产品如何做好软文推广利用软文来打造为产品引流宣传