Eclipse集成Ant 打包签名APK和打混淆jar

本文详细介绍如何使用Ant构建工具来编译Java源文件、混淆代码、打包资源文件,并最终生成签名版APK文件的过程。文中提供了具体的配置文件示例,包括环境变量设置、编译参数配置等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Ant的下载地址请戳这里

Ant的环境变量配置和jdk的配置是一样的。最好也把sdk的环境变量也配置一下。

Eclipse的工程目录如下图:


buildapp.properties

# This is an config file used to replace variable in buildapp.xml
# Note: Use the '\\' instead of '\' 
# Note: -ospath   absolute path

# this name of release app
appName = MobileClient

# this name of android sdk path
sdk-folder = ${env.ANDROID_SDK_HOME}

# ths name of java jdk path
java-home = ${env.JAVA_HOME}

# this name of android sdk platform path
sdk-platform-folder = ${sdk-folder}\\platforms\\android-8

# this name of android sdk tools path
sdk-tools-folder = ${sdk-folder}\\tools

# this name of android sdk platform-tools paht
sdk-platform-tools-folder = ${sdk-folder}\\platform-tools

# complier must contain this jar
android-jar = ${sdk-platform-folder}/android.jar
 
# Here is the build tool
aapt-exe = ${sdk-platform-tools-folder}\\aapt.exe  
aidl-exe = ${sdk-platform-tools-folder}\\aidl.exe  
dx-bat = ${sdk-platform-tools-folder}\\dx.bat  
apkbuilder-bat = ${sdk-tools-folder}\\apkbuilder.bat  
jarsigner-exe = ${java-home}\\bin\\jarsigner.exe  
zipalign-exe = ${sdk-tools-folder}\\zipalign.exe

# this name of proguard home path
proguard-home = ${sdk-tools-folder}\\proguard

# this name of use proguard's jar
proguard-jar = ${proguard-home}\\lib\\proguard.jar

#this name of proguard.cfg path
proguard-cfg = ${basedir}\\proguard.cfg

# aidl file required to compile the framework.aidl file
framework-aidl = ${sdk-platform-folder}\\framework.aidl

# javac memory size
javac-forkOn-memoryinitialsize = 256m
javac-forkOn-memoryMaximumSize = 256m

# apk version
version = 2

# this name is compile file path
compile-bin-name = bin-compile
compile-bin-ospath = ${basedir}\\${compile-bin-name}


# this name is classes.dex file output path
dex-file-name = classes.dex
dex-ospath = ${compile-bin-ospath}\\${dex-file-name}

# this name is aapt generation resources package
resources-package-name = resources.ap_
resources-package-ospath = ${compile-bin-ospath}\\${resources-package-name}

# this name is output unsigned-apk path
unsigned-apk-name = ${appName}-unsigned.apk
unsigned-apk-ospath = ${compile-bin-ospath}\\${unsigned-apk-name}

#this name is output singed-apk path
signed-apk-name = ${appName}-unaligned.apk
signed-apk-ospath = ${compile-bin-ospath}\\${signed-apk-name}

#this name is output zipalign-apk path
aligned-apk-name = ${appName}.apk
aligned-apk-ospath = ${compile-bin-ospath}\\${aligned-apk-name}


# this name is keystore-file path
keystore-file-ospath = ${basedir}\\8M.keystore

# this name is storepass key
storepass-key = abc1234

