步骤:

1. 用 aapt工具生成R文件
aapt  package  -m -J  gen目录 -M AndroidManifest.xml  -S res目录  -I 编译版本sdk的android.jar的路径
如: "sdk安装目录\platforms\android-8\android.jar"

2. 用 aidl.exe 工具将.aidl文件生成对应的java类

3. 用 javac 编译所有的java文件,生成对应class文件。

4. 用 jar 命令将上面的class文件生成一个 jar包

5  用 proguard.jar 将上面的jar包混淆, (混淆应该是对class文件进行的,上面即使打包了可能也要解包,所以第4步可以省)

6. 用 dx.bat(调用了dx.jar)工具将混淆后的class文件,打包成一个 class.dex 文件

7. 用 aapt.exe 工具将 资源文件 打包成一个 resources.ap_  文件(好像对整个res目录都压缩了,但是解压apk后图片又是分目录存放的)

8. 用 apkbuilder.bat(调用了lib目录的sdklib.build.ApkBuilderMain)将 dex文件和打包后的资源文件 生成 apk文件

9. 用 jarsigner 对apk 进行签名,生成签名后的 apk 文件

10.用 zipalign.exe 工具对签名后的 apk 进行优化,生成最终的 apk 文件

下面是对应的ant脚本(去掉了混淆的步骤)。

build.xml

<?xml version="1.0" encoding="UTF-8"?>

<project name="DailyBuild" default="buildAll" basedir=".">

    <!-- 导入可配置文件 -->
<import file="build_option.xml" /> <!--导入构建过程定义文件 -->
<import file="build_common.xml" /> <!-- 调用common_build.xml中的target,按顺序组织,执行构建 <antcall target="obfuscate" />-->
<target name="buildAll">
<antcall target="init" />
<antcall target="generate" />
<antcall target="aidl" />
<antcall target="compile" />
<antcall target="package" />
<antcall target="dex" />
<antcall target="package_resouces" />
<antcall target="release" />
<antcall target="sign" />
<antcall target="zipalign" />
</target>
</project>

build_common.xml

<?xml version="1.0" encoding="UTF-8"?>

<project name="build_common" default="" basedir=".">

    <property name="src" value="src"/>                        <!-- 运行时源代码目录 -->
