【转】Android Studio打包全攻略---从入门到精通
原文地址:http://blog.csdn.net/zivensonice/article/details/51672846
初出茅庐 手动打包
怎么手动打包
项目写完了,现在需要把应用上传到市场,问题出现—怎么把代码变成.apk(Android的可安装文件)。
1. 创建签名文件
2. 填写好签名参数
3. 生成APK
注意:签名的密码和密匙的密码注意保管,不要忘了,签名文件别泄漏了,也别搞丢了
为什么要打包
我最开始就有这个疑问,我们的代码不是点了下运行按钮就直接安装到手机上了吗,我们在在项目Project目录的build/outputs/apk
目录下可以找到刚刚新鲜生成的app-debug.apk.直接把这个上传给市场不就行了吗。
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'
}
我们需要配置:
signingConfigs
这是刚才我们新建的密匙信息buildTypes
打包类型,包括了Debug和ReleaseproductFlavors
打包渠道就在这儿配置咯 同时在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
可以帮到你
4. 删除多余的 unaligned.apk
执行完-gradlew assembleRelease
,发现一个问题,生成的不仅有我们需要的包,unaligned.apk
类型的Apk也输出来了
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
选择红色部分,里面的编辑框可以帮助我们更快的熟悉Gradle
来看看代码和编辑框的具体关系吧
7. 打包太多,需要清理一下
炉火纯青 恐龙快打
直接修改渠道号
想想,如果只是打渠道包的话,没有必要对整个项目进行编译,来生成渠道号。
如果能直接修改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
到项目目录
果然厉害,1S就出来这么多包。
反编译看看,包打得对不对
命令行
apktool d xxx.apk
打开目录,首先确认我们生成的XML里面的标识符
然后看到,美团极速打包方案也完成
但是,使用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://....";
}
- 配合我写接口的服务器兄弟的电脑主机IP地址
- 测试服务器环境地址
- 线上环境地址
开发的时候倒是没啥问题,我手动注释掉,切换具体要使用那个URL调试就行了,但是打包给测试的时候就麻烦了,需要三个环境都打好给他们,改一个打包,改一个打包,浪费时间,还经常把代码弄混。
这个时候,就到了Build Variants大显神威的时候啦
变种版本是什么
打开方式
不需要,改代码,要选择运行那个环境直接切换,方便快捷
对比两个版本的不同
最后效果:
构建
最后一个问题,
能不能在同一个手机上同时装上不同环境的包
测试希望比较下不同环境下,App会有的差异
同时装上手机,也就是包名不同即可,显然现在的我们已经不用自己手动去改了,直接配置参数
最后,三个包都装到手机上了
这个方式同样适合于Debug版本和Release版本同时安转到手机上。
比如你去面试,你想同时给面试官展示线上的版本和现在正在开发的版本,或者你想演示旧版本和新版版本的区别,你就可以通过这种方式达成.so easy…
构建定制版App
详见: http://blog.csdn.net/zivensonice/article/details/51684931
登峰造极 打包安全
待续…
代码下载地址:https://github.com/zhouruikevin/makeapp
【转】Android Studio打包全攻略---从入门到精通的更多相关文章
- Android Studio打包全攻略
转载:http://www.2cto.com/kf/201606/517300.html 初出茅庐 手动打包 怎么手动打包 项目写完了,现在需要把应用上传到市场,问题出现-怎么把代码变成.apk(An ...
- 【转】【Android】Android Studio打包全攻略
项目写完了,现在需要把应用上传到市场,问题出现—怎么把代码变成.apk(Android的可安装文件).1. 创建签名文件2. 填写好签名参数3. 生成APK注意:签名的密码和密匙的密码注意保管,不要忘 ...
- Android屏幕适配全攻略 (转载)
http://blog.csdn.net/jdsjlzx/article/details/45891551 https://github.com/hongyangAndroid/AndroidAuto ...
- Android使用XML全攻略(2)
Android使用XML全攻略(2) Android 是针对移动设备的一种新兴的开源操作系统和 SDK.借助它,您可以创建功能强大的移动应用程序.当您的应用程序可以访问 Web 服务时,其吸引力会 ...
- Android使用XML全攻略(1)
Android使用XML全攻略(1) Android 是针对移动设备的一种新兴的开源操作系统和 SDK.借助它,您可以创建功能强大的移动应用程序.当您的应用程序可以访问 Web 服务时,其吸引力 ...
- Android屏幕适配全攻略(最权威的官方适配指导)屏幕尺寸 屏幕分辨率 屏幕像素密度 dpdipdpisppx mdpihdpixdpixxdpi
Android屏幕适配全攻略(最权威的官方适配指导)原创赵凯强 发布于2015-05-19 11:34:17 阅读数 153734 收藏展开 转载请注明出处:http://blog.csdn.net/ ...
- 【收藏】Android屏幕适配全攻略(最权威的Google官方适配指导)
来源:http://blog.csdn.net/zhaokaiqiang1992 更多:Android AutoLayout全新的适配方式, 堪称适配终结者 Android的屏幕适配一直以来都在折磨着 ...
- Android屏幕适配全攻略(最权威的官方适配指导)(转),共大家分享。
Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习 ...
- Android屏幕适配全攻略(最权威的官方适配指导) (转)
招聘信息: Cocos2d-X 前端主程 [新浪微博]手机客户端iOS研发工程师 20k-40k iOS 开发工程师 iOS高级开发工程师(中国排名第一的企业级移动互联网云计算公司 和创科技 红圈营销 ...
随机推荐
- Leetcode 814. Binary Tree Pruning
dfs 要点是这一句: return node.val==1 or node.left or node.right 完整代码: # Definition for a binary tree node. ...
- apt-get -f install
http://zhidao.baidu.com/link?url=tZLEfm1Ycc1pWS67-95fXU596CtwA_1l2pPfzINUTxvOCvWdf3JZsWuZNxsxn0Jv6Om ...
- c++ rapidjson解析多层级json
如果一个层级为data,其内部又包含一个层级status, 可以直接通过这种方式来跨级访问: rapidjson::Value& val_status = doc["data&quo ...
- stm32寄存器版学习笔记04 定时计数器中断
STM32共有8个定时计数器,其中TIME1和TIME8是高级定时器,TIME2~TIME5是通用定时器,TIME6和TIME7是基本定时器.以TIME3为例总结定时计数器的基本用法. 1.TIM3的 ...
- BZOJ1510 POI2006 Kra-The Disks 【模拟】
BZOJ1510 POI2006 Kra-The Disks LINK 还是粘题面吧,但是图就算了 Description Johnny 在生日时收到了一件特殊的礼物,这件礼物由一个奇形怪状的管子和一 ...
- drone 学习二 pipeline 说明
1. 基本语法 pipeline: backend: image: golang commands: - go build - go test frontend: image: node comman ...
- Git 的分支和标签规则
Git 的分支和标签规则 分支使用 x.x 命名,不加 V. 标签使用 v1.x.x-xxx 方式命名.(v 为小写) 分支和标签名不可重复.
- Opencv2.2 移植到am335x-y开发板
1.虚拟机上运行cmake-gui,报找不到文件,指示安装. 2.下载opencv2.2.0 http://opencv.org/downloads.html 3.cmake-gui,配置参考< ...
- LNMP.ORG 安装LNMP
参考:http://lnmp.org/install.html cd /usr/local/src wget -c http://soft.vpser.net/lnmp/lnmp1.3-full.ta ...
- Exception in thread "main" java.lang.UnsupportedClassVersionError: com/crack
执行一个jar文件的时候抛异常了 Exception in thread "main" java.lang.UnsupportedClassVersionError: com/cr ...