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

本文原创地址:http://blog.csdn.net/zivensonice/article/details/51672846 初出茅庐 手动打包 怎么手动打包 项目写完了,现在需要把应用上传到市场,问题出现—怎么把代码变成.apk(Android的可安装文件)。 1. 创建签名文件 2. 填写好签名参数 3. 生成APK

本文原创地址:http://blog.csdn.net/zivensonice/article/details/51672846

初出茅庐 手动打包

怎么手动打包

项目写完了,现在需要把应用上传到市场,问题出现—怎么把代码变成.apk(Android的可安装文件)。

1. 创建签名文件

013132ad1965102a71aa23caa4e4c52a.png

2. 填写好签名参数

33f7e0174cbc8af70af77fc5320bba74.png

3. 生成APK

注意:签名的密码和密匙的密码注意保管,不要忘了,签名文件别泄漏了,也别搞丢了

为什么要打包

我最开始就有这个疑问,我们的代码不是点了下运行按钮就直接安装到手机上了吗,我们在在项目Project目录的build/outputs/apk目录下可以找到刚刚新鲜生成的app-debug.apk.直接把这个上传给市场不就行了吗。

d10c6073b5d593e3a19a2b60d565f182.png

NO,当然不行,想想手机安装App的时候怎么来区分各个APK的。

通过包名+签名 来确定一个应用的唯一性,那个debug.apk只是系统用来给我们调试用的,如果上传到市场,怎么来保证他的安全性。

渐入佳境 渠道打包

OK,我们已经解决了第一步—怎么打包。上传上去后,市场反馈发现我们的App写得太棒了,这时候老大让赶快多上些平台,主流的平台、非主流的平台都要放上去。

那么问题来了,为了方便统计各个平台的安装情况,配合运营推广,需要统计各个平台的安装情况。

分渠道打包

不错,我们需要用到分渠道打包,那么我们需要解决两个问题

1. 怎么区分各个平台的标识

2. 怎么每次版本更新都生成几十个包、几百个包

第一个简单,用过友盟打包的同学肯定不陌生这段代码

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和Release

productFlavors打包渠道就在这儿配置咯 同时在AndroidManifest里面加上,渠道标识

package="example.com.makeapk">

android:name="UMENG_CHANNEL"

android:value="${UMENG_CHANNEL_VALUE}" />

...省略

3 现在还有个问题—代码写完了怎么生成渠道包呢

OK,在命令行输入 gradlew assembleRelease,表示生成所有Release包,生成的包在build\outputs\apk目录下,如果你要生成指定的包(uc|360|baidu),指定的版本(Release|Debug),右边的Gradle Project可以帮到你

c57222916271267981891271ccd393dc.png

4. 删除多余的 unaligned.apk

执行完-gradlew assembleRelease,发现一个问题,生成的不仅有我们需要的包,unaligned.apk类型的Apk也输出来了

e33a8dd8923615df855b8bf32fed5c6a.png

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

5698f7d5b1706be7f86f723641aa4958.png

选择红色部分,里面的编辑框可以帮助我们更快的熟悉Gradle

aded8af280c19e8346cafd8af9e2ac8d.png

5e71852b7ed89f1be017c9e1671a2854.png

5d22d86ffecedf6c2806b4384eb0d33a.png

c1fa6257e2cdb91e833f1c4ba4c76317.png

来看看代码和编辑框的具体关系吧

edf3d65890782b25084a7232cf1e89ad.png

7. 打包太多,需要清理一下

8b22e92f718ed21a680d0a9cbe3b718b.png

炉火纯青 恐龙快打

直接修改渠道号

想想,如果只是打渠道包的话,没有必要对整个项目进行编译,来生成渠道号。

如果能直接修改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到项目目录

c86841d0699bf7678fbe044bc5279a8f.gif

果然厉害,1S就出来这么多包。

反编译看看,包打得对不对

命令行

apktool d xxx.apk

1a146eefcbe8b85fb556a7beec785403.png

打开目录,首先确认我们生成的XML里面的标识符

42442c1be055b079fccfde8aa1f32fc2.png

然后看到,美团极速打包方案也完成

0e5297045f69e00237a447c81aee8732.png

但是,使用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大显神威的时候啦

变种版本是什么

打开方式

181d6e7d31d0e5ad5590bf53c5bd9da7.png

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

b3a59063deb19513ba5272cb7502d243.png

对比两个版本的不同

1b24a04ddba5b44c55d931ee007200ad.png

最后效果:

dee0f118976defda6f1351d6d777b648.png

bb6a97dd5345410a4b149af0b3e68084.png

构建

474b16c4bc5c23324546525ca9c18767.png

最后一个问题,

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

测试希望比较下不同环境下,App会有的差异

同时装上手机,也就是包名不同即可,显然现在的我们已经不用自己手动去改了,直接配置参数

a12a3093e33e9bd8e26d6f6c5302d672.png

最后,三个包都装到手机上了

29c976d2dce9ddbd7cf874cc98cf31fe.png

这个方式同样适合于Debug版本和Release版本同时安转到手机上。

比如你去面试,你想同时给面试官展示线上的版本和现在正在开发的版本,或者你想演示旧版本和新版版本的区别,你就可以通过这种方式达成.so easy…

构建定制版App

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

登峰造极 打包安全

待续…

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值