Android Studio打包全攻略---从入门到精通

从来好事天生俭,自古瓜儿苦后甜。这篇文章主要讲述Android Studio打包全攻略---从入门到精通相关的知识,希望能为你提供帮助。
本文原创地址: http://blog.csdn.net/zivensonice/article/details/51672846
初出茅庐 手动打包 怎么手动打包 项目写完了, 现在需要把应用上传到市场, 问题出现—怎么把代码变成.apk( android的可安装文件) 。
1. 创建签名文件

Android Studio打包全攻略---从入门到精通

文章图片

2. 填写好签名参数
Android Studio打包全攻略---从入门到精通

文章图片

3. 生成APK
注意: 签名的密码和密匙的密码注意保管, 不要忘了, 签名文件别泄漏了, 也别搞丢了
为什么要打包 我最开始就有这个疑问, 我们的代码不是点了下运行按钮就直接安装到手机上了吗, 我们在在项目Project目录的build/outputs/apk目录下可以找到刚刚新鲜生成的app-debug.apk.直接把这个上传给市场不就行了吗。
Android Studio打包全攻略---从入门到精通

文章图片

NO, 当然不行, 想想手机安装App的时候怎么来区分各个APK的。
通过包名+ 签名 来确定一个应用的唯一性, 那个debug.apk只是系统用来给我们调试用的, 如果上传到市场, 怎么来保证他的安全性。
渐入佳境 渠道打包 OK, 我们已经解决了第一步—怎么打包。上传上去后, 市场反馈发现我们的App写得太棒了, 这时候老大让赶快多上些平台, 主流的平台、非主流的平台都要放上去。
那么问题来了, 为了方便统计各个平台的安装情况, 配合运营推广, 需要统计各个平台的安装情况。
分渠道打包 不错, 我们需要用到分渠道打包, 那么我们需要解决两个问题
1. 怎么区分各个平台的标识
2. 怎么每次版本更新都生成几十个包、几百个包
第一个简单, 用过友盟打包的同学肯定不陌生这段代码
< meta-data android:name= " UMENG_CHANNEL" android:value= " Channel_ID" />

value里面填的就是各个平台的值, 比如填写uc、yyb(应用宝)、360、baidu替换掉Channel_ID, App安装好, 可以读取这个值然后传给后台, 从而实现区分各个平台的安装需求。
第二个问题:
在Eclipse时代, 最开始我是手动打的, 一次打30个包, 每次最怕版本更新, 基本一下午都在做机械运动, 现在想起来手都在抽筋。
后来, 学会了Ant自动打包, 快倒是快, 只是配置太坑爹了, 超级麻烦。
现在有了Android Studio, 妈妈再也不用担心我不能愉快的打包了。
随便新建一个项目, 修改Module:app build.gradle
apply plugin: ' com.android.application' android { signingConfigs { config { keyAlias ' maker' keyPassword ' 1234make' storeFile file(' /Users/Nevermore/AndroidStudioProjects/Blog/jks/makeapp.jks' ) storePassword ' make1234' } } compileSdkVersion 23 buildToolsVersion " 23.0.3" defaultConfig { applicationId " com.example.makeapp" minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName " 1.0" } buildTypes { debug { minifyEnabled false debuggable true }release { minifyEnabled true proguardFiles getDefaultProguardFile(' proguard-android.txt' ), ' proguard-rules.pro' signingConfig signingConfigs.config debuggable false } } productFlavors { uc { manifestPlaceholders = [UMENG_CHANNEL_VALUE: " uc" ] } _360 { manifestPlaceholders = [UMENG_CHANNEL_VALUE: " 360" ] } baidu { manifestPlaceholders = [UMENG_CHANNEL_VALUE: " baidu" ] } yyb { manifestPlaceholders = [UMENG_CHANNEL_VALUE: " yyb" ] } } }dependencies { compile fileTree(dir: ' libs' , include: [' *.jar' ]) testCompile ' junit:junit:4.12' compile ' com.android.support:appcompat-v7:23.3.0' }

我们需要配置:
  1. signingConfigs这是刚才我们新建的密匙信息
  2. buildTypes 打包类型, 包括了Debug和Release
  3. productFlavors打包渠道就在这儿配置咯 同时在AndroidManifest里面加上, 渠道标识
< manifest xmlns:android= " http://schemas.android.com/apk/res/android" package= " example.com.makeapk" > < meta-data android:name= " UMENG_CHANNEL" android:value= " ${UMENG_CHANNEL_VALUE}" /> ...省略 < /manifest>

3 现在还有个问题—代码写完了怎么生成渠道包呢
OK, 在命令行输入 gradlew assembleRelease, 表示生成所有Release包, 生成的包在build\\outputs\\apk目录下, 如果你要生成指定的包( uc|360|baidu) , 指定的版本( Release|Debug) , 右边的Gradle Project可以帮到你
Android Studio打包全攻略---从入门到精通

文章图片

4. 删除多余的 unaligned.apk
执行完-gradlew assembleRelease, 发现一个问题, 生成的不仅有我们需要的包, unaligned.apk类型的Apk也输出来了
Android Studio打包全攻略---从入门到精通

文章图片

unaligned.apk 是还没执行对齐命令的包, 是中间形态, 这个需要删除, 没必要不知道为什么Gradle没有帮我们删了这没啥用的玩意儿, 问题是我们也不想一个一个的手动删除。好吧, 写了一个脚本命令, 在输出文件夹的命令行执行如下:
find . -name " *-unaligned.apk" | xargs rm -rf