# thsi name is keypass key
keypass-key = abc1234
buildapp.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="MobileClient_build" default="release">  
    <!-- 必须放在最前面,可以确保能使用到编译平台的环境变量 -->  
    <property environment="env" />
    
    <!-- 使用第三方的ant包,使ant支持for循环-->  
    <taskdef resource="net/sf/antcontrib/antcontrib.properties">  
        <classpath>  
            <pathelement location="${env.ANT_HOME}/lib/ant-contrib-1.0b3.jar" />  
        </classpath>  
    </taskdef> 
    
    <!-- 引入属性文件 -->
    <property file="buildapp.properties"></property> 

    <!-- 清单文件  相对路径-->  
    <property name="manifest-xml" value="AndroidManifest.xml" />
    
    <!-- 项目资源文件目录  相对路径-->  
    <property name="resource-dir" value="res" />
    
    <!-- 项目assets目录 相对路径-->
    <property name="asset-dir" value="assets" />
    
    <!-- java源文件目录  相对路径-->  
    <property name="srcdir"  value ="src" />
    <!-- java源文件目录  绝对路径-->  
    <property name="srcdir-ospath" value="${basedir}\${srcdir}" />
    
    <!-- 外部类库所在目录 相对路径-->  
    <property name="external-lib" value="libs" />
    <!-- 外部类库所在目录 绝对路径-->
    <property name="external-lib-ospath" value="${basedir}\${external-lib}" /> 
      
    <!-- 初始化工作 -->  
    <target name="init">  
        <echo>...开始进行目录初始化...</echo>  
        <!-- 生成R文件的相对目录 -->  
        <var name="outdir-gen" value="gen" />
        <delete dir="${compile-bin-ospath}" />  
        <mkdir dir="${compile-bin-ospath}" />  
        <echo>...目录初始化结束...</echo>  
    </target>  
  
   <target name="testOut">
        <echo>${env.JAVA_HOME}</echo>
        <echo>${env.ANT_HOME}</echo>
         <echo>${basedir}</echo>
    </target>
    
    <!-- 根据工程中的资源文件生成R.java文件  -->  
    <target name="gen-R" depends="init">  
        <echo>...开始生成R.java文件...</echo>  
        <exec executable="${aapt-exe}" failοnerrοr="true">  
            <arg value="package" />  
            <arg value="-f" />  
            <arg value="-m" />  
            <arg value="-J" />  
            <arg value="${outdir-gen}" />  
            <arg value="-S" />  
            <arg value="${resource-dir}" />  
            <arg value="-M" />  
            <arg value="${manifest-xml}" />  
            <arg value="-I" />  
            <arg value="${android-jar}" />  
        </exec>
        <echo>...生成R.java文件结束...</echo>
    </target>  
  
    <!-- 编译aidl文件 -->  
    <target name="aidl-exe" depends="gen-R">  
        <echo>...开始编译aidl文件...</echo>  
        <apply executable="${aidl-exe}" failοnerrοr="true">  
            <!-- 指定预处理文件 -->  
            <arg value="-p${framework-aidl}" />  
            <!-- aidl声明的目录 -->  
            <arg value="-I${srcdir}" />  
            <!-- 目标文件目录 -->  
            <arg value="-o${outdir-gen}" />  
            <!-- 指定哪些文件需要编译 -->  
            <fileset dir="${srcdir}">  
                <include name="**/*.aidl" />  
            </fileset>  
        </apply>
        <echo>...编译aidl文件结束...</echo>
    </target>  
  
    <!-- 将工程中的java源文件编译成class文件 -->  
    <target name="compile" depends="aidl-exe">  
        <echo>...开始java源文件编译成class文件....</echo>  
        <javac
            encoding="utf-8" 
            source="1.6" 
            target="1.6" 
            srcdir="." 
            deprecation="on"
            destdir="${compile-bin-ospath}"
			bootclasspath="${android-jar}"
			verbose="false"  
			debug="true"
			fork="on"
			memoryinitialsize="${javac-forkOn-memoryinitialsize}"
			memorymaximumsize="${javac-forkOn-memoryMaximumSize}"
            compiler="org.eclipse.jdt.core.JDTCompilerAdapter"> 
          
            <compilerarg line="-Xlint:unchecked" />  
            <compilerarg line="-encoding utf-8 " />  
            
            <classpath>  
                <fileset dir="${external-lib}" includes="*.jar" />
                <fileset dir = "${sdk-platform-folder}" includes="*.jar"></fileset>
                <fileset dir="${sdk-tools-folder}\support" includes="*.jar"></fileset>
            </classpath>  
        </javac> 
        <echo>...java源文件编译成class文件完毕....</echo>   
    </target>  
    
      <!--将.class 混淆-->  
    <target name="optimize" depends="compile">  
        <echo>...开始代码混淆...</echo>  
        <jar basedir="${compile-bin-ospath}" destfile="${compile-bin-ospath}\temp.jar"/>  
        <taskdef name="proguard" classname="proguard.ant.ProGuardTask" classpath="${proguard-jar}" />  
        <proguard>    
            -injars                		${compile-bin-ospath}\temp.jar     
            -outjars                    ${compile-bin-ospath}\optimized.jar  
            -libraryjars                ${android-jar}  
            -optimizationpasses 5  					<!--  指定代码的压缩级别 -->
            -dontusemixedcaseclassnames  			<!--  是否使用大小写混合 -->
            -dontskipnonpubliclibraryclasses  
            -dontpreverify  
            -verbose  
            -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*  <!-- 混淆时所采用的算法 -->
            -include ${proguard-cfg}
          </proguard>  
        <delete file="${compile-bin-ospath}\temp.jar"/>  
		<mkdir dir="${compile-bin-ospath}\optimized"/>
        <unzip src="${compile-bin-ospath}\optimized.jar" dest="${compile-bin-ospath}\optimized"/>  
        <delete file="${compile-bin-ospath}\optimized.jar"/>
        <echo>...代码混淆结束...</echo>
    </target>  
  
    <!-- 将.class文件转化成.dex文件 -->  
    <target name="dex" depends="optimize">  
        <echo>...开始将.class文件转化成.dex文件....</echo>
        <exec executable="${dx-bat}" failοnerrοr="true">  
            <arg value="--dex" />  
            <!-- 输出文件 -->  
            <arg value="--output=${dex-ospath}" />  
            <!-- 要生成.dex文件的源classes和libraries -->  
            <arg value="${compile-bin-ospath}\optimized"/>  
            <arg value="${external-lib-ospath}" />  
        </exec>  
         <echo>...将.class文件转化成.dex文件完成....</echo>
    </target>  
  
    <!-- 将资源文件放进输出目录 -->  
    <target name="package-res-and-assets">  
        <echo>...开始将资源文件放进输出目录....</echo>  
        <exec executable="${aapt-exe}" failοnerrοr="true">  
            <arg value="package" />  
            <arg value="-f" />  
            <arg value="-M" />  
            <arg value="${manifest-xml}" />  
            <arg value="-S" />  
            <arg value="${resource-dir}" />  
            <arg value="-A" />  
            <arg value="${asset-dir}" />  
            <arg value="-I" />  
            <arg value="${android-jar}" />  
            <arg value="-F" />  
            <arg value="${resources-package-ospath}" />  
        </exec>
        <echo>...将资源文件放进输出目录完成....</echo> 
    </target>  
  
    <!-- 打包成未签证的apk -->  
    <target name="package" depends="dex, package-res-and-assets">
        <echo>...开始打包未签名的apk....</echo> 
        <exec executable="${apkbuilder-bat}" failοnerrοr="true">  
            <arg value="${unsigned-apk-ospath}" />  
            <arg value="-u" />  
            <arg value="-z" />  
            <arg value="${resources-package-ospath}" />  
            <arg value="-f" />  
            <arg value="${dex-ospath}" />  
            <arg value="-rf" />  
            <arg value="${srcdir-ospath}" />
              <!--  打包*.so文件 -->
           <arg value="-nf"/>
           <arg value="${external-lib-ospath}"/>
        </exec>
        <echo>...打包未签名的apk结束....</echo>   
    </target>  
  
    <!-- 对apk进行签证 -->  
    <target name="jarsigner-exe" depends="package">  
        <echo>...开始对未签名的apk签名...</echo>  
        <exec executable="${jarsigner-exe}" failοnerrοr="true">  
            <arg value="-keystore" />  
            <arg value="${keystore-file-ospath}" />  
            <arg value="-storepass" />  
            <arg value="${storepass-key}" /> <!-- 密码 -->
            <arg value="-keypass" />  
            <arg value="${keypass-key}" />  
            <arg value="-signedjar" />  
            <arg value="${signed-apk-ospath}" />  
            <arg value="${unsigned-apk-ospath}" />  
            <!-- 不要忘了证书的别名 -->  
            <arg value="8m" />  
        </exec> 
        <echo>...未签名的apk签名结束...</echo>   
    </target>  
  
    <!-- 发布 -->  
    <target name="release" depends="jarsigner-exe">  
        <!-- 删除未签证apk -->  
        <delete file="${unsigned-apk-ospath}"/>   
    </target>  
    
    <!-- 打包的应用程序进行优化  
    	对apk文件使用密钥进行签名后,一定要运行zipalign进行对齐。
    	这个工具能做到让那些未压缩的数据以特定的字节对齐。以4字节对齐能优化性能。
    	当对齐后,Android系统能通过  mmap()阅读文件,
    	即使它们包含二进制数据,而不是从包中拷贝所有的数据。
    	好处是在运行程序时减少了随机读取内存的消耗-->  
    <target name="zipalign-exe" depends="release">
        <echo>...开始对签名的apk签名进行优化...</echo>
        <exec executable="${zipalign-exe}" failοnerrοr="true">  
            <arg value="-v" />  
            <arg value="4" />  
            <arg value="${signed-apk-ospath}" />  
            <arg value="${aligned-apk-ospath}" />  
        </exec>
        <echo>...对签名的apk签名进行优化结束...</echo>
    </target>
    
    <target name="_deploy" depends="zipalign-exe">
        <!-- 删除为对齐的签证apk -->
        <delete file="${signed-apk-ospath}"/>
        <echo> 打包成功!apk路径为:${aligned-apk-ospath}</echo>
    </target>