<property name="res" value="res"/> <!-- 运行时资源目录 -->
<property name="lib" value="libs"/> <!-- 运行时库目录 -->
<property name="assets" value="assets"/> <!-- 运行时assets目录 -->
<property name="bin" value="bin"/> <!-- 编译输出结果目录 -->
<property name="classes" value="classes"/> <!-- 运行时classes输出目录 -->
<property name="gen" value="gen" /> <!-- 运行时gen目录 -->
<property name="autotest" value="autotest" /> <!-- 自动化测试目录 -->
<property name="dex" value="classes.dex"/> <!-- dex路径 --> <property name="android_platform_tools" value="${android_home}/platform-tools"/>
<property name="android_framework" value="${android_home}/platforms/android-${android_version}/framework.aidl"/>
<property name="aapt" value="${android_platform_tools}/aapt"/>
<property name="aidl" value="${android_platform_tools}/aidl"/>
<property name="adb" value="${android_platform_tools}/adb"/>
<property name="dx" value="${android_platform_tools}/dx${bat}"/>
<property name="apkbuilder" value="${android_home}/tools/apkbuilder${bat}"/>
<property name="zipalign" value="${android_home}/tools/zipalign"/>
<property name="androidjar" value="${android_home}/platforms/android-${android_version}/android.jar"/> <!-- 执行初始化操作 -->
<target name="init">
<echo>start initialize...</echo>
<delete includeemptydirs="true" failonerror="false">
<fileset dir="${classes}" defaultexcludes="true"/>
<fileset dir="${gen}" defaultexcludes="true"/>
<fileset dir="${bin}" defaultexcludes="true"/>
</delete> <mkdir dir="${bin}" />
<mkdir dir="${classes}" />
<mkdir dir="${gen}" />
<mkdir dir="${lib}" />
</target> <!-- 生成R.java -->
<target name="generate">
<echo>generate R.java ...</echo>
<exec executable="${aapt}" failonerror="true">
<arg value="package" />
<arg value="-m" />
<arg value="-J" />
<arg value="${gen}" />
<arg value="-M" />
<arg value="AndroidManifest.xml" />
<arg value="-S" />
<arg value="${res}" />
<arg value="-I" />
<arg value="${androidjar}" />
</exec>
</target> <!-- 将aidl文件转换为java -->
<target name="aidl">
<echo>convert .aidl files to java...</echo>
<apply executable="${aidl}" failonerror="true">
<arg value="-p${android_framework}" />
<arg value="-I${src}" />
<arg value="-o${gen}" />
<fileset dir="${src}">
<include name="**/*.aidl"/>
</fileset>
</apply>
</target> <!-- 编译项目的.java文件 -->
<target name="compile">
<echo>compile source code...</echo>
<echo>>>>> debug默认打开,异常上报的还原功能依赖于它</echo>
<javac encoding="${encoding}"
debug="true"
extdirs=""
target="1.5"
destdir="${classes}"
bootclasspath="${androidjar}">
<src path="${src}"/>
<src path="${gen}"/> <classpath>
<fileset dir="${lib}" includes="*.jar"/>
</classpath>
</javac>
</target> <!-- 将class文件打包为jar -->
<target name="package">
<echo>Packing compile results...</echo>
<jar basedir="${classes}" destfile="temp.jar"/>
<echo>Copy jar to test directory...</echo>
<copy file="temp.jar" todir="${autotest}"/>
</target> <!-- 对打包后的结果进行混淆 -->
<target name="obfuscate" if="${release}">
<echo>start obfuscate ...</echo>
<delete includeemptydirs="true">
<fileset dir="${classes}" defaultexcludes="true"/>
</delete>
<java jar="${proguard_home}/lib/proguard.jar" fork="true" failonerror="true">
<jvmarg value="-Dmaximum.inlined.code.length=32"/>
<arg value="-injars temp.jar"/> <!-- 输入为class目录,而不是jar包,可以提高速度 -->
<arg value="-outjars ${classes}"/> <!-- 输出为class目录,而不是jar包,可以提高速度 -->
<arg value="-libraryjars ${androidjar}"/>
<arg value="-libraryjars ${lib}"/> <!-- 混淆依赖的库文件,指定目录即可 -->
<arg value="-printmapping ${bin}/mapping.txt"/> <!-- 混淆mapping信息 -->
<arg value="@proguard.cfg"/> <!-- 混淆参数定义 -->
</java>
</target> <!-- 将未混淆的classes文件打包为dex文件 -->
<target name="dex">
<echo>Coverting obfuscated class files to dex file...</echo>
<apply executable="${dx}" failonerror="true" parallel="true">
<arg value="-JXms1024m" />
<arg value="-JXmx1024m" />
<arg value="-JXss160k" />
<arg value="--dex" />
<arg value="--num-threads=4" />
<arg value="--output=${dex}" />
<arg path="${classes}" />
<fileset dir="${lib}" includes="*.jar"/>
</apply>
</target> <!-- 打包项目的资源文件 -->
<target name="package_resouces">
<echo>Package res and assets...</echo>
<exec executable="${aapt}" failonerror="true">
<arg value="package" />
<arg value="-f" />
<arg value="-M" />
<arg value="AndroidManifest.xml" />
<arg value="-S" />
<arg value="${res}" />
<arg value="-A" />
<arg value="${assets}" />
<arg value="-I" />
<arg value="${androidjar}" />
<arg value="-F" />
<arg value="${file_name}.ap_" />
</exec>
</target> <!-- 将资源文件及dex文件打包到一起 -->
<target name="release">
<echo>package dex and resources ...</echo>
<exec executable="${apkbuilder}" failonerror="true">
<arg value="${file_name}.apk" />
<arg value="-u" />
<arg value="-z" />
<arg value="${file_name}.ap_" />
<arg value="-f" />
<arg value="${dex}" />
<arg value="-rf" />
<arg value="${src}" />
<arg value="-rj" />
<arg value="${lib}" />
<arg value="-nf" />
<arg value="${lib}" />
</exec>
</target> <!-- 对包未混淆的包进行签名 -->
<target name="sign">
<echo>Begin sign unobfuscated package...</echo>
<exec executable="${signer}" failonerror="true">
<arg value="-verbose"/>
<arg value="-keystore"/>
<arg value="${keystore}"/>
<arg value="-storepass"/>
<arg value="${storepass}"/>
<arg value="-keypass"/>
<arg value="${keypass}"/>
<arg value="-signedjar"/>
<arg value="${file_name}_signed.apk"/>
<arg value="${file_name}.apk"/>
<arg value="${keyname}"/>
</exec>
</target> <!-- 对未混淆签名包做优化 -->
<target name="zipalign">
<echo>zipalign signed apk ...</echo>
<exec executable="${zipalign}" failonerror="true">
<arg value="-v" />
<arg value="4" />
<arg value="${file_name}_signed.apk" />
<arg value="${bin}/${file_name}_${cur_time}.apk" />
</exec>
</target> </project>

