android自动打包方法(ant+proguard+签名)

前段时间做了一个android的网游项目,现在优化减少体积和防止别人反编译,需要把编译后.class进行混淆,开始在网上看了一些关于 ProGuard的介绍,基本上都是使用ADT自带的打包方式,那个打包方式太慢了,还要手工输密码,一个字烦。

于是开始寻找ant+proguard+签名的打包方式,遗憾的是资料不是缺手就是断脚。

好吧,看来得食自己了,!@#¥@#!@#!@##¥@#¥!@#@ 转眼一周,我++,终于把东西搞出来

ps:我们项目还有一个特殊需求,要把版本号,推广ID打到包里去,方便做推广什么的。这里可以用replace的方法对string.xml进行修改

好吧,废话不说了,直接上build文件

1. [代码][xml]代码     跳至 [1] [全屏预览]

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

<project name="xiyou_base_" default="deployableAllDevice">

<!-- proguard4的路径 -->

<property name="proguard.home" value="D:/software/j2me/proguard4.5.1/proguard4.5.1"/>

<!-- sdk的路径 -->

<property name="sdk.dir" value="E:\dev\android-sdk-windows"/>

<!-- 是否使用签名 -->

<property name="has.keystore" value="true" />

<!-- 签名密码 -->

<property name="has.password" value="true" />

<!--签名相关的key -->

<property name="key.alias" value="key.keystore" />

<property name="key.store" value="key.keystore" />

<!-- 签名相关的密码 -->

<property name="key.store.password" value="xxxx" />

<property name="key.alias.password" value="xxxx" />

<!--

default.properties 内容

target=android-4

proguard.config=proguard.cfg

-->

<property file="default.properties" />

<!-- Custom Android task to deal with the project target, and import the

proper rules.

This requires ant 1.6.0 or above. -->

<path id="android.antlibs">

<pathelement path="${sdk.dir}/tools/lib/anttasks.jar" />

<pathelement path="${sdk.dir}/tools/lib/sdklib.jar" />

<pathelement path="${sdk.dir}/tools/lib/androidprefs.jar" />

</path>

<taskdef name="setup" classname="com.android.ant.SetupTask" classpathref="android.antlibs" />

<setup import="false" />

<!-- Custom tasks -->

<taskdef name="aapt" classname="com.android.ant.AaptExecLoopTask" classpathref="android.antlibs" />

<taskdef name="aidl" classname="com.android.ant.AidlExecTask" classpathref="android.antlibs" />

<taskdef name="apkbuilder" classname="com.android.ant.ApkBuilderTask" classpathref="android.antlibs" />

<taskdef name="xpath" classname="com.android.ant.XPathTask" classpathref="android.antlibs" />

<taskdef name="if" classname="com.android.ant.IfElseTask" classpathref="android.antlibs" />

<!-- Properties -->

<!-- Tells adb which device to target. You can change this from the command line

by invoking "ant -Dadb.device.arg=-d" for device "ant -Dadb.device.arg=-e" for

the emulator. -->

<property name="adb.device.arg" value="" />

<property name="android.tools.dir" location="${sdk.dir}/tools" />

<property name="android.platform.tools.dir" location="${sdk.dir}/platform-tools" />

<!-- Name of the application package extracted from manifest file -->

<xpath input="AndroidManifest.xml" expression="/manifest/@package" output="manifest.package" />

<!-- Value of the hasCode attribute (Application node) extracted from manifest file -->

<xpath input="AndroidManifest.xml" expression="/manifest/application/@android:hasCode" output="manifest.hasCode" default="true" />

<!-- 源文件及资源路径 -->

<property name="source.dir" value="src" />

<property name="source.absolute.dir" location="${source.dir}" />

<property name="gen.dir" value="gen" />

<property name="gen.absolute.dir" location="${gen.dir}" />

<property name="resource.dir" value="res" />

<property name="resource.absolute.dir" location="${resource.dir}" />

<property name="asset.dir" value="assets" />

