计划写个完整的使用Ant打包Android应用的系列文章。三篇文章。首篇具体介绍採用Ant打包Android应用的流程。列出部分定制问题及其解决方法,第二篇介绍我理解的Ant打包的思路与主要的概念和使用,最后一篇描写叙述apk包的生成过程。
    实现的环境:
    操作系统:ubuntu 64bit 14.04
    Android SDK Build Tools:22.0.1
    Android SDK Tools:24.3.3
    Ant:1.9.4
    ProGuard:5.2.1
    JDK:1.7
一、简单应用出包流程
  这里的出包流程包含编译、代码混淆、apk签名。

对于简单的Android应用。简单的几步操作就能完毕:

1.生成Ant编译须要的build.xml
    在SDK文件夹的tools下,调用android update project生成,详细命令的使用方法能够查看參考1。比如:切换到你的工程文件夹
    android update project --name 自己起的工程名 -p .
    -p參数后面的点是表示当前文件夹
    在project文件夹下就会生成Ant编译须要的build.xml,直接执行ant debug。就可以完毕编译,并在bin文件夹下生成debug版本号的apk包。须要注意的几个问题是:
(1)自己主动生成的build.xml生成了几个跟Android相关的target呢:能够通过直接输入ant来查看help说明
(2)遇到BUILD FAILED怎样解决:能够查看BUILD FAILED上面的log看运行到什么地方,还有看提示在build.xml的哪一行出现故障。这里的build.xml是指在sdk/tools/ant下的,比如:
[aapt] invalid resource directory name: project文件夹/bin/res crunch

BUILD FAILED
sdk/tools/ant/build.xml:649: The following error occurred while executing this line:
build.xml:694:null returned: 1
一般看到res crunch,应该就是你在eclipse中project自己主动编译的文件与ant生成文件冲突。仅仅要关掉eclipse的自己主动编译。clean下project又一次跑ant就可以。

  (3)能够留心看下project.properties和local.properties
2.加入代码混淆
在工程的project.properties文件里有凝视说明怎样打开代码混淆
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
去除#号就可以,同一时候能够在proguard-project.txt添加你须要特殊处理的配置

改动后,再运行ant release,你会在输出中看到
-obfuscate:
[mkdir] Created dir:project文件夹/bin/proguard
[jar] Building jar: project文件夹/bin/proguard/original.jar
[proguard] ProGuard, version 5.2.1
...
能够看到我用的proguard版本号。可是用ant debug是没有proguard,由于仅仅有release版本号才须要混淆,具体原因兴许文章会具体讲述。混淆后的mapping文件在bin文件夹下。
    注意的问题:project的AndroidManifest.xml中假设配置了android:debuggable=true,那么即使ant release也不会混淆代码
3.签名
    首先给apk签名须要keystore。详细的生成此处不细讲,简单的说在eclipse中选则project,右键android tools -> export android application 中有生成选项
    其次是在project文件夹下新建ant.properties文件,里面配置你的签名信息
比如:
key.store=kestore文件的路径

key.store.password=密码

key.alias.password=密码

key.alias=别名
此时再运行ant release,在bin文件夹下可生成“project名-release.apk”。你终于要的release版本号的apk

到此,简单androidproject的的ant编译打包完毕,很方便。


二、加入定制化
    1.增加so库
    Android应用的Ant编译默认是不会编译jniproject的,它仅仅会处理libs中的库文件。

假设你的libs中刚好有编译好的so,那打包好的apk似乎能正常执行。在配置好的jniproject,仅仅要执行ndk的ndk-build就可以完毕so的编译。因此,仅仅要在build.xml同文件夹中加入custom_rules.xml文件,内容例如以下:

<?xml version="1.0" encoding="UTF-8"?>
<project name="工程名" default="help">
<target name="-pre-compile">
<echo >ndk build.............................</echo>
<exec executable="${ndk.dir}/ndk-build" >
</exec>
</target> </project>
在同文件夹下的local.properties中添加一行。指定你的ndk文件夹
ndk.dir=ndk路径
再次运行ant release,查看你的so库是否已生成

    假设你的jniproject是作为库project存在,方法是一样的。