build_option.xml

<?xml version="1.0" encoding="UTF-8"?>

<project name="option" default="" basedir=".">    

    <property environment="env" />                                                <!-- 环境变量 -->
<property name="ws" value="${env.WORKSPACE}"/> <!-- 取服务器Woskspace路径 -->
<property name="isCI" value="false"/> <!-- true表示服务器环境,false表示本地环境 -->
<available file="${ws}/build.xml" property="isCI"/> <!-- 判断是否是持续集成服务器环境 -->
<property name="android_sdk_path" value="${env.ANDROID_SDK_18_2204_16}" /> <!-- 取sdk路径--> <property name="android_version" value="8"/>
<property name="encoding" value="UTF-8"/> <!-- 文件编码设置 -->
<property name="release" value="true"/> <!-- 默认输出release版本,带混淆 -->
<condition property="releasetype" value="debug" else="release">
<not>
<istrue value="${release}"/>
</not>
</condition> <condition property="bat" value="bat" else="">
<os family="windows" />
</condition> <!-- 判断系统类型 -->
<condition property="isWindows" value="true" else="false">
<os family="windows" />
</condition> <!-- 根据系统类型,设置服务器Android SDK路径 -->
<condition property="android_home_accord_ostype" value="${android_sdk_path}" else="D:/android-sdk-windows" >
<not>
<istrue value="${isWindows}"/>
</not>
</condition> <!-- 根据系统类型,设置服务器Proguard路径 -->
<condition property="proguard_path_accord_ostype" value="${env.ANDROID_PROGUARD_4_8}" else="C:/Progra~1/proguard4.4" >
<not>
<istrue value="${isWindows}"/>
</not>
</condition> <!-- 安装包名称,如果是本地,设置value的值 -->
<condition property="file_name" value="RDM" else="${env.BaseLine}">
<not>
<istrue value="${isCI}"/>
</not>
</condition> <!-- 本地工作区路径,如:D:/workspace/qqbrowser_android -->
<condition property="project_path" value="${basedir}" else="${basedir}">
<not>
<istrue value="${isCI}"/>
</not>
</condition> <!-- Android SDK路径,如果本地构建,请修改value的值 -->
<condition property="android_home" value="C:/android-sdk-windows" else="${android_home_accord_ostype}">
<not>
<istrue value="${isCI}"/>
</not>
</condition> <!-- Proguard路径,如果本地构建,请修改value的值 -->
<condition property="proguard_home" value="C:/Progra~1/proguard4.4" else="${proguard_path_accord_ostype}">
<not>
<istrue value="${isCI}"/>
</not>
</condition> <!-- 签名使用的jarsigner路径,如果JDK的bin目录路径已加入系统Path,则不用注明具体路径 -->
<condition property="signer" value="jarsigner" else="jarsigner">
<not>
<istrue value="${isCI}"/>
</not>
</condition> <property name="config_keystore_name" value="weigou_shop_keystore" /> <!-- 签名文件设置,请将签名文件放到SVN上,并在这里指定签名文件,建议将签名文件放到构建脚本同级目录,${project_path}即为工作目录-->
<property name="keystore" value="${project_path}/${config_keystore_name}"/> <!-- 签名的密钥名称设置-->
<property name="keyname" value="weigou_shop"/>
<!-- 签名的密码设置-->
<property name="keypass" value="201310161450"/>
<!-- 签名的密码设置-->
<property name="storepass" value="20131016"/> <tstamp>
<format property="cur_time" pattern="yyyy_MM_dd_hh.mm" locale="zh"/>
</tstamp> </project>

aidl是 Android Interface definitionlanguage的缩写。
它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口

aapt即Android Asset Packaging Tool , 在SDK的build-tools目录下:aapt.exe
该工具可以查看, 创建, 更新ZIP格式的文档附件(zip, jar, apk). 也可将资源文件编译成二进制文件.

aapt工具也支持很多子命令。
aapt l[ist]:列出资源压缩包里的内容。
aapt d[ump]:查看APK包内指定的内容。
aapt p[ackage]:打包生成资源压缩包。
aapt r[emove]:从压缩包中删除指定文件。
aapt a[dd]:向压缩包中添加指定文件。
aapt v[ersion]:打印aapt的版本。

