Android自动打包流程详细图:

步骤一:

在工程中新建一个build.xml.

步骤二:

给工程配置ant工具。

选择ant工具的步骤如下:

Windows->Shown view->Ant 这样就出项了ant视图框。在ant视图框中单击右键,选择addBuilderfile添加ant编译文件。

添加好ant编译文件后,我们还需要对编译文件进行设置:选中编译文件,右键单击选择Run As->external Tools configurations

弹出了ant编译的配置框。

在编译ant文件时,我们常常遇到编译进程卡住现象,这是因为ant编译器找不到日志输出文件造成的。可以在ant编译框中的Main->Argument文本框中添加如下语句:-logger org.apache.tools.ant.NoBannerLogger,这样指定ant编译时的日志编译器。

如果在编译工程时,遇到不可映射的字符集(工程字符集和ant编译器的字符集不一致)时,可以修改ant的编译时字符集

步骤如下:在ant编译配置框中选择common->Console Encoding设置ant的字符集

步骤三:

编写build.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="AndroidTouchDemo">
<!-- 指定配置文件 -->
<property file="default.properties">
</property>
<property file="local.properties">
</property> <!-- 定义工具目录 -->
<property environment="env">
</property>
<property name="platforms.target" value="android-19">
</property>
<property name="build.tools.target" value="19.1.0">
</property>
<property name="sdk.dir" value="${env.ANDROID_SDK}">
</property>
<property name="android.tools.dir" value="${sdk.dir}/tools">
</property>
<property name="android.buildtools.dir" value="${sdk.dir}/build-tools/${build.tools.target}">
</property>
<property name="android.platformtools.dir" value="${sdk.dir}/platform-tools">
</property>
<property name="android.platforms.dir" value="${sdk.dir}/platforms/${platforms.target}">
</property> <!--
<echo message="sdk.dir:${sdk.dir}"/>
<echo message="android.tools.dir:${android.tools.dir}"/>
<echo message="android.platformtools.dir:${android.platformtools.dir}"/>
<echo message="android.platforms.dir:${android.platforms.dir}"/>
--> <property name="android.tools.absolute.dir" location="${android.tools.dir}">
</property>
<property name="android.platformtools.absolute.dir" location="${android.platformtools.dir}">
</property>
<property name="android.platforms.absolute.dir" location="${android.platforms.dir}">
</property>
<property name="android.buildtools.absolute.dir" location="${android.buildtools.dir}">
</property> <!--
<echo message="android.tools.absolute.dir:${android.tools.absolute.dir}"/>
<echo message="android.platformtools.absolute.dir:${android.platformtools.absolute.dir}"/>
<echo message="android.platformtools.dir:${android.platformtools.dir}"/>
<echo message="android.platforms.absolute.dir:${android.platforms.absolute.dir}"/>
--> <!-- 定义工具 -->
<property name="proguard.jar" location="${android.tools.dir}/proguard/lib/proguard.jar">
</property>
<property name="android.jar" location="${android.platforms.absolute.dir}/android.jar">
</property>
<property name="tools.dx" location="${android.buildtools.dir}/dx">
</property>
<property name="tools.apkbuilder" location="${android.buildtools.absolute.dir}/apkbuilder">
</property>
<property name="tools.adb" location="${android.platformtools.absolute.dir}/adb">
</property>
<property name="tools.zipalign" location="${android.buildtools.dir}/zipalign">
</property>
<property name="tools.aapt" location="${android.buildtools.absolute.dir}/aapt">
</property>
<property name="tools.aidl" location="${android.buildtools.absolute.dir}/aidl">
</property>
<property name="tools.jarsigner" location="${env.JAVA_HOME}/bin/jarsigner">
</property>
<!--
<echo message="proguard.jar: ${proguard.jar}"/>
<echo message="android.jar: ${android.jar}"/>
<echo message="tools.dx:${tools.dx}"/>
<echo message="tools.apkbuilder:${tools.apkbuilder}"/>
<echo message="tools.adb:${tools.adb}"/>
<echo message="tools.zipalign:${tools.zipalign}"/>
<echo message="tools.aapt:${tools.aapt}"/>
<echo message="tools.aidl:${tools.aidl}"/>
<echo message="tools.jarsigner:${tools.jarsigner}"/>
--> <!-- 定义源代码及资源等输入目录 -->
<property name="in.source.dir" value="src">
</property>
<property name="in.resource.dir" value="res">
</property>
<property name="in.asset.dir" value="assets">
</property> <property name="in.source.absolute.dir" location="${in.source.dir}">
</property>
<property name="in.resource.absolute.dir" location="${in.resource.dir}">
</property>
<property name="in.asset.absolute.dir" location="${in.asset.dir}">
</property> <!--
<echo message="in.source.dir:${in.source.dir}"/>
<echo message="in.resource.dir:${in.resource.dir}"/>
<echo message="in.asset.dir:${in.asset.dir}"/>
--> <!-- 定义本地库/第三方工具库文件目录 -->
<property name="in.external.libs.dir" value="libs">
</property>
<property name="in.native.libs.dir" value="libs">
</property> <property name="in.external.libs.absolute.dir" location="${in.external.libs.dir}">
</property>
<property name="in.native.libs.absolute.dir" location="${in.native.libs.dir}">
</property> <!--
<echo message="in.external.libs.dir:${in.external.libs.dir}"/>
<echo message="in.native.libs.dir:${in.native.libs.dir}"/>
--> <!-- 定义输入文件 -->
<property name="in.manifest.file" value="AndroidManifest.xml">
</property>
<property name="in.android.aidl.file" value="${android.platforms.dir}/framework.aidl">
</property> <property name="in.manifest.absolute.file" location="${in.manifest.file}">
</property>
<property name="in.android.aidl.absolute.file" location="${in.android.aidl.file}">
</property> <!--
<echo message="in.manifest.file:${in.manifest.file}"/>
<echo message="in.android.aidl.file:${in.android.aidl.file}"/>
--> <!-- 定义输出文件目录 -->
<property name="out.gen.dir" value="gen">
</property>
<property name="out.dir" value="bin">
</property>
<property name="out.classes.dir" value="${out.dir}/classes">
</property> <property name="out.gen.absolute.dir" location="${out.gen.dir}">
</property>
<property name="out.absolute.dir" location="${out.dir}">
</property>
<property name="out.classes.absolute.dir" location="${out.classes.dir}">
</property>
<property name="release.absolute.dir" location="${release-dir}">
</property> <!--
<echo message="out.gen.dir:${out.gen.dir}"/>
<echo message="out.dir:${out.dir}"/>
<echo message="out.classes.dir:${out.classes.dir}"/>
--> <!-- 定义输出文件 -->
<property name="out.dex.file" value="${ant.project.name}-classes.dex">
</property>
<property name="out.resource.package.file" value="${ant.project.name}-resource.apk">
</property>
<property name="out.unsigned.package.file" value="${ant.project.name}-unsigned.apk">
</property>
<property name="out.signed.package.file" value="${ant.project.name}-signed.apk">
</property>
<property name="out.aligned.package.file" value="${ant.project.name}-aligned.apk">
</property>
<property name="release.package.file" value="${ant.project.name}-release.apk">
</property> <property name="out.dex.absolute.file" location="${out.dir}/${out.dex.file}">
</property>
<property name="out.resource.package.absolute.file" location="${out.dir}/${out.resource.package.file}">
</property>
<property name="out.unsigned.package.absolute.file" location="${out.dir}/${out.unsigned.package.file}">
</property>
<property name="out.signed.package.absolute.file" location="${out.dir}/${out.signed.package.file}">
</property>
<property name="out.aligned.package.absolute.file" location="${out.dir}/${out.aligned.package.file}">
</property>
<property name="release.package.absolute.file" location="${out.dir}/${release.package.file}">
</property> <!--
<echo message="out.dex.file:${out.dex.file}"/>
<echo message="out.resource.package.file:${out.resource.package.file}"/>
<echo message="out.unsigned.package.file:${out.unsigned.package.file}"/>
<echo message="out.signed.package.file:${out.signed.package.file}"/>
<echo message="out.aligned.package.file:${out.aligned.package.file}"/>
<echo message="release.package.file:${release.package.file}"/>
<echo message="out.dex.absolute.file:${out.dex.absolute.file}"/>
<echo message="out.resource.package.absolute.file:${out.resource.package.absolute.file}"/>
<echo message="out.unsigned.package.absolute.file:${out.unsigned.package.absolute.file}"/>
<echo message="out.signed.package.absolute.file:${out.signed.package.absolute.file}"/>
<echo message="out.aligned.package.absolute.file:${out.aligned.package.absolute.file}"/>
<echo message="release.package.absolute.file:${release.package.absolute.file}"/>
--> <property name="keystore" location="release.keystore"></property>
<property name="password" value="!@#$%^"></property>
<property name="keyalias" value="release"></property> <!--
<echo message="keystore:${keystore}"/>
<echo message="password:${password}"/>
<echo message="keyalias:${keyalias}"/>
--> <!--
<target>标签
一个项目标签下可以有一个或多个target标签。一个target标签可以依赖其他的target标签。例
如,有一个target用于编译程序,另一个target用于声称可执行文件。在生成可执行文件之前必
须先编译该文件,因策可执行文件的target依赖于编译程序的target。Target的所有属性如下。
(1)name表示标明,这个属性是必须的。
(2)depends表示依赖的目标。
(3)if表示仅当属性设置时才执行。
(4)unless表示当属性没有设置时才执行。
(5)description表示项目的描述。
Ant的depends属性指定了target的执行顺序。Ant会依照depends属性中target出现顺序依次执行
每个target。在执行之前,首先需要执行它所依赖的target。程序中的名为run的target的
depends属性compile,而名为compile的target的depends属性是prepare,所以这几个target执
行的顺序是prepare->compile->run。
一个target只能被执行一次,即使有多个target依赖于它。如果没有if或unless属性,target总
会被执行。
-->
<target name="-clean">
<echo>Creating output directories if needed...</echo>
<delete dir="${out.absolute.dir}" />
<delete dir="${out.gen.absolute.dir}" />
</target> <target name="-dirs" depends="-clean">
<echo>Creating output directories if needed...</echo>
<mkdir dir="${in.resource.absolute.dir}" />
<mkdir dir="${in.external.libs.absolute.dir}" />
<mkdir dir="${out.gen.absolute.dir}" />
<mkdir dir="${out.absolute.dir}" />
<mkdir dir="${out.classes.absolute.dir}" />
</target> <!--
第一步 生成R.java类文件:
Eclipse中会自动生成R.java,ant和命令行使用android SDK提供的aapt.ext程序生成R.java。
-->
<target name="-resource-src" depends="-dirs">
<echo>Generating R.java / Manifest.java from the resources...</echo>
<exec executable="${tools.aapt}" failonerror="true">
<arg value="package" />
<arg value="-m" />
<arg value="-J" />
<arg path="${out.gen.absolute.dir}" />
<arg value="-M" />
<arg path="${in.manifest.absolute.file}" />
<arg value="-S" />
<arg path="${in.resource.absolute.dir}" />
<arg value="-I" />
<arg path="${android.jar}" />
</exec>
</target> <!--
第二步 将.aidl文件生成.java类文件:
Eclipse中自动生成,ant和命令行使用android SDK提供的aidl.exe生成.java文件。
-->
<!-- Generates java classes from .aidl files. -->
<target name="-aidl" depends="-dirs">
<echo>Compiling aidl files into Java classes...</echo>
<apply executable="${tools.aidl}" failonerror="true">
<arg value="-p${in.android.aidl.file}" />
<arg value="-I${in.source.absolute.dir}" />
<arg value="-o${out.gen.absolute.dir}" />
<fileset dir="${in.source.absolute.dir}">
<include name="**/*.aidl" />
</fileset>
</apply>
</target> <!--
第三步 编译.java类文件生成class文件:
Eclipse中自动生成,ant和命令行使用jdk的javac编译java类文件生成class文件。
-->
<!-- Compiles this project's .java files into .class files. -->
<target name="compile" depends="-resource-src, -aidl" >
<echo>Compiles project's .java files into .class files</echo>
<javac encoding="utf-8" target="1.5" debug="true" extdirs="" srcdir="."
destdir="${out.classes.absolute.dir}" bootclasspath="${android.jar}">
<classpath>
<fileset dir="${in.external.libs.absolute.dir}" includes="*.jar" />
<fileset dir="${in.external.libs.absolute.dir}" includes="*.zip" />
</classpath>
</javac>
</target> <!--Execute proguard class flies-->
<target name="optimize" depends="compile">
<echo>optimize classes are put to "${out.absolute.dir}" .</echo>
<jar basedir="${out.classes.absolute.dir}" destfile="${out.absolute.dir}/temp.jar"/>
<taskdef resource="proguard/ant/task.properties" classpath="${proguard.jar}" />
<proguard>
-injars ${out.absolute.dir}/temp.jar
-outjars ${out.absolute.dir}/optimized.jar
-libraryjars ${android.jar}
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-include proguard-project.txt -keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class * extends com.android.vending.licensing.ILicensingService
-keep public class * extends android.os.*
-keep public class * extends android.view.*
-keep public class * extends android.widget.*
-keep interface * extends java.lang.*
-keep interface * extends android.*
</proguard>
<delete file="${out.absolute.dir}/temp.jar"/>
<delete dir="${out.classes.dir}" failonerror="false" />
<mkdir dir="${out.classes.dir}"/>
<unzip src="${out.absolute.dir}/optimized.jar" dest="${out.classes.absolute.dir}"/>
<delete file="${out.absolute.dir}/optimized.jar"/>
</target> <!--
第四步 将class文件打包生成classes.dex文件:
Eclipse中自动生成,ant和命令行使用android SDK提供的dx.bat命令行脚本生成classes.dex文件。
-->
<target name="dex" depends="optimize">
<echo>Converting compiled files and external libraries into ${out.absolute.dir}/${out.dex.file} ...</echo>
<apply executable="${tools.dx}" failonerror="true" parallel="true">
<arg value="--dex" />
<arg value="--output=${out.dex.absolute.file}" />
<arg path="${out.classes.absolute.dir}" />
<fileset dir="${in.external.libs.absolute.dir}" includes="*.jar"/>
</apply>
<delete dir="${out.classes.absolute.dir}"/>
</target> <!--
第五步 打包资源文件(包括res、assets、androidmanifest.xml等):
Eclipse中自动生成,ant和命令行使用Android SDK提供的aapt.exe生成资源包文件。
-->
<target name="package-resource">
<echo>Packaging resources and assets ${out.resource.package.absolute.file} ...</echo>
<exec executable="${tools.aapt}" failonerror="true">
<arg value="package" />
<arg value="-f" />
<arg value="-M" />
<arg value="${in.manifest.file}" />
<arg value="-S" />
<arg value="${in.resource.absolute.dir}" />
<arg value="-A" />
<arg value="${in.asset.absolute.dir}" />
<arg value="-I" />
<arg value="${android.jar}" />
<arg value="-F" />
<arg value="${out.resource.package.absolute.file}" />
</exec>
</target> <!--
第六步 生成未签名的apk安装文件:
Eclipse中自动生成debug签名文件存放在bin目录中,ant和命令行使用android SDK提供的apkbuilder.bat命令脚本生成未签名的apk安装文件。
-->
<!-- Package the application without signing it. This allows for the application to be signed later with an official publishing key. -->
<target name="package" depends="dex, package-resource">
<echo>Packaging ${out.unsigned.package.absolute.file} for release...</echo>
<exec executable="${tools.apkbuilder}" failonerror="true">
<arg value="${out.unsigned.package.absolute.file}" />
<arg value="-u" />
<arg value="-z" />
<arg value="${out.resource.package.absolute.file}" />
<arg value="-f" />
<arg value="${out.dex.absolute.file}" />
<arg value="-rf" />
<arg value="${in.source.absolute.dir}" />
<arg value="-rj" />
<arg value="${in.external.libs.absolute.dir}" />
</exec>
<echo>It will need to be signed with jarsigner before being published.</echo>
<delete file="${out.resource.package.absolute.file}" />
<delete file="${out.dex.absolute.file}" />
</target> <!--
第七步 对未签名的apk进行签名生成签名后的android文件:
-->
<!-- Package the application without signing it. This allows for the application to be signed later with an official publishing key. -->
<target name="jarsigner" depends="package">
<echo>Packaging ${out.unsigned.package.absolute.file} for release...</echo>
<exec executable="${tools.jarsigner}" failonerror="true">
<arg value="-keystore" />
<arg value="${keystore}" />
<arg value="-storepass" />
<arg value="${password}" />
<arg value="-keypass" />
<arg value="${password}" />
<arg value="-signedjar" />
<arg value="${out.signed.package.absolute.file}" />
<arg value="${out.unsigned.package.absolute.file}" />
<arg value="${keyalias}" />
</exec>
<delete file="${out.unsigned.package.absolute.file}" />
</target> <!--
第七步 签名的文件进行字节对齐;
-->
<target name="zipalign" depends="jarsigner">
<echo>Zipalign ${out.aligned.package.absolute.file} for release...</echo>
<exec executable="${tools.zipalign}">
<arg value="-f" />
<arg value="-v" />
<arg value="4" />
<arg value="${out.signed.package.absolute.file}" />
<arg value="${out.aligned.package.absolute.file}" />
</exec>
<delete file="${out.signed.package.absolute.file}" />
</target> <!--
第八步 签名的文件进行字节对齐;
-->
<target name="release" depends="zipalign">
<copy tofile="${release.package.absolute.file}">
<fileset dir="${out.absolute.dir}" includes="${out.aligned.package.file}"/>
</copy>
<delete file="${out.aligned.package.absolute.file}" />
</target>
</project>