</project>  
ps:ant-contrib-1.0b3.jar的下载地址戳 这里
proguard.cfg的文件我就贴出来了,混淆我相信应该都会懂一点,不懂得可以戳 这里

以上就是Ant打签名apk的全部步骤,每一步都有注释作为解释。

分割线------------------------------------------------------------------------------------------------------------------

工程目录:


buildapp.properties

# This is an config file used to replace variable in buildapp.xml
# Note: Use the '\\' instead of '\' 
# Note: -ospath   absolute path

# this name of android sdk path
sdk-folder = ${env.ANDROID_SDK_HOME}

# ths name of java jdk path
java-home = ${env.JAVA_HOME}

# this name of android sdk platform path
sdk-platform-folder = ${sdk-folder}\\platforms\\android-23

# this name of android sdk tools path
sdk-tools-folder = ${sdk-folder}\\tools

# this name of android sdk platform-tools paht
sdk-platform-tools-folder = ${sdk-folder}\\platform-tools

# complier must contain this jar
android-jar = ${sdk-platform-folder}/android.jar
 
# Here is the build tool
aapt-exe = ${sdk-platform-tools-folder}\\aapt.exe  
aidl-exe = ${sdk-platform-tools-folder}\\aidl.exe  
dx-bat = ${sdk-platform-tools-folder}\\dx.bat  
apkbuilder-bat = ${sdk-tools-folder}\\apkbuilder.bat  
jarsigner-exe = ${java-home}\\bin\\jarsigner.exe  
zipalign-exe = ${sdk-tools-folder}\\zipalign.exe

