- 1.3 前言
- 1.4 入门
- 1.4.1 下载
- 1.4.2 环境配置
- 1.4.3 环境配置
- 1.4.4 环境配置
- 1.4.5 版本更新
- 1.4.6 项目和模块
- 1.5 新建
- 1.5.1 创建项目
- 1.5.2 创建模块
- 1.5.3 创建库
- 1.5.4 Library打包成aar
- 1.5.5 Studio项目
- 1.5.6 导入eclipse项目
- 1.5.7 导入Jar\/AAR
- 1.5.8 新建类和文件
- 1.5.9 增加so文件
- 1.5.10 创建Fragment文件
- 1.5.11 创建service文件
- 1.5.12 创建自定义组件
- 1.5.13 widget
- 1.5.14 创建可编译的资源文件
- 1.5.15 创建AIDL
- 1.5.16 创建Android文件夹
- 1.6 布局
- 1.6.5 ConstraintLayout约束
- 1.7.8 TODO
- 1.8 编辑
- 1.8.1 复制\/粘贴\/剪切\/撤销\/重做
- 1.8.2 查找替换
- 1.8.3 大小写替换
- 1.8.4 Macros(宏)
- 1.8.5 使用列选择模式
- 1.8.6 扩大\/缩小选择范围
- 1.8.7 合并两行内容
- 1.8.8 自动补全当前的语句
- 1.8.9 缩排
- 1.8.10 切换大小写字母
- 1.10 导航
- 1.10.1 搜索并打开某个类文件
- 1.10.2 搜索并打开某个文件
- 1.10.3 搜索并打开某个文件或方法
- 1.10.4 快速跳转到某一行
- 1.10.5 使用自定义代码块
- 1.10.6 快速跳转到光标的历史位置
- 1.10.7 快速跳转到编辑过的位置
- 1.10.8 标记书签
- 1.10.9 管理书签
- 1.10.10 快速跳转到导航栏
- 1.10.11 快速跳转到声明
- 1.10.12 快速跳转到类型声明
- 1.10.13 快速跳转到实现
- 1.10.14 快速跳转到父类
- 1.10.15 在快速类和被测试类之间快速跳转
- 1.10.16 查看相关联的文件
- 1.10.17 查看文件结构
- 1.10.18 查看类的层次结构图
- 1.10.19 查看方法类型的层次结构图
- 1.10.20 查看方法调用层次结构
- 1.10.21 快速跳转到错误代码位置
- 1.10.22 方法间前后跳转
- 1.10.23 使用翻页
- 1.10.24 选择当前文件在哪里显示
- 1.10.25 光标快速跳转到编辑器
- 1.11 编码
- 1.11.1 覆写或者实现方法
- 1.11.2 实现接口方法
- 1.11.4 生成构造函数
- 1.11.5 生成Getter和Setter方法
- 1.11.6 覆写equals和hashcode方法
- 1.11.7 快速覆写toString方法
- 1.11.8 插入版权信息
- 1.11.9 提取或删除语句
- 1.11.10 自动补全提示
- 1.11.11 代码补全
- 1.11.12 循环扩展词
- 1.11.13 展开或折叠代码
- 1.11.14 代码模板
- 1.11.15 注释
- 1.11.16 格式化代码
- 1.13 重构
- 1.13.1 重命名
- 1.13.2 提炼方法
- 1.13.3 提炼方法对象
- 1.13.4 更改方法签名
- 1.13.5 迁移变量类型
- 1.13.6 转成静态方法
- 1.13.7 静态方法转为实例方法
- 1.13.8 移动类
- 1.13.9 移动静态方法
- 1.13.10 移动静态字段
- 1.13.11 安全删除
- 1.13.12 提炼为变量
- 1.13.13 提炼为常量
- 1.13.14 提炼字段
- 1.13.15 提炼参数
- 1.13.16 提炼委托
- 1.13.17 提炼接口
- 1.13.18 提炼父类
- 1.13.19 内联方法
- 1.13.20 内联临时变量
- 1.13.21 查找并替换重复代码
- 1.13.22 反转布尔值
- 1.13.23 把成员拉到父类
- 1.13.24 把成员推到子类
- 1.13.25 尽可能使用接口
- 1.13.26 使用委托替换继承
- 1.13.27 移除中间人
- 1.13.28 包装方法返回值
- 1.13.29 将匿名类转成内部类
- 1.13.30 封装字段
- 1.13.31 使用查询替换临时变量
- 1.13.32 使用工厂方法替换构造方法
- 1.13.34 泛型化
- 1.13.35 迁移
- 1.14 打包构建(Gradle)
- 1.14.1 认识Gradle
- 1.14.2 Gradle中依赖的仓库
- 1.14.3 配置Gradle环境
- 1.14.4 Wrapper
- 1.14.5 初始化构建环境
- 1.14.6 解决Gradle下载太慢的问题
- 1.14.7 查看和执行Gradle任务
- 1.14.8 常用Gradle任务
- 1.14.9 Gradle工具窗口
- 1.14.10 构建项目和模块
- 1.14.11 设置自动编译项目
- 1.14.12 重新构建项目
- 1.14.13 Project的区别
- 1.14.14 清理项目
- 1.14.15 Script
- 1.14.16 Gradlew配置文件:gradle-wrapper.properties
- 1.14.17 项目全局配置文件:settings.gradle
- 1.14.18 本地属性配置文件:local.properties
- 1.14.19 Gradle配置文件:gradle.properties
- 1.14.20 代码混淆规则配置文件:proguard-rules.pro
- 1.14.21 项目构建配置文件build.gradle
- 1.14.22 模块构建配置文件:build.gradle
- 1.14.23 项目结构中配置模块构建
- 1.14.24 配置应用程序属性
- 1.14.25 配置应用程序签名
- 1.14.26 配置应用程序的特性
- 1.14.27 配置应用程序的构建类型
- 1.14.28 配置应用程序的依赖
- 1.14.29 打签名包
- 1.14.30 多渠道打包
- 1.14.31 配置开发者服务
- 1.15 运行调试
- 1.15.1 运行和调试配置
- 1.15.2 Android应用程序配置
- 1.15.3 断点
- 1.15.4 调试工具
- 1.15.5 计算表达式
- 1.15.6 关联调试到Android进程
- 1.15.7 配置和运行单元测试
- 1.15.8 使用命令行运行单元测试
- 1.15.9 配置Android单元测试
- 1.17 版本控制
- 1.17.1 Git偏好设置
- 1.17.2 配置Github
- 1.17.3 从Github克隆代码
- 1.17.4 将本地项目共享到GitHub
- 1.17.5 查看本地变更历史
- 1.17.6 Git添加文件
- 1.17.7 Git提交变更
- 1.17.8 Git文件逐行追溯
- 1.17.9 显示当前修订版本
- 1.17.10 Git文件比较
- 1.17.11 Git撤销操作
- 1.17.12 Git版本回退
- 1.17.13 Git查看提交历史
- 1.17.14 Git分支管理
- 1.17.15 Git创建标签
- 1.19 插件
- 1.19.1 插件下载安装
- 1.19.2 常用插件
- 1.19.3 插件开发
- 1.21 快捷键
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
1.14.30 多渠道打包
国内Android应用下载有360、小米、豌豆荚、百度等等非常多的渠道, 如果我们想统计每个渠道的下载量和活跃度,就需要使用统计平台.
我们以友盟统计为例,介绍如何配置渠道信息并执行自动化打包.
1.在AndroidMainfest.xml配置可动态替换的渠道参数
友盟集成文档中有说明,使用友盟统计需要在AndroidMainfest.xml配置相应的渠道号:
<meta-data
android:name="UMENG_CHANNEL"
android:value="xiaomi" /><!--渠道号为:小米-->
如果想动态的替换渠道号怎么办呢?
<meta-data
android:name="UMENG_CHANNEL"
android:value="${CHANNEL_ID}" /><!--动态替换渠道号-->
2.在build.gradle中配置渠道信息和自动替换脚本
// 多渠道打包
productFlavors {
xiaomi {} //渠道名name为xiaomi
baidu {}
wandoujia {}
// 自动替换AndroidManifest.xml中的渠道号
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [CHANNEL_ID: name]
}
}
配置好以后在Build Variants窗口中可以选择不同渠道的变种版本:
Gradle工具栏也会生成相应的任务:
3.默认配置
// 默认配置
defaultConfig {
applicationId "com.wirelessqa.basebuildsample" //apk包名
minSdkVersion 16
targetSdkVersion 23
versionCode 1
versionName "1.0" //版本号
//android单元测试test runner
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
所有渠道默认使用这一配置,如果渠道有特殊需求,可以在productFlavors对应的渠道号中单独配置.
4.打包后自动修改apk的名字
// 打包后自动修改apk的名字
// release包的命名格式为:产品名_版本号_渠道号.apk
// debug包的命名格式为:产品名_版本号_渠道号_Debug_打包时间.apk
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (null != outputFile && outputFile.name.endsWith('.apk')) {
File outputDir = new File(outputFile.parent);
def baseName = PRODUCT_NAME + "${defaultConfig.versionName}" + "_" + variant.productFlavors[0].name
def newApkName
if (variant.buildType.name.equals('release')) {
newApkName = baseName + '.apk'
} else if (variant.buildType.name.equals('debug')) {
newApkName = baseName + "_Debug_${packageTime()}.apk"
}
output.outputFile = new File(outputDir, newApkName)
}
}
}
5.自动化打包
如何一次打出所有渠道的Release的包呢?
方法一: 命令行:
$ ./gradlew assembleRelease
方法二: Gradle工具窗口:
方法三: 菜单栏 —> Build —> Generate Signed APK —> 一步步下去 —> Flavors中全选—> Finish.
这样所有渠道的Release包都被打出来了.
6.查看渠道号是否被正确替换.
单击apk之后,Android Studio会自动解析apk,这样我们就可以在Android Studio中直接查看apk的信息了.
1.单击baidu这个渠道 —>2.点击AndroidManifest.xml —>3.查看渠道号为baidu
由此证明我们的打包脚本是OK的.
如果要打Debug包,执行assembleDebug任务就可以了.
如果只想打某一个渠道的包,执行对应的打包任务就可以了.
本例中全部的build.gradle脚本如下:
//插件:
//这个module是一个android程序,使用com.android.application
//如果是android库,应该使用com.android.library
apply plugin: 'com.android.application'
//产品名
def PRODUCT_NAME = "wirelessqa"
//打包时间
def packageTime() {
return new Date().format("MMddhhmmss", TimeZone.getTimeZone("GMT+8"))
}
android {
// 签名配置
signingConfigs {
MySigning {
keyAlias 'myandroid'
keyPassword '123456'
storeFile file('/Users/bixiaopeng/myandroid.jks')
storePassword '123456'
}
}
// 编译sdk版本
compileSdkVersion 23
// 构建工具版本
buildToolsVersion "23.0.2"
// 默认配置
defaultConfig {
applicationId "com.wirelessqa.basebuildsample" //apk包名
minSdkVersion 16
targetSdkVersion 23
versionCode 1
versionName "1.0" //版本号
//android单元测试test runner
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
versionNameSuffix 'test'
}
// 产品特性
productFlavors {
xiaomi {} //渠道名name为xiaomi
baidu {
}
wandoujia {}
// 自动替换AndroidManifest.xml中的渠道号
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [CHANNEL_ID: name]
}
}
// 构建类型,此处配置debug和release版本的一些参数,像混淆、签名配置.
buildTypes {
// release包的配置
release {
//开启混淆
minifyEnabled true
// 指定混淆文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
// 指定签名配置
signingConfig signingConfigs.MySigning
zipAlignEnabled true
//移除无用的资源文件
shrinkResources true
}
}
// 打包后自动修改apk的名字
// release包的命名格式为:产品名_版本号_渠道号.apk
// debug包的命名格式为:产品名_版本号_渠道号_Debug_打包时间.apk
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (null != outputFile && outputFile.name.endsWith('.apk')) {
File outputDir = new File(outputFile.parent);
def baseName = PRODUCT_NAME + "${defaultConfig.versionName}" + "_" + variant.productFlavors[0].name
def newApkName
if (variant.buildType.name.equals('release')) {
newApkName = baseName + '.apk'
} else if (variant.buildType.name.equals('debug')) {
newApkName = baseName + "_Debug_${packageTime()}.apk"
}
output.outputFile = new File(outputDir, newApkName)
}
}
}
}
// 依赖的第三方库
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha1'
compile 'com.android.support:design:23.4.0'
testCompile 'junit:junit:4.12'
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
androidTestCompile 'com.android.support.test:runner:0.5'
androidTestCompile 'com.android.support:support-annotations:23.4.0'
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论