第四步:

执行project的build即可。

[原]Android打包之Eclipse打包的更多相关文章

  1. [原]Android打包之Eclipse打多渠道包

    Android自动打包流程详细图: 步骤一和步骤二参考:[原]Android打包之Eclipse打包 步骤三:编写build.xml <?xml version="1.0" ...

  2. [原]Android打包之跨平台打包

    Android自动打包流程详细图: 在前面一些博客我们知道了如何通过命令行打包,如何通过Eclipse打包,如何通过编写shell脚本来进行打包,但是这些都不能很好的跨平台进行打包. 因Python本 ...

  3. Eclipse打包Android项目时用到proguard.cfg后,出现的Warning:can't find referenced class问题的解决方案

    原文地址:http://blog.csdn.net/u_xtian/article/details/7495023 这个看似简单的问题困扰了我好久了,我已经google了很多相关的信息了,但是在我看来 ...

  4. Eclipse打包Egret App (Egret4.1.0)

    Egret官方提供eclipse和androidstudio打包. 这里使用eclipse. 1 下载配置android环境 2 Egret打包App 3 Eclipse设置 4 Eclipse调试 ...

  5. android 签名、混淆打包

    1.android 签名 使用eclipse导出带签名的apk,最简单的方式. 最后一步finish ,就能导出一个xxx.keystore的文件了. 下次再发布新版本的时候,使用这个生成的签名继续使 ...

  6. Gradle 实现 Android 多渠道定制化打包

    Gradle 实现 Android 多渠道定制化打包 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近在项目中遇到需要实现 Apk 多渠道.定制化打包, Google .百度查找了一些资料, ...

  7. eclipse打包apk

    eclipse打包apk

  8. Android一键多渠道分发打包实战和解析

    当项目需要有更多的客户的时候,你就会考虑将apk上架到应用商店了,无奈天朝Android应用商店真的是百家争鸣,据某地不完全统计已经有900+.若将Apk上架到所有的应用商店是个好主意,但是据统计也就 ...

  9. Android 自动编译、打包生成apk文件 3 - 使用SDK Ant方式

      相关文章列表: < Android 自动编译.打包生成apk文件 1 - 命令行方式> < Android 自动编译.打包生成apk文件 2 - 使用原生Ant方式> &l ...