主project依赖你的库project,在库project中也生成build.xml,然后依照上面的方法操作就可以。

    2.调用隐藏api,增加android.jar
    不少project是基于Android原生代码改动而来。或者就是想调用系统隐藏的部分api,就会用到别人编译好的android.jar,或者framework.jar等其他什么名字的库文件,并且会要求载入的顺序在你选择的android编译版本号之前。

在eclipse的Java Build Path->Libraries中调整其载入顺序,那么ant编译怎么改动呢?还是利用前面编写的custom_rules.xml,内容例如以下:

<?xml version="1.0" encoding="UTF-8"?>
<project name="hooktest" default="help">
<property name="project.target.android.jar" value="${sdk.dir}/platforms/${target}/android.jar" />
<target name="-pre-compile"> <echo >set project target class path.............................</echo> <path id="project.target.class.path">
<pathelement location="framework.jar"/>
<pathelement location="${project.target.android.jar}"/>
</path> <property name="my.project.target.class.path" refid="project.target.class.path" />
<echo message="project.target.class.path:${my.project.target.class.path}" /> </target>
</project>
3.一个project中多源代码文件夹
    假设一个project中设置了多个源代码文件夹,不太合适的方法就是先拷贝其他的源代码文件夹到默认的src下,在编译完毕后再删除。事实上顺便看看文件拷贝和删除,在多源代码文件夹的project中也建立custom_rules.xml,主要内容例如以下:
<target name="-pre-build">
<echo >copy file.............................</echo>
<copy todir="${source.absolute.dir}"> <fileset dir="其他源代码文件夹">
<include name="**/*.java" />
<include name="**/*.aidl" />
</fileset>
</copy>
</target> <target name="src-clean" >
<echo >delete file.............................</echo>
<delete dir="${source.absolute.dir}/拷贝的源代码文件夹" />
</target> <target name="-post-build" depends="src-clean">
</target>
<target name="-pre-clean" depends="src-clean">
</target>
上述代码在运行ant clean时也会运行删除拷贝的源代码操作。而在编译前先拷贝源代码。包含aidl文件。之后在打包完毕后删除拷贝的源代码文件夹。


   一个project中的源代码尽量就弄在一个文件夹里吧。

其他问题还有如库project间的资源引用,假设直接使用默认的R文件是没有问题的,可是要是在eclipse中利用build Java Build Path->project加入了子project,而且还用了当中的R文件来应用资源,那么ant打包就还得再继续折腾


结尾:
    这里仅给出了使用Ant打包Android应用的基本过程和可能问题的解决方法,至于ant的使用和打包原理既能够看參考文章。也能够看兴许的补充文章。


參考:
1.android命令具体说明http://developer.android.com/tools/help/android.html
3.ant打包apk具体的过程可阅读sdk/tools/ant/build.xml文件