<property name="asset.absolute.dir" location="${asset.dir}" />

<!-- Directory for the third party java libraries -->

<property name="jar.libs.dir" value="libs" />

<property name="jar.libs.absolute.dir" location="${jar.libs.dir}" />

<!-- create a path with all the jar files, from the main project and the

libraries -->

<path id="jar.libs.ref">

<fileset dir="${jar.libs.absolute.dir}" includes="*.jar" />

<path refid="project.libraries.jars" />

</path>

<!-- Directory for the native libraries -->

<property name="native.libs.dir" value="libs" />

<property name="native.libs.absolute.dir" location="${native.libs.dir}" />

<!-- 输出路径 -->

<property name="out.dir" value="out" />

<property name="out.absolute.dir" location="${out.dir}" />

<property name="out.classes.dir" value="${out.absolute.dir}/classes" />

<property name="out.classes.absolute.dir" location="${out.classes.dir}" />

<!-- Intermediate files -->

<property name="dex.file.name" value="classes.dex" />

<property name="intermediate.dex.file" location="${out.absolute.dir}/${dex.file.name}" />

<property name="resource.package.file.name" value="${ant.project.name}.ap_" />

<!-- The final package file to generate

These can be overridden by setting them earlier to

different values -->

<property name="out.debug.unaligned.file" location="${out.absolute.dir}/${ant.project.name}-debug-unaligned.apk" />

<property name="out.debug.file" location="${out.absolute.dir}/${ant.project.name}-debug.apk" />

<property name="out.unsigned.file.name" value="${ant.project.name}-unsigned.apk" />

<property name="out.unsigned.file" location="${out.absolute.dir}/${out.unsigned.file.name}" />

<property name="out.unaligned.file.name" value="${ant.project.name}-unaligned.apk" />

<property name="out.unaligned.file" location="${out.absolute.dir}/${out.unaligned.file.name}" />

<property name="out.release.file.name" value="${ant.project.name}-release.apk" />

<property name="out.release.file" location="${out.absolute.dir}/${out.release.file.name}" />

<property name="proguard.enabled" value="true" />

<property name="android-jar" value="${sdk.dir}/platforms/${target}/android.jar" />

<!-- set some properties used for filtering/override. If those weren‘t defined

before, then this will create them with empty values, which are then ignored

by the custom tasks receiving them. -->

<property name="version.code" value="" />

<property name="aapt.resource.filter" value="" />

<property name="filter.abi" value="" />

<!-- java源文件编码,编译的目标平台,为1.5 or 1.6都可以 -->

<property name="java.encoding" value="UTF-8" />

<property name="java.target" value="1.5" />

<property name="java.source" value="1.5" />

<!-- Verbosity -->

<property name="verbose" value="false" />

<!-- Verbosity -->

<property name="verbose" value="false" />

<!-- This is needed by emma as it uses multilevel verbosity instead of simple ‘true‘ or ‘false‘

The property ‘verbosity‘ is not user configurable and depends exclusively on ‘verbose‘

value.-->

<condition property="verbosity" value="verbose" else="quiet">

<istrue value="${verbose}" />

</condition>

<!-- This is needed to switch verbosity of zipalign. Depends exclusively on ‘verbose‘

-->

<condition property="v.option" value="-v" else="">

<istrue value="${verbose}" />

</condition>

<!-- This is needed to switch verbosity of dx. Depends exclusively on ‘verbose‘ -->

<condition property="verbose.option" value="--verbose" else="">

<istrue value="${verbose}" />

</condition>

<!-- properties for signing in release mode -->

<condition property="has.keystore" value="true">

<and>

<isset property="key.store" />

<length string="${key.store}" when="greater" length="0" />

<isset property="key.alias" />

</and>

</condition>

<condition property="has.password" value="passwordxxxxx">

<and>

<isset property="has.keystore" />

<isset property="key.store.password" />

<isset property="key.alias.password" />

</and>

</condition>

<!-- Tools -->