随机推荐

  1. Lucene初识

    1.概述 1.1 Lucene是apache软件基金会4 jakarta项目组的一个子项目: 是一个开放源代码的全文检索引擎工具包: 但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了 ...

  2. RESTful 设计工具和Web框架

    搭建开发环境几乎都搭建失败,因为需要FQ Spring Boot 和 Spring MVC 单独 Jersey官网可以直接访问 https://jersey.java.net/documentatio ...

  3. oracle12C--DG搭建配置

    一,主库前期操作 搭建的话和11g差不多,点点点. 两台服务器,一台主库,一台从库 01,配置主库hosts cat /etc/hosts 192.168.0.31 node12c01 192.168 ...

  4. shell 对字符的求长

    一,测试环境 echo "To the world you may be one person but to one person you may be the world" 对于 ...

  5. 牛客网Java刷题知识点之UDP协议是否支持HTTP和HTTPS协议?为什么?TCP协议支持吗?

    不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑          ...

  6. 03-struts2获得servetAPI

    1 原理 三个域合一的时候相同的键值对以小的域为准.ActionContext 对象创建:每次请求的时候都会创建一个与请求对应的 ActionContext 对象.ActionContext 销毁:请 ...

  7. 【数据结构】最小生成树之prim算法和kruskal算法

    在日常生活中解决问题经常需要考虑最优的问题,而最小生成树就是其中的一种.看了很多博客,先总结如下,只需要您20分钟的时间,就能完全理解. 比如:有四个村庄要修四条路,让村子能两两联系起来,这时就有最优 ...

  8. 使用request与正则表达式爬取bangumi动画排行榜

    import json import requests from requests.exceptions import RequestException import re import time d ...

  9. nyoj 983 ——首尾相连数组的最大子数组和——————【最大子串和变形】

    首尾相连数组的最大子数组和 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首 ...

  10. WCF入门教程通信(二)

    一.概述 WCF能够建立一个跨平台的安全.可信赖.事务性的解决方案,是一个WebService,.Net Remoting,Enterprise Service,WSE,MSMQ的并集,有一副很经典的 ...