# this name of proguard home path
proguard-home = ${sdk-tools-folder}\\proguard

# this name of use proguard's jar
proguard-jar = ${proguard-home}\\lib\\proguard.jar

#this name of proguard.cfg path
proguard-cfg = ${basedir}\\proguard.cfg

# javac memory size
javac-forkOn-memoryinitialsize = 256m
javac-forkOn-memoryMaximumSize = 256m


# this name is compile file path
compile-bin-name = bin-compile
compile-bin-ospath = ${basedir}\\${compile-bin-name}

#jars name
org-jar-name = payeco_org.jar
optimized-jar-name = payeco_plugin.jar
buildapp.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="PayecoPayPluginBase" default="optimize">  
    <!-- 必须放在最前面,可以确保能使用到编译平台的环境变量 -->  
    <property environment="env" />
    
    <!-- 引入属性文件 -->
    <property file="buildapp.properties"/> 
    
    <!-- java源文件目录  相对路径-->  
    <property name="srcdir"  value ="src" />
    <!-- java源文件目录  绝对路径-->  
    <property name="srcdir-ospath" value="${basedir}\${srcdir}" />
    
    <!-- 外部类库所在目录 相对路径-->  
    <property name="external-lib" value="libs" />
    <!-- 外部类库所在目录 绝对路径-->
    <property name="external-lib-ospath" value="${basedir}\${external-lib}" /> 
      
    <!-- 初始化工作 -->  
    <target name="init">  
        <echo>...开始进行目录初始化...</echo>  
        <delete dir="${compile-bin-ospath}" />  
        <mkdir dir="${compile-bin-ospath}" />  
        <echo>...目录初始化结束...</echo>  
    </target>  
  
   <target name="testOut">
        <echo>${env.ANDROID_SDK_HOME}</echo>
    </target>
    
    <!-- 将工程中的java源文件编译成class文件 -->  
    <target name="compile" depends="init">  
        <echo>...开始java源文件编译成class文件....</echo>  
        <javac
            encoding="utf-8" 
            source="1.6" 
            target="1.6" 
            srcdir="." 
            deprecation="on"
            destdir="${compile-bin-ospath}"
			bootclasspath="${android-jar}"
			verbose="false"  
			debug="true"
			fork="on"
			memoryinitialsize="${javac-forkOn-memoryinitialsize}"
			memorymaximumsize="${javac-forkOn-memoryMaximumSize}"
            compiler="org.eclipse.jdt.core.JDTCompilerAdapter"> 
          
            <compilerarg line="-Xlint:unchecked" />  
            <compilerarg line="-encoding utf-8 " />  
            
            <classpath>  
                <fileset dir="${external-lib}" includes="*.jar" />
                <fileset dir = "${sdk-platform-folder}" includes="*.jar"></fileset>
                <fileset dir="${sdk-tools-folder}\support" includes="*.jar"></fileset>
            </classpath>  
        </javac> 
        <echo>...java源文件编译成class文件完毕....</echo>   
    </target>  
    
      <!--将.class 混淆-->  
    <target name="optimize" depends="compile">  
        <echo>...开始代码混淆...</echo>  
        <jar basedir="${compile-bin-ospath}" destfile="${compile-bin-ospath}\${org-jar-name}"/>  
        <taskdef name="proguard" classname="proguard.ant.ProGuardTask" classpath="${proguard-jar}" />  
        <proguard>    
            -injars                		${compile-bin-ospath}\${org-jar-name}     
            -outjars                    ${compile-bin-ospath}\${optimized-jar-name}  
            -libraryjars                ${android-jar}  
           
            -include ${proguard-cfg}
          </proguard>  
		<mkdir dir="${compile-bin-ospath}\optimized"/>
        <unzip src="${compile-bin-ospath}\${optimized-jar-name}" dest="${compile-bin-ospath}\optimized"/>  
        <echo>...代码混淆结束...</echo>
    </target>  
  