<condition property="exe" value=".exe" else="">

<os family="windows" />

</condition>

<property name="adb" location="${android.platform.tools.dir}/adb${exe}" />

<property name="zipalign" location="${android.tools.dir}/zipalign${exe}" />

<!-- Emma configuration -->

<property name="emma.dir" value="${sdk.dir}/tools/lib" />

<path id="emma.lib">

<pathelement location="${emma.dir}/emma.jar" />

<pathelement location="${emma.dir}/emma_ant.jar" />

</path>

<taskdef resource="emma_ant.properties" classpathref="emma.lib" />

<!-- End of emma configuration -->

<!-- Macros -->

<!-- Configurable macro, which allows to pass as parameters output directory,

output dex filename and external libraries to dex (optional) -->

<macrodef name="dex-helper">

<element name="external-libs" optional="yes" />

<element name="extra-parameters" optional="yes" />

<sequential>

<!-- sets the primary input for dex. If a pre-dex task sets it to

something else this has no effect -->

<property name="out.dex.input.absolute.dir" value="${out.classes.absolute.dir}" />

<!-- set the secondary dx input: the project (and library) jar files

If a pre-dex task sets it to something else this has no effect -->

<if>

<condition>

<isreference refid="out.dex.jar.input.ref" />

</condition>

<else>

<path id="out.dex.jar.input.ref">

<path refid="jar.libs.ref" />

</path>

</else>

</if>

<echo>Converting compiled files and external libraries into ${intermediate.dex.file}...</echo>

<apply executable="${dx}" failonerror="true" parallel="true">

<arg value="--dex" />

<arg value="--output=${intermediate.dex.file}" />

<extra-parameters />

<arg line="${verbose.option}" />

<arg path="${out.dex.input.absolute.dir}" />

<path refid="out.dex.jar.input.ref" />

<external-libs />

</apply>

</sequential>

</macrodef>

<!-- This is macro that enable passing variable list of external jar files to ApkBuilder

Example of use:

<package-helper output.filepath="/path/to/foo.apk">

<extra-jars>

<jarfolder path="my_jars" />

<jarfile path="foo/bar.jar" />

<jarfolder path="your_jars" />

</extra-jars>

</package-helper> -->

<macrodef name="package-helper">

<attribute name="output.filepath" />

<element name="extra-jars" optional="yes" />

<sequential>

<apkbuilder outfolder="${out.absolute.dir}" resourcefile="${resource.package.file.name}" apkfilepath="@{output.filepath}" debugpackaging="${build.packaging.debug}" debugsigning="${build.signing.debug}" abifilter="${filter.abi}" verbose="${verbose}" hascode="${manifest.hasCode}">

<dex path="${intermediate.dex.file}" />

<sourcefolder path="${source.absolute.dir}" />

<sourcefolder refid="project.libraries.src" />

<jarfolder path="${jar.libs.absolute.dir}" />

<jarfolder refid="project.libraries.libs" />

<nativefolder path="${native.libs.absolute.dir}" />

<nativefolder refid="project.libraries.libs" />

<extra-jars />

</apkbuilder>

</sequential>

</macrodef>

<!-- This is macro which zipaligns in.package and outputs it to out.package. Used by targets

debug, -debug-with-emma and release.-->

<macrodef name="zipalign-helper">

<attribute name="in.package" />

<attribute name="out.package" />

<sequential>

<echo>Running zip align on final apk...</echo>

<exec executable="${zipalign}" failonerror="true">

<arg line="${v.option}" />

<arg value="-f" />

<arg value="4" />

<arg path="@{in.package}" />

<arg path="@{out.package}" />

</exec>

</sequential>

</macrodef>

<!-- This is macro used only for sharing code among two targets, -install and

-install-with-emma which do exactly the same but differ in dependencies -->

<macrodef name="install-helper">

<sequential>

<echo>Installing ${out.debug.file} onto default emulator or device...</echo>

<exec executable="${adb}" failonerror="true">

<arg line="${adb.device.arg}" />

