使用Ant打包Android应用详解

  计划写个完整的使用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参数后面的点是表示当前目录

在工程目录下就会生成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: 工程目录/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中工程自动编译的文件与ant生成文件冲突,只要关掉eclipse的自动编译,clean下工程重新跑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:工程目录/bin/proguard
[jar] Building jar: 工程目录/bin/proguard/original.jar
[proguard] ProGuard, version 5.2.1
...

可以看到我用的proguard版本,但是用ant debug是没有proguard,因为只有release版本才需要混淆,具体原因后续文章会详细讲述。混淆后的mapping文件在bin目录下。

注意的问题:工程的AndroidManifest.xml中如果配置了android:debuggable=true,那么即使ant release也不会混淆代码

3.签名

首先给apk签名需要keystore,具体的生成此处不细讲,简单的说在eclipse中选则工程,右键android tools -> export android application 中有生成选项

其次是在工程目录下新建ant.properties文件,里面配置你的签名信息

例如:

key.store=kestore文件的路径

key.store.password=密码

key.alias.password=密码

key.alias=别名

此时再执行ant release,在bin目录下可生成“工程名-release.apk”,你最终要的release版本的apk

到此,简单android工程的的ant编译打包完成,非常方便。

二、添加定制化

1.加入so库

Android应用的Ant编译默认是不会编译jni工程的,它只会处理libs中的库文件。如果你的libs中刚好有编译好的so,那打包好的apk似乎能正常运行。在配置好的jni工程,只要运行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库是否已生成

如果你的jni工程是作为库工程存在,方法是一样的。主工程依赖你的库工程,在库工程中也生成build.xml,然后按照上面的方法操作即可。

2.调用隐藏api,加入android.jar

不少工程是基于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.一个工程中多源码目录

如果一个工程中设置了多个源码目录,不太合适的方法就是先拷贝其它的源码目录到默认的src下,在编译完成后再删除。其实顺便看看文件拷贝和删除,在多源码目录的工程中也建立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文件,之后在打包完成后删除拷贝的源码目录。

一个工程中的源码尽量就弄在一个目录里吧。其它问题还有如库工程间的资源引用,如果直接使用默认的R文件是没有问题的,但是要是在eclipse中利用build Java Build Path->project添加了子工程,并且还用了其中的R文件来应用资源,那么ant打包就还得再继续折腾

结尾:

这里仅给出了使用Ant打包Android应用的基本过程和可能问题的解决方法,至于ant的使用和打包原理既可以看参考文章,也可以看后续的补充文章。

参考:

1.android命令详细说明http://developer.android.com/tools/help/android.html

2.ant参考手册https://ant.apache.org/manual/

3.ant打包apk详细的过程可阅读sdk/tools/ant/build.xml文件

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-29 07:14:57

使用Ant打包Android应用详解的相关文章

使用Ant打包Android应用详解——Ant使用解析

上篇<使用Ant打包Android应用详解>描述了使用Ant打包的流程,但很多步骤并没有说明如此做的原因,本篇将从Ant方面来理解,下一篇从APK生成的流程来说明. APK包的生成是一系列操作的结果,而Ant则是将这一系列操作流程化,提供出定制化的接口,以及可配置的参数供修改,而这些都是通过指定的构建文件来实现.我们就从Ant的打包流程来理解Ant的一些基本用法.当在命令行中执行ant,默认会去解析当前目录的build.xml作为构建文件.下面是个删除部分注视的版本: <project

[gitbook] Android框架分析系列之Android Binder详解

请支持作者原创: https://mr-cao.gitbooks.io/android/content/android-binder.html Android Binder详解 Table of Contents 1. binder简介 2. binder的实现 2.1. IBinder类简介 2.2. IInterface类简介 2.3. BpBinder和BBinder简介 2.4. ProcessState和IPCThreadState简介 2.5. ServiceManager简介 2.

Ant之build.xml详解

Ant的概念 可能有些读者并不连接什么是Ant以及入可使用它,但只要使用通过Linux系统得读者,应该知道make这个命令.当编译Linux内核及一些软件的源程序时,经常要用这个命令.Make命令其实就是一个项目管理工具,而Ant所实现功能与此类似.像make,gnumake和nmake这些编译工具都有一定的缺陷,但是Ant却克服了这些工具的缺陷.最初Ant开发者在开发跨平台的应用时,用样也是基于这些缺陷对Ant做了更好的设计. Ant 与 makefile Makefile有一些不足之处,比如

android WebView详解,常见漏洞详解和安全源码

这篇博客主要来介绍 WebView 的相关使用方法,常见的几个漏洞,开发中可能遇到的坑和最后解决相应漏洞的源码,以及针对该源码的解析. 由于博客内容长度,这次将分为上下两篇,上篇详解 WebView 的使用,下篇讲述 WebView 的漏洞和坑,以及修复源码的解析. 下篇:android WebView详解,常见漏洞详解和安全源码(下) 转载请注明出处:http://blog.csdn.net/self_study/article/details/54928371. 对技术感兴趣的同鞋加群 54

Android 签名详解

在Android 系统中,所有安装 到 系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个 permission的protectionLevel为signature,那么就只有那些跟该permission所在的程序拥有同一个数字证书的应 用程序才能取得该权限.Android使用Java的数字证书相关的机制来 给apk加盖数字证书,要理解android的数字证书,需要先了解以下数字证书的概念和java的数字证书机制.Android系统要求每一个

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

上篇<使用Ant打包Android应用具体解释>描写叙述了使用Ant打包的流程,但非常多步骤并没有说明如此做的原因,本篇将从Ant方面来理解,下一篇从APK生成的流程来说明. APK包的生成是一系列操作的结果,而Ant则是将这一系列操作流程化.提供出定制化的接口,以及可配置的參数供改动,而这些都是通过指定的构建文件来实现. 我们就从Ant的打包流程来理解Ant的一些基本使用方法. 当在命令行中运行ant.默认会去解析当前文件夹的build.xml作为构建文件.以下是个删除部分注视的版本号: &

使用Ant打包Android应用具体解释

计划写个完整的使用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 一.简单应用出包流

android动画详解三 动画API概述

· 属性动画与view动画的不同之处 view动画系统提供了仅动画View 对象的能力,所以如果你想动画非View 对象,你就要自己实现代码. view动画系统实际上还被强制仅能对 View 的少数属性进行动画,比如缩放和旋转,而不能对背景色进行. view动画的另一个坏处是它仅修改View的绘制位置,而不是View的实际位置.例如,如果你动画一个移动穿越屏幕,button的绘制位置是正确的,但实际你可以点击它的位置却没有变,所以你必须去实现你自己的逻辑来处理它. 使用属性动画系统时,这个限制被

android矩阵详解

Matrix,中文里叫矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放.平移.旋转等操作. 在Android里面,Matrix由9个float值构成,是一个3*3的矩阵.最好记住.如下图: 解释一下,上面的sinX和cosX,表示旋转角度的cos值和sin值,注意,旋转角度是按顺时针方向计算的. translateX和translateY表示x和y的平移量.scale是缩放的比例,1是不变,2是表示缩放1/2,这样子. 在android.graphics.Matrix中有对应旋转的函