在Android开发中使用Ant 二:进行一次完整的打包
一次完整的Android打包要进行以下的几步:编译、代码混淆、打包apk、签名apk、apk优化。
为了能包涵使用NDK的情况,在这里使用一个有native代码的工程TestJni。
在工程根目录下新建local.properties文件,输入sdk和ndk的路径
例如:
sdk.dir=D:\\Android\\android-sdk
ndk.dir=D:\\Android\\android-ndk
在工程根目录下新建build.xml,输入代码
<?xml version="1.0" encoding="UTF-8"?> <project name="TestJni" default="my.package"> <loadproperties srcFile="local.properties" /> <loadproperties srcFile="project.properties" /> <fail message="sdk.dir is missing." unless="sdk.dir" /> <fail message="ndk.dir is missing." unless="sdk.dir" /> <target name="native"> <echo message="Building native libraries..." /> <exec executable="${ndk.dir}/ndk-build.cmd" failonerror="true" /> <echo message="DONE (Building native libraries)" /> </target> <import file="${sdk.dir}/tools/ant/build.xml" /> <target name="my.package" depends="native,release"> </target> </project>
my.package依赖于native和release,执行了一次ndk编译和release操作。
打开cmd,切换到工程根目录,输入ant my.package,等待build完成,在bin目录下生成了未签名的apk文件。
代码混淆
如果在project.properties中配置了proguard.config=proguard.cfg,release的时候会自动进行代码混淆。在${sdk.dir}/tools/ant/build.xml可以找到相应的target。
<target name="-release-obfuscation-check"> <echo level="info">proguard.config is ${proguard.config}</echo> <condition property="proguard.enabled" value="true" else="false"> <and> <isset property="build.is.mode.release" /> <isset property="proguard.config" /> </and> </condition> <if condition="${proguard.enabled}"> <then> <echo level="info">Proguard.config is enabled</echo> <!-- Secondary dx input (jar files) is empty since all the jar files will be in the obfuscated jar --> <path id="out.dex.jar.input.ref" /> </then> </if> </target>
proguard.enabled的依据就是在release模式下,并且设置proguard.config这个属性。
签名
在${sdk.dir}/tools/ant/build.xml查找release target
<target name="release" depends="-set-release-mode, -release-obfuscation-check, -package, -post-package, -release-prompt-for-password, -release-nosign, -release-sign, -post-build" description="Builds the application in release mode."> </target>
我们看到有 -release-sign 这个 targer,继续查找这个target
查看第一行
<target name="-release-sign" if="has.keystore" >
如果执行签名的话 has.keystore 这个条件要成立,继续查找 has.keystore
<!-- properties for signing in release mode --> <condition property="has.keystore"> <and> <isset property="key.store" /> <length string="${key.store}" when="greater" length="0" /> <isset property="key.alias" /> </and> </condition> <condition property="has.password"> <and> <isset property="has.keystore" /> <isset property="key.store.password" /> <isset property="key.alias.password" /> </and> </condition>
找到上面两个 condition,has.keystore成立的条件是设置了 key.store 和 key.alias 这两个property,并且 key.store 长度不能为0。
has.password 成立的条件是,has.keystore成立, 并且设置了 key.store.password 和 key.alias.password,如果没有这两个属性的话,在build过程中会要求输入密码。
在local.properties中添加这些属性
key.store=D:\\Android\\keystore\\test_key.keystore
key.alias=test_key
key.store.password=123456
key.alias.password=123456
打开cmd,切换到工程根目录,执行 ant my.package, 在bin目录中生成了 TestJni-release.apk 。
检查生成的apk是否进行了优化
至此,打包完成。
在Android开发中使用Ant 二:进行一次完整的打包的更多相关文章
- 在Android开发中使用Ant 一:环境的搭建及入门
配置Ant环境 下载Ant:http://ant.apache.org/bindownload.cgi 在windows上应该选择zip压缩包,将zip压缩包解压到一个目录. 打开系统环境变量,在系统 ...
- 在Android开发中使用Ant 三:批量打包
批量打包最常用到的地方是进行产品推广时,为每个渠道打一个包.上一篇随笔中,介绍了怎样进行一次完整的打包,批量打包只要在此基础上做一次循环即可. 在打包之前要做两个准备工作,一个是读取渠道,一个是修改存 ...
- 设计模式笔记之二:Android开发中的MVP架构(转)
写在前面,本博客来源于公众号文章:http://mp.weixin.qq.com/s?__biz=MzA3MDMyMjkzNg==&mid=402435540&idx=1&sn ...
- 【转】android开发中关于模拟器emulation的常见问题
[转]android开发中关于模拟器emulation的常见问题 Trouble: 无法启动android模拟器,提示 XDM authorization key matches an existin ...
- 在Android开发中,定时器一般有以下3种实现方法
在Android开发中,定时器一般有以下3种实现方法: 原文地址http://www.360doc.com/content/12/0619/13/87000_219180978.shtml 一.采用H ...
- MVP模式在Android开发中的应用
一.MVP介绍 随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的可视化以及与用户的交互.同一 ...
- 5个Android开发中比较常见的内存泄漏问题及解决办法
android中一个对象已经不需要了,但是其他对象还持有他的引用,导致他不能回收,导致这个对象暂存在内存中,这样内存泄漏就出现了. 内存泄漏出现多了,会是应用占用过多的没存,当占用的内存超过了系统 ...
- Builder模式详解及其在Android开发中的应用
一.引言 在Android开发中,采用Builder模式的代码随处可见,比如说Android系统对话框AlertDialog的使用或者是Android中的通知栏(Notification)的使用,又比 ...
- Dagger2在Android开发中的应用
世界是普遍联系的,任何事物和个体都直接或间接相互依赖,在时空长河中共同发展.在面向对象的世界中,更是如此,类与类之间的依赖,关联关系,模块(亦或是分层架构中的层)之间的耦合关系,都是我们在软件开发实践 ...
随机推荐
- JS文件放在头还是尾
目前绝大部分的浏览器都是采取阻塞方式(Scripts Block Downloads)加载Javascript文件的:javascript在头部会阻止其他元素并行加载(css,图片,网页):这种机制的 ...
- Oracle 给已创建的表增加自增长列
对于已经创建的表,在特殊需求下,需要增加一个自增长列步骤: --1. 增加 自增长列 ); --2. 程序方式更新设置 IdNum 列 值 --3.查询最大 ) From Limsbusinessen ...
- Flatic – 超齐全的 Web 元素界面素材库免费下载
Flatic 是一个庞大的用户界面工具包,包含数以百计的网页元素,这将有助于你在 Photoshop 中轻松设计整个网站.成套的图标和动作都已包含在套件中.该素材包包括超过100个 PSD 元素.您可 ...
- OpenGL开发环境配置-Windows/MinGW/Clion/CMake
因为某些原因,不想用过于臃肿的VS了,转而使用常用的jetbrains的CLion,Clion沿袭了jetbrans的优良传统,基本代码提示功能还是比较好的,不过就是对于windows不熟悉cmake ...
- C# 只启动一个实例完全解决方案
工作上经常会遇到"程序只能启动一个实例"这样的需求. 我想,这样的需求应该很普遍,所以没打算去动脑筋,去找谷歌问下就得了,用下来发现,不是这里不爽就是那里不行. 先说下我详细的几点 ...
- js 变量提升+方法提升
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- SQL语句技巧之去除重复行
去除表中重复行数据,可能大家立马就想到的是用DISINTCT关键字,但DISINTCT只能是去除表中所有列都相同的行,若碰到需要去除表中多个字段重复的行(即:部份相同,部份不相同),那么该如何做呢?我 ...
- JS魔法堂:阻止元素被选中
一.前言 在为IE5.5~9polyfill HTML5新特性placeholder时需要阻止元素被选中,因此在网上.书上查阅相关资料,记录在此以便日后查阅. 二.IE10+实现方式──CSS3 .u ...
- Spring MVC的web.xml配置详解(转)
出处http://blog.csdn.net/u010796790 1.spring 框架解决字符串编码问题:过滤器 CharacterEncodingFilter(filter-name) 2.在w ...
- SQL各种连接查询详解(左连接、右连接..)
一.交叉连接(cross join) 交叉连接(cross join):有两种,显式的和隐式的,不带on子句,返回的是两表的乘积,也叫笛卡尔积. 例如:下面的语句1和语句2的结果是相同的.语句1:隐式 ...