<arg value="install" />

<arg value="-r" />

<arg path="${out.debug.file}" />

</exec>

</sequential>

</macrodef>

<!-- Rules -->

<!-- Creates the output directories if they don‘t exist yet. -->

<target name="-dirs">

<echo>Creating output directories if needed...</echo>

<mkdir dir="${resource.absolute.dir}" />

<mkdir dir="${jar.libs.absolute.dir}" />

<mkdir dir="${out.absolute.dir}" />

<if condition="${manifest.hasCode}">

<then>

<mkdir dir="${gen.absolute.dir}" />

<mkdir dir="${out.classes.absolute.dir}" />

</then>

</if>

</target>

<!-- empty default pre-build target. Create a similar target in

your build.xml and it‘ll be called instead of this one. -->

<target name="-pre-build" />

<!-- Generates the R.java file for this project‘s resources. -->

<target name="-resource-src" depends="-dirs, -pre-build">

<if condition="${manifest.hasCode}">

<then>

<echo>Generating R.java / Manifest.java from the resources...</echo>

<aapt executable="${aapt}" command="package" verbose="${verbose}" manifest="AndroidManifest.xml" androidjar="${android.jar}" rfolder="${gen.absolute.dir}">

<res path="${resource.absolute.dir}" />

</aapt>

</then>

<else>

<echo>hasCode = false. Skipping...</echo>

</else>

</if>

</target>

<!-- Generates java classes from .aidl files. -->

<target name="-aidl" depends="-dirs">

<if condition="${manifest.hasCode}">

<then>

<echo>Compiling aidl files into Java classes...</echo>

<aidl executable="${aidl}" framework="${android.aidl}" genFolder="${gen.absolute.dir}">

<source path="${source.absolute.dir}" />

<source refid="project.libraries.src" />

</aidl>

</then>

<else>

<echo>hasCode = false. Skipping...</echo>

</else>

</if>

</target>

<!-- empty default pre-compile target. Create a similar target in

your build.xml and it‘ll be called instead of this one. -->

<target name="-pre-compile" />

<!-- Compiles this project‘s .java files into .class files. -->

<target name="compile" depends="-resource-src, -aidl, -pre-compile" description="Compiles project‘s .java files into .class files">

<if condition="${manifest.hasCode}">

<then>

<!-- If android rules are used for a test project, its classpath should include

tested project‘s location -->

<condition property="extensible.classpath" value="${tested.project.absolute.dir}/${out.dir}/classes" else=".">

<isset property="tested.project.absolute.dir" />

</condition>

<condition property="extensible.libs.classpath" value="${tested.project.absolute.dir}/libs" else="${jar.libs.dir}">

<isset property="tested.project.absolute.dir" />

</condition>

<javac encoding="${java.encoding}" source="${java.source}" target="${java.target}" debug="true" extdirs="" destdir="${out.classes.absolute.dir}" bootclasspathref="android.target.classpath" verbose="${verbose}" classpath="${extensible.classpath}" classpathref="jar.libs.ref">

<src path="${source.absolute.dir}" />

<src path="${gen.absolute.dir}" />

<src refid="project.libraries.src" />

<classpath>

<fileset dir="${extensible.libs.classpath}" includes="*.jar" />

</classpath>

</javac>

</then>

<else>

<echo>hasCode = false. Skipping...</echo>

</else>

</if>

</target>

<!-- empty default post-compile target. Create a similar target in

your build.xml and it‘ll be called instead of this one. -->

<target name="-post-compile" />

<!-- Obfuscate target

This is only active in release builds when proguard.config is defined

in default.properties.

To replace Proguard with a different obfuscation engine:

Override the following targets in your build.xml, before the call to <setup>

-release-obfuscation-check

Check whether obfuscation should happen, and put the result in a property.

-debug-obfuscation-check

Obfuscation should not happen. Set the same property to false.

-obfuscate

** Make sure unless="do.not.compile" is used in the target definition **