5 优化gradle代码
刚才写的代码
productFlavors { uc { manifestPlaceholders = [UMENG_CHANNEL_VALUE: " uc" ] } _360 { manifestPlaceholders = [UMENG_CHANNEL_VALUE: " 360" ] } baidu { manifestPlaceholders = [UMENG_CHANNEL_VALUE: " baidu" ] } yyb { manifestPlaceholders = [UMENG_CHANNEL_VALUE: " yyb" ] } }

有些冗余, 修改下减少我们的代码量
productFlavors { uc {} _360 {} baidu {} yyb {} } productFlavors.all { flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name] }

是不是美观多了
6. Gradle对新人来说语法有学习曲线, 能不能再容易一点
咱们有工具啊, 打开顶部Build
Android Studio打包全攻略---从入门到精通

文章图片

选择红色部分, 里面的编辑框可以帮助我们更快的熟悉Gradle
Android Studio打包全攻略---从入门到精通

文章图片

Android Studio打包全攻略---从入门到精通

文章图片

Android Studio打包全攻略---从入门到精通

文章图片

Android Studio打包全攻略---从入门到精通

文章图片

来看看代码和编辑框的具体关系吧
Android Studio打包全攻略---从入门到精通

文章图片

7. 打包太多, 需要清理一下
Android Studio打包全攻略---从入门到精通

文章图片

炉火纯青 恐龙快打 直接修改渠道号 想想, 如果只是打渠道包的话, 没有必要对整个项目进行编译, 来生成渠道号。
如果能直接修改apk的渠道号, 而不需要再重新签名能节省不少打包的时间。幸运的是我们找到了这种方法。直接解压apk, 解压后的根目录会有一个META-INF目录。
如果在META-INF目录内添加空文件, 可以不用重新签名应用。因此, 通过为不同渠道的应用添加不同的空文件, 可以唯一标识一个渠道。
采用这种方式, 每打一个渠道包只需复制一个apk, 在META-INF中添加一个使用渠道号命名的空文件即可。
这种打包方式速度非常快, 900多个渠道不到一分钟就能打完。
没错, 这就是美团的打包策略
使用方式: https://github.com/GavinCT/AndroidMultiChannelBuildTool
使用本工具, Android程序员仅需将ChannelUtil.java放入到工程里使用, 以后打包的事情就不用自己动手了。
安装个python环境, 运行一下MultiChannelBuildTool.py, 谁都可以打包了!
毕竟实践是检验真理的唯一标准:
拷贝一个, 我们刚刚生成的app-uc-release.apk到项目目录
Android Studio打包全攻略---从入门到精通

文章图片

果然厉害, 1S就出来这么多包。
反编译看看, 包打得对不对
命令行
apktool d xxx.apk

Android Studio打包全攻略---从入门到精通

文章图片

打开目录, 首先确认我们生成的XML里面的标识符
Android Studio打包全攻略---从入门到精通

文章图片

然后看到, 美团极速打包方案也完成
Android Studio打包全攻略---从入门到精通

文章图片

但是, 使用Gradle生成4个渠道, 我们花了 26.5秒 人家 只花了目测 1s
1分钟900个包果然不是梦
Build Variants( 构建变种版本) 切换URL
开发每次调试接口, 我常常会配置3个URL
public class Constant { public static final String URL = " 主机IP地址:10.18.3.1" ; //public static final String URL = " 线上环境:http://www...." ; //public static final String URL = " 测试环境http://...." ; }

  1. 配合我写接口的服务器兄弟的电脑主机IP地址
  2. 测试服务器环境地址
  3. 线上环境地址
开发的时候倒是没啥问题, 我手动注释掉, 切换具体要使用那个URL调试就行了, 但是打包给测试的时候就麻烦了, 需要三个环境都打好给他们, 改一个打包, 改一个打包, 浪费时间, 还经常把代码弄混。
这个时候, 就到了Build Variants大显神威的时候啦
变种版本是什么
打开方式
Android Studio打包全攻略---从入门到精通

文章图片

不需要, 改代码, 要选择运行那个环境直接切换, 方便快捷
Android Studio打包全攻略---从入门到精通

文章图片

对比两个版本的不同
Android Studio打包全攻略---从入门到精通

文章图片

最后效果:
Android Studio打包全攻略---从入门到精通

文章图片

Android Studio打包全攻略---从入门到精通

文章图片

构建
Android Studio打包全攻略---从入门到精通

文章图片

最后一个问题,
能不能在同一个手机上同时装上不同环境的包
测试希望比较下不同环境下, App会有的差异
同时装上手机, 也就是包名不同即可, 显然现在的我们已经不用自己手动去改了, 直接配置参数
Android Studio打包全攻略---从入门到精通

文章图片

最后, 三个包都装到手机上了
Android Studio打包全攻略---从入门到精通

文章图片

这个方式同样适合于Debug版本和Release版本同时安转到手机上。
比如你去面试, 你想同时给面试官展示线上的版本和现在正在开发的版本, 或者你想演示旧版本和新版版本的区别, 你就可以通过这种方式达成.so easy…
构建定制版App 详见: http://blog.csdn.net/zivensonice/article/details/51684931
登峰造极 打包安全 【Android Studio打包全攻略---从入门到精通】待续…
代码下载地址: https://github.com/zhouruikevin/makeapp

    推荐阅读