android APK 文件的生成过程的更多相关文章

  1. 读取Android APK文件签名的方法

    在微信开放平台等申请API key 和secret时经常要用到apk文件签名,那么如何读取呢? 下面贴一下相关读取源码: 一共两个文件MainActivity和MD5, package com.lcg ...

  2. Xamarin 打包生成 Android apk 文件

    Visual Studio 支持 apk 发布 Xamarin.Forms项目或Xamarin.Android项目开发完成之后需要发布.比较常规的发布方式是生成 apk 文件,微软也考虑到开发者有发布 ...

  3. cocos2d-x 编译 安卓(android)apk文件

    摘要: 一.下载Android环境 搭建Android环境需要用到Android SDK.NDK.Ant和JDK: 下载Android SDK  下载Android NDk  下载Android JD ...

  4. 『原』在Linux下反编译Android .apk文件 使用apktool dex2jar JD-eclipse

    一.使用apktool 将 apk反编译生成程序的源代码和图片.XML配置.语言资源等文件 具体步骤: (1)下载反编译工具包:apktool 官方的打不开 http://apktool.shouji ...

  5. android apk 文件反编译

    最近,自己坑逼的把一个android 项目修改版本的代码删除了.这个项目居然还没上传到源代码管理器.幸好还有apk文件,修改的代码也不多可以反编译一下. 1.下载 dex2jar  获取源码工具  地 ...

  6. 只需三步--轻松反编译Android Apk文件

    安卓程序是通过java语言进行编写的,可以很容易进行反编译.很多apk文件被反编译后再二次打包,就成了自己的产品,很是流氓.下面我们来看看如何进行apk的反编译,以及常用的防反编译手段. 一.反编译A ...

  7. mac电脑批量解压android apk文件图形化工具--apkDecode

    mac电脑apk文件解压软件,简单的用图形界面将apktools包装了下,使用起来非常简单,可以将apk文件批量解压缩,方便大家查看一些东东,仅供学习目的. 使用步骤如下: 1 下载apkDecode ...

  8. Android APK 文件自动安装

    1.权限 <uses-permission android:name="android.permission.INSTALL_PACKAGES" /> 2.方法 Uri ...

  9. Android开发学习之反编译APK文件

    反编译的目的在于学习一些优秀的Android应用程序代码. 在进行反编译之前,需要准备好下面的软件工具(这些文件都放在同一文件下): 这些工具的下载地址:http://down.51cto.com/d ...

随机推荐

  1. word常用操作

    [Word2003文档添加个行号] 参考:http://jingyan.baidu.com/article/e9fb46e1ca1d3c7520f7666f.html#333225-tsina-1-5 ...

  2. sudo apt-get install apache2 php7.0 php7.0-mysql mysql-server

    sudo apt-get install apache2 php7.0 php7.0-mysql mysql-server sudo apt-get install libapache2-mod-ph ...

  3. JAVA 语法基础综合练习——学生成绩管理系统

    代码如下:package com.lovo.manager; import java.util.Scanner; /** * 学生管理 * * @author Administrator * */ p ...

  4. 移动web中一些问题处理与事件说明

    1.1.1 所有盒子以边框开始计算 /*设置宽度以边框开始计算*/-webkit-box-sizing: border-box;box-sizing: border-box; 在移动端通常使用的是百分 ...

  5. GridView获取CheckBox的值及所在列的ID

    //根据GridView的列数进行循环 ; i < GridView1.Rows.Count; i++) { //检查是否有ID为CheckBox1的CheckBox控件,如果有就赋值给Chec ...

  6. java 消息机制 ActiveMQ入门实例

    1.下载ActiveMQ 去官方网站下载:http://activemq.apache.org/ 我下载的时候是 ActiveMQ 5.14.0 Release版 2.运行ActiveMQ 解压缩ap ...

  7. Activity、Task、应用和进程

    http://www.cnblogs.com/franksunny/archive/2012/04/17/2453403.html Activity.Task.应用和进程 为了阅读方便,将文档转成pd ...

  8. .net web端导出Excel个人的看法

    //对已有方法进行重写 public override void VerifyRenderingInServerForm(Control control) { } //设置文件名 string fil ...

  9. linux学习笔记2-linux的常用命令

    第一篇博客:linux学习笔记1-ubuntu的安装与基本设置 之中,已经介绍了如何安装linux操作系统,以及一些基本的设置修改. 本篇博客主要介绍linux中的一些常用的终端命令 ======== ...

  10. spring HandlerInterceptorAdapter拦截ajax异步请求,报错ERR_INCOMPLETE_CHUNKED_ENCODING

    话不多说,直接上正文. 异常信息: Failed to load resource: net::ERR_INCOMPLETE_CHUNKED_ENCODING 问题描述: 该异常是在页面发送ajax请 ...