check if the property set in -debug/release-obfuscation-check is set to true.

If true:

Perform obfuscation

Set property out.dex.input.absolute.dir to be the output of the obfuscation

-->

<target name="-obfuscate" unless="do.not.compile">

<if condition="${proguard.enabled}">

<then>

<property name="obfuscate.absolute.dir" location="${out.absolute.dir}/proguard" />

<property name="preobfuscate.jar.file" value="${obfuscate.absolute.dir}/original.jar" />

<property name="obfuscated.jar.file" value="${obfuscate.absolute.dir}/obfuscated.jar" />

<!-- input for dex will be proguard‘s output -->

<property name="out.dex.input.absolute.dir" value="${obfuscated.jar.file}" />

<!-- Add Proguard Tasks -->

<property name="proguard.jar" location="${proguard.home}/lib/proguard.jar" />

<taskdef name="proguard" classname="proguard.ant.ProGuardTask" classpath="${proguard.jar}" />

<!-- Set the android classpath Path object into a single property. It‘ll be

all the jar files separated by a platform path-separator.

-->

<property name="android.libraryjars" refid="android.target.classpath" />

<!-- Build a path object with all the jar files that must be obfuscated.

This include the project compiled source code and any 3rd party jar

files. -->

<path id="project.jars.ref">

<pathelement location="${preobfuscate.jar.file}" />

<path refid="jar.libs.ref" />

</path>

<!-- Set the project jar files Path object into a single property. It‘ll be

all the jar files separated by a platform path-separator.

-->

<property name="project.jars" refid="project.jars.ref" />

<mkdir dir="${obfuscate.absolute.dir}" />

<delete file="${preobfuscate.jar.file}" />

<delete file="${obfuscated.jar.file}" />

<jar basedir="${out.classes.dir}" destfile="${preobfuscate.jar.file}" />

<!-- 混淆相关参数 -->

<proguard>

-optimizationpasses 5

-dontusemixedcaseclassnames

-dontskipnonpubliclibraryclasses

-dontpreverify

-verbose

-repackageclasses

-allowaccessmodification

-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-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 com.android.vending.licensing.ILicensingService

-injars ${project.jars}

-outjars ${obfuscated.jar.file}

-libraryjars ${android.libraryjars}

</proguard>

</then>

</if>

</target>

<target name="pre" depends="-obfuscate">

</target>

<!-- Converts this project‘s .class files into .dex files -->

<!--<target name="-dex" depends="compile, -post-compile, -obfuscate" unless="do.not.compile">-->

<target name="-dex" depends="compile, -post-compile, optimize" unless="do.not.compile">

<if condition="${manifest.hasCode}">

<then>

<dex-helper />

</then>

<else>

<echo>hasCode = false. Skipping...</echo>

</else>

</if>

</target>

<target name="optimize" depends="compile,-obfuscate">

<if condition="${proguard.enabled}">

<then>

<mkdir dir="${out.dir}/out/class" />

<!-- 创建文件夹-->

<!--别人的<jar basedir="${out-folder}" destfile="temp.jar"/>-->

<property name="proguard-jar" value="${proguard.home}/lib/proguard.jar" />

<java jar="${proguard-jar}" fork="true" failonerror="true">

<jvmarg value="-Dmaximum.inlined.code.length=32" />

<arg value="-injars ${out.dir}/classes" />

<!-- 原来的类文件,使用Bin/classes下的-->

<arg value="-outjars ${out.dir}/out/classes" />

<!-- 生成的混淆Class位置-->

<arg value="-libraryjars ${android-jar}" />

<!--

<arg value=" -libraryjars ${library-jar}/some_lib_used.jar"/>

-->

<arg value="-keep public class * extends android.app.Activity" />

<arg value="-keep public class * extends android.app.Service" />

<arg value="-keep public class * extends android.content.BroadcastReceiver" />

<arg value="-keep public class * extends android.content.ContentProvider" />

<arg value="-keep public class * extends android.view.View" />