使用Ant打包Android应用具体解释的更多相关文章

  1. 使用Ant打包Android应用具体解释——Ant使用解析

    上篇<使用Ant打包Android应用具体解释>描写叙述了使用Ant打包的流程,但非常多步骤并没有说明如此做的原因,本篇将从Ant方面来理解,下一篇从APK生成的流程来说明. APK包的生 ...

  2. 使用ANT打包Android应用

    大家好,今天来分享一下如何使用ANT打包Android应用. 通常我们习惯用eclipse来开发Android程序,它会自动帮我们打包当前的应用程序.如果在Navigator视图下,我们可以看到以下几 ...

  3. Ant打包Android代码生成apk文件

    可參考下面,实现一套代码不同渠道的打包 http://blog.csdn.net/liuhe688/article/details/6679879 http://cnn237111.blog.51ct ...

  4. 【Android开发经验】使用Ant批量打包Android应用全然指南

    本文章由Socks完毕.博客地址:http://blog.csdn.net/zhaokaiqiang1992 转载请说明. 折腾了一下午.百度了一下午,最终实现了使用Ant对Android应用的批量打 ...

  5. 通过ant脚本编译打包android工程

    通过ant脚本,编译打包android工程 1.Android程序编译.打包.签名.发布的三种方式:  方式一:命令行手动编译打包  方式二:使用ant自动编译打包  方式三:使用eclipse+AD ...

  6. Android - Ant自动编译打包android项目 -- 1(转)

    1.  背景: Eclipse用起来虽然方便,但是编译打包android项目还是比较慢,尤其当要将应用打包发布到各个渠道时,用Eclipse手动打包各种渠道包就有点不切实际了,这时候我们用到Ant帮我 ...

  7. Android Ant打包笔记

    本文文档的下载地址(Word版):http://download.csdn.net/detail/yangwei19680827/7250711 Android Ant 打包 网上找了ant打包的资料 ...

  8. 【转】Android项目使用Ant打包,生成build.xml

    记不住,于是原帖转过来,请看原帖:http://blog.csdn.net/ms03001620/article/details/8490238 一.生成build.xml Eclipse中使用Ant ...

  9. [原]Android打包之Ant打包

    Android自动打包流程详细图: 使用Ant打包会简单很多,只要使用以下两个命令就可以搞定: android update project -p . --target android-18 ant ...

随机推荐

  1. @Autowired 凝视遇到的问题,@Qualifier 帮助解决这个问题

    当候选 Bean 数目不为 1 时的应对方法 在默认情况下使用 @Autowired 凝视进行自己主动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个. 当找不到一个匹配的 Be ...

  2. OpenCV+海康威视摄像头的实时读取

    OpenCV+海康威视摄像头的实时读取 本文由 @lonelyrains出品.转载请注明出处. 文章链接: http://blog.csdn.net/lonelyrains/article/detai ...

  3. 0x35 高斯消元与线性空间

    颓了十天回来做题果然…… 感觉还是很有收获的,这两以前都没学过 bzoj1013: [JSOI2008]球形空间产生器sphere poj1830(upd) 之前做得很烂还被 D飞*2 了..重做一次 ...

  4. POJ 2239 匈牙利算法

    思路:最大匹配 也是很裸的一道题-. // by SiriusRen #include <cstdio> #include <cstring> #include <alg ...

  5. redis的windows版本下载地址及windows的客户端工具

    源码:https://github.com/MSOpenTech/redis 安装包:https://github.com/MSOpenTech/redis/releases 客户端工具:https: ...

  6. 【转】解析<button>和<input type="button"> 的区别

    一.定义和用法 <button> 标签定义的是一个按钮. 在 button 元素内部,可以放置文本或图像.这是<button>与使用 input 元素创建的按钮的不同之处. 二 ...

  7. DirectUI界面编程(零)简介

    有过Win32.MFC编程经验的朋友应该都知道,传统Windows应用中的按钮.编辑框等控件都是一个子窗口,操作系统通过窗口句柄来唯一标识该窗口. 使用Windows 标准控件创建用户界面,美化起来是 ...

  8. 大数据量.csv文件导入SQLServer数据库

    前几天拿到了一个400多M的.csv文件,在电脑上打开要好长时间,打开后里面的数据都是乱码.因此,做了一个先转码再导入数据库的程序.100多万条的数据转码+导入在本地电脑上花了4分钟,感觉效率还可以. ...

  9. HDU 1203 I NEED A OFFER!【01背包】

    解题思路:攒下的钱n相当于包的容量,然后是m个学校的申请费用,申请费用相当于每一个物品的消耗,得到offer的概率相当于每一个物品的价值. 因为要求的是至少得到一份0ffer的概率的最大概率,可以转化 ...

  10. JS中通过LayUI的layer.prompt弹出文本输入层,多个按钮回调获取输入值

    JS中通过LayUI弹出文本输入层,多个按钮回调: 如图所示,输入文本后点击通过/不通过按钮回调获取输入文本值的实现: 实现JS: layer.prompt({ formType: 2, // 弹出文 ...