原文地址: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'
}

我们需要配置:

  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可以帮到你 

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://....";
}
  1. 配合我写接口的服务器兄弟的电脑主机IP地址
  2. 测试服务器环境地址
  3. 线上环境地址

开发的时候倒是没啥问题,我手动注释掉,切换具体要使用那个URL调试就行了,但是打包给测试的时候就麻烦了,需要三个环境都打好给他们,改一个打包,改一个打包,浪费时间,还经常把代码弄混。 
这个时候,就到了Build Variants大显神威的时候啦

变种版本是什么

打开方式 

不需要,改代码,要选择运行那个环境直接切换,方便快捷


对比两个版本的不同 

最后效果: 

构建


最后一个问题,

能不能在同一个手机上同时装上不同环境的包

测试希望比较下不同环境下,App会有的差异 
同时装上手机,也就是包名不同即可,显然现在的我们已经不用自己手动去改了,直接配置参数 
 
最后,三个包都装到手机上了 

这个方式同样适合于Debug版本和Release版本同时安转到手机上。 
比如你去面试,你想同时给面试官展示线上的版本和现在正在开发的版本,或者你想演示旧版本和新版版本的区别,你就可以通过这种方式达成.so easy…

构建定制版App

详见: http://blog.csdn.net/zivensonice/article/details/51684931

登峰造极 打包安全

待续… 
代码下载地址:https://github.com/zhouruikevin/makeapp

【转】Android Studio打包全攻略---从入门到精通的更多相关文章

  1. Android Studio打包全攻略

    转载:http://www.2cto.com/kf/201606/517300.html 初出茅庐 手动打包 怎么手动打包 项目写完了,现在需要把应用上传到市场,问题出现-怎么把代码变成.apk(An ...

  2. 【转】【Android】Android Studio打包全攻略

    项目写完了,现在需要把应用上传到市场,问题出现—怎么把代码变成.apk(Android的可安装文件).1. 创建签名文件2. 填写好签名参数3. 生成APK注意:签名的密码和密匙的密码注意保管,不要忘 ...

  3. Android屏幕适配全攻略 (转载)

    http://blog.csdn.net/jdsjlzx/article/details/45891551 https://github.com/hongyangAndroid/AndroidAuto ...

  4. Android使用XML全攻略(2)

    Android使用XML全攻略(2)   Android 是针对移动设备的一种新兴的开源操作系统和 SDK.借助它,您可以创建功能强大的移动应用程序.当您的应用程序可以访问 Web 服务时,其吸引力会 ...

  5. Android使用XML全攻略(1)

    Android使用XML全攻略(1)    Android 是针对移动设备的一种新兴的开源操作系统和 SDK.借助它,您可以创建功能强大的移动应用程序.当您的应用程序可以访问 Web 服务时,其吸引力 ...

  6. Android屏幕适配全攻略(最权威的官方适配指导)屏幕尺寸 屏幕分辨率 屏幕像素密度 dpdipdpisppx mdpihdpixdpixxdpi

    Android屏幕适配全攻略(最权威的官方适配指导)原创赵凯强 发布于2015-05-19 11:34:17 阅读数 153734 收藏展开 转载请注明出处:http://blog.csdn.net/ ...

  7. 【收藏】Android屏幕适配全攻略(最权威的Google官方适配指导)

    来源:http://blog.csdn.net/zhaokaiqiang1992 更多:Android AutoLayout全新的适配方式, 堪称适配终结者 Android的屏幕适配一直以来都在折磨着 ...

  8. Android屏幕适配全攻略(最权威的官方适配指导)(转),共大家分享。

    Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习 ...

  9. Android屏幕适配全攻略(最权威的官方适配指导) (转)

    招聘信息: Cocos2d-X 前端主程 [新浪微博]手机客户端iOS研发工程师 20k-40k iOS 开发工程师 iOS高级开发工程师(中国排名第一的企业级移动互联网云计算公司 和创科技 红圈营销 ...

随机推荐

  1. URL中不应出现汉字

    浏览器会在跳转时,先将汉字编译成 Unicode,然后跳转,导致hash值改变两次,相当于history 中 加入了两次URL 

  2. linux给一个文件夹开启权限

    假如要给一个叫做xiaobang的文件夹权限,CD到这一级目录 chmod -R 777 xiaobang

  3. 构造字典:DictionaryBase类和SortedList类

    DictionaryBase 类 msdn对DictionaryBase的文档解释 泛型KeyValuePair类 msdnd对泛型KeyValuePair类的文档解释 SortedList类 RUN ...

  4. python中读取文件的f.seek()方法

    用于二进制文件中F.seek方法 作用: 设置读写位置 F.seek(偏移量, whence=相对位置) 偏移量 大于0的数代表向文件末尾方向移动的字节数 小于0的数代表向文件头方向中移动的字节数 相 ...

  5. Java HotSpot JVM垃圾回收

    一.J2SE 5.0 HotSpot JVM堆内存包括:年轻代.老年代.永久代 年轻代包括:Eden区.Survivor区 Survivor区包括:From区.To区 1. 年轻代GC(young g ...

  6. Jmter-Test Fragment、Include Controller和Module Controller

    Test Fragment--测试片段 The Test Fragment is used in conjunction with the Include Controller and Module ...

  7. LOJ2321. 「清华集训 2017」无限之环【费用流】

    LINK 很好的一道网络里题 首先想插头DP的还是出门左转10分代码吧 然后考虑怎么网络流 首先要保证没有漏水 也就是说每个接口一定要有对应的接口 那么发现每个点只有可能和上下左右四个点产生联通关系 ...

  8. FileZilla Server配置

    1.在服务器上安装并配置服务端: 安装过程这里不再赘述,一直下一步,在跳出弹窗时勾选“Always connect to this server”,然后点击“Connect”即可(密码可自行设置) 之 ...

  9. 转载——关于bp神经网络

    一.BP神经网络的概念     BP神经网络是一种多层的前馈神经网络,其主要的特点是:信号是前向传播的,而误差是反向传播的.具体来说,对于如下的只含一个隐层的神经网络模型: (三层BP神经网络模型) ...

  10. saas 系统租户个性化域名&&租户绑定自己域名的解决方案

       实际的需求就类似github 的自定义page 1. 个性化域名    github 实现原理就是用户个性化域名使用泛域名解析,这个比较简单,大部分域名提供商都可以解决    具体操作不用赘述 ...