<arg value="-dontwarn" />

<arg value="-dontpreverify" />

<arg value="-optimizationpasses 7" />

<arg value="-dontusemixedcaseclassnames" />

<arg value="-dontskipnonpubliclibraryclasses" />

<arg value="-repackageclasses" />

<arg value="-allowaccessmodification" />

<!--<arg value="-dontskipnonpubliclibraryclassmembers"/>-->

</java>

<!--这些是原来的Jar<delete file="temp.jar"/>-->

<!--<delete dir="${out-folder}"/>-->

<!--<mkdir dir="${out-folder}"/>

<unzip src="optimized.jar" dest="${out-folder}"/>

<delete file="optimized.jar"/>-->

</then>

</if>

</target>

<!-- Puts the project‘s resources into the output package file

This actually can create multiple resource package in case

Some custom apk with specific configuration have been

declared in default.properties.

-->

<target name="-package-resources">

<echo>Packaging resources</echo>

<aapt executable="${aapt}" command="package" versioncode="${version.code}" debug="${build.packaging.debug}" manifest="AndroidManifest.xml" assets="${asset.absolute.dir}" androidjar="${android.jar}" apkfolder="${out.absolute.dir}" resourcefilename="${resource.package.file.name}" resourcefilter="${aapt.resource.filter}">

<res path="${resource.absolute.dir}" />

<!-- <nocompress /> forces no compression on any files in assets or res/raw -->

<!-- <nocompress extension="xml" /> forces no compression on specific file extensions in assets and res/raw -->

</aapt>

</target>

<!-- Packages the application and sign it with a debug key. -->

<target name="-package-debug-sign" depends="-dex, -package-resources">

<package-helper output.filepath="${out.debug.unaligned.file}" />

</target>

<!-- Packages the application without signing it. -->

<target name="-package-release" depends="-dex, -package-resources">

<package-helper output.filepath="${out.unsigned.file}" />

</target>

<target name="-compile-tested-if-test" if="tested.project.dir" unless="do.not.compile.again">

<subant target="compile">

<fileset dir="${tested.project.absolute.dir}" includes="build.xml" />

</subant>

</target>

<target name="-debug-obfuscation-check">

<!-- proguard is never enabled in debug mode -->

<property name="proguard.enabled" value="true" />

</target>

<target name="-set-debug-mode" depends="-debug-obfuscation-check">

<!-- property only set in debug mode.

Useful for if/unless attributes in target node

when using Ant before 1.8 -->

<property name="build.mode.debug" value="true" />

<!-- whether the build is a debug build. always set. -->

<property name="build.packaging.debug" value="true" />

<!-- signing mode: debug -->

<property name="build.signing.debug" value="true" />

</target>

<!-- Builds debug output package, provided all the necessary files are already dexed -->

<target name="debug" depends="-set-debug-mode, -compile-tested-if-test, -package-debug-sign" description="Builds the application and signs it with a debug key.">

<zipalign-helper in.package="${out.debug.unaligned.file}" out.package="${out.debug.file}" />

<echo>Debug Package: ${out.debug.file}</echo>

</target>

<!-- called through target ‘release‘. Only executed if the keystore and

key alias are known but not their password. -->

<target name="-release-prompt-for-password" if="has.keystore" unless="has.password">

<!-- Gets passwords -->

<echo>Gets passwords ${has.keystore} ${has.password}</echo>

<input message="Please enter keystore password (store:${key.store}):" addproperty="key.store.password" defaultvalue="5201314.." />

<input message="Please enter password for alias ‘${key.alias}‘:" addproperty="key.alias.password" defaultvalue="5201314.." />

</target>

<!-- called through target ‘release‘. Only executed if there‘s no

keystore/key alias set -->

<target name="-release-nosign" unless="has.keystore">

<echo>No key.store and key.alias properties found in build.properties.</echo>

<echo>Please sign ${out.unsigned.file} manually</echo>

<echo>and run zipalign from the Android SDK tools.</echo>

</target>