</project>  
同样混淆文件proguard.cfg我也不贴出来了。

以上就是Ant大混淆jar的全部步骤,其实和上面打签名apk差不多。

分割线------------------------------------------------------------------------------------------------------------------

 <!-- 将工程中的java源文件编译成class文件 -->  
    <target name="compile" depends="init">  
        <echo>...开始java源文件编译成class文件....</echo>  
        <javac
            encoding="utf-8" 
            source="1.6" 
            target="1.6" 
            srcdir="." 
            deprecation="on"
            destdir="${compile-bin-ospath}"
			bootclasspath="${android-jar}"
			verbose="false"  
			debug="true"
			fork="on"
			memoryinitialsize="${javac-forkOn-memoryinitialsize}"
			memorymaximumsize="${javac-forkOn-memoryMaximumSize}"
            compiler="org.eclipse.jdt.core.JDTCompilerAdapter"> 
          
            <compilerarg line="-Xlint:unchecked" />  
            <compilerarg line="-encoding utf-8 " />  
            
            <classpath>  
                <fileset dir="${external-lib}" includes="*.jar" />
                <fileset dir = "${sdk-platform-folder}" includes="*.jar"></fileset>
                <fileset dir="${sdk-tools-folder}\support" includes="*.jar"></fileset>
            </classpath>  
        </javac> 
        <echo>...java源文件编译成class文件完毕....</echo>   
    </target>  
看上面的代码,我javac的compiler用的是org.eclipse.jdt.core.JDTCompilerAdapter,jdk的带的编译约束较多,有的时候Eclipse编译通过了,用jdk的编译还是失败。所以我就换成了Eclipse的了。

换成Eclipse之后注意要改一下ant的run as:

选择第一个,就ok了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值