<target name="-release-obfuscation-check">

<condition property="proguard.enabled" value="true" else="false">

<and>

<isset property="build.mode.release" />

<isset property="proguard.config" />

</and>

</condition>

<if condition="${proguard.enabled}">

<then>

<!-- 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>

<target name="-set-release-mode">

<!-- release mode is only valid if the manifest does not explicitly

set debuggable to true. default is false.

We actually store build.packaging.debug, not build.release -->

<xpath input="AndroidManifest.xml" expression="/manifest/application/@android:debuggable" output="build.packaging.debug" default="false" />

<!-- signing mode: release -->

<property name="build.signing.debug" value="false" />

<if condition="${build.packaging.debug}">

<then>

<echo>*************************************************</echo>

<echo>**** Android Manifest has debuggable=true ****</echo>

<echo>**** Doing DEBUG packaging with RELEASE keys ****</echo>

<echo>*************************************************</echo>

</then>

<else>

<!-- property only set in release mode.

Useful for if/unless attributes in target node

when using Ant before 1.8 -->

<property name="build.mode.release" value="true" />

</else>

</if>

</target>

<!-- This runs -package-release and -release-nosign first and then runs

only if release-sign is true (set in -release-check,

called by -release-no-sign)-->

<target name="release" depends="-set-release-mode, -release-obfuscation-check, -package-release, -release-prompt-for-password, -release-nosign" if="has.keystore" description="Builds the application. The generated apk file must be signed before

it is published.">

<!-- Signs the APK -->

<echo>Signing final apk...</echo>

<signjar jar="${out.unsigned.file}" signedjar="${out.unaligned.file}" keystore="${key.store}" storepass="${key.store.password}" alias="${key.alias}" keypass="${key.alias.password}" verbose="${verbose}" />

<!-- Zip aligns the APK -->

<zipalign-helper in.package="${out.unaligned.file}" out.package="${out.release.file}" />

<echo>Release Package: ${out.release.file}</echo>

</target>

<target name="clean" description="Removes output files created by other targets.">

<delete dir="${out.absolute.dir}" verbose="${verbose}" />

<delete dir="${gen.absolute.dir}" verbose="${verbose}" />

</target>

<target name="deployableAllDevice" description="build all device packet">

<!-- uid和sdk都是自定义参数,可有可无,有多小个包要打,就在这里copy多小行,修改相关参数,传入到程序里即可 -->

<antcall target="release" inheritAll="true"><param name="uid" value="100" /><param name="sdk" value="91" /></antcall>

<antcall target="release" inheritAll="true"><param name="uid" value="101" /><param name="sdk" value="90" /></antcall>

</target>

</project>

android自动打包方法(ant+proguard+签名),布布扣,bubuko.com

时间: 2024-10-08 19:15:15

android自动打包方法(ant+proguard+签名)的相关文章

用jenkins搭建android自动打包环境

这里假设你已经搭建了jenkins的环境.否则,请阅读我的另一篇文章: http://my.oschina.net/u/930967/blog/298980 其实那个文章里面有用的就两句话的事儿,还是直接写在这里吧 jenkins是一个java web项目,可以去官网下载war包,放在tomcat的webapps下就能运行. 访问localhost:8080/jenkins进入 步入正题 任何一个开发工具,都提供了命令行工具.比如android用的是ant.java有maven.还有xcode,

Android类库打包方法探究

转自:Android类库打包方法探究 开发Android应用的时候,对于可用于多个应用的公用的部分,或是打算发布给第三方进行应用集成的部分,要把这部分打包成类库怎么做呢?众所周知,Android应用使用ADT打包成apk,apk中包含了运行程序所需要的一切,包括:class.asset.res.AndroidManifest.xml等.而对于类库项目(library project),ADT生成的jar包里只包含编译生成的class文件,不包含res资源文件,res只能在应用项目打包apk的时候

[原] Android自动打包之命令行打包

Android自动打包流程详细图: 总结为以下几个步骤: 1. 生成R文件 2. Java代码编译成class文件 3. class文件生成dex文件 4. 打包资源 5. 生成apk 6. 创建密匙 7. 签名apk 下面用Ubuntu命令行来打包,流程如下: 1. 生成R文件,命令如下: aapt package -f -m -J $BUILD_SOURCE_PATH/$ANDROID_GEN \ -A $BUILD_SOURCE_PATH/$PACKAGE_RESOURCE_FILE \

在Mac和Window上配置android自动打包

配置自动打包脚本,首先就是要配置gradle命令,这里你假设已经有了android开发环境. Window上配置gradle: 选中计算机=>右键属性=>高级系统设置=>高级=>环境变量=>系统环境变量:找到path:在最后跟添加你的gradle的bin路径: 我这里gradle的路径: C:\Users\Administrator\.gradle\wrapper\dists\gradle-3.3-all\55gk2rcmfc6p2dg9u9ohc3hw9\gradle-3.

基于Travis CI搭建Android自动打包发布工作流(支持Github Release及fir.im)

最近付费购买了Travis CI,Travis CI的收费模式很有意思,不是按项目或者用户,而是按工作进程收费,比如初级版本是$129/月,总共提供2个工作进程.在项目不多的情况下,除了用于跑单元测试外,不免想利用的更充分一些,因此抽空搭建了一套基于Travis CI的Android自动发布工作流. 未自动化前安卓开发总是避免不了这样的工作流程: 开发一些新功能,提交代码 完成一部分功能后,打包一个测试版APK 将测试版APK上传到QQ群 / 网盘 / Fir.im / 蒲公英等 在QQ群或发布

[原] Jenkins Android 自动打包配置(转)

一.Jenkins自动打包配置 目标:1. 自动打包:2. 自动上传:3. 友好下载 1. Jenkins简介 Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作. 减少重复劳动,减少人工成本. 持续.自动地构建/测试软件项目: 监控一些定时执行的任务: 2. Jenkins配置 添加git plugin和 role插件 设置人员权限,根据角色授权 启动访问http://ip/8080即可,见下3.1 开机自启脚本 添加git项目,配置脚本,见下3.2 项目打包脚本和3.

[转]使用ant让Android自动打包的build.xml,自动生成签名的apk文件(支持android4.0以上的版本)

在android4.0以后的sdk里那个脚本就失效了,主要是因为 apkbuilder这个程序不见了: 人家sdk升级,我们的脚本也要跟上趟,修改一下喽. 上网一查,大家的文章还停留在我去年的脚本程度,算了,自己动手查阅了资料之后,具体实现如下: 在工程的根目录 创建2个文件,分别: 1.build.xml 2.build.properties build.xml的内容: [java] view plaincopyprint? <?xml version="1.0" encodi

windows环境下jenkins+gradle+Android 自动打包部署

第一步,搭建jenkins环境 1.安装下载jenkins jenkins运行依赖Java开发环境,安装jenkins前,先安装好JDK,并配置好环境变量 进入jenkins 的官网 https://jenkins.io/ , 根据搭建平台的不同下载,我使用的是 windows 平台 2.配置 Jenkins 安装完成后,在浏览器中访问 : http://localhost:8080/, 你将会看到如下界面 ,然后开始配置 Jenkins. 3.Jenkins 插件安装和超级管理员配置 填写完密

ANT自动打包U3D安卓项目研究笔记

概述 因项目使用Atlassian Stash作为项目源码管理端,且其支持Ant命令自动编译,可使其根据最新的代码自动打包,故产生该研究Ant打包的任务.在此将研究过程及一些相关知识整理记录在此. 本文部分内容可以说就是Android和Ant自动打包的配置,只是在其基础上扩充了Unity3D的部分. 阅读本文需要:知道Android开发环境大概需要哪些东西,知道Unity3D编辑器的基本使用方法. 本文并不是系统学习Ant以及Android自动打包的文章,只是笔者通过网络搜索一系列文章,然后通过