之前做这个东西的时候,网上也查了很多资料,但大部分都是转载来的,并且基本都是雷同的,试了之后却没有成功,而且注解也写得很少,让人不大好修改。最后经过各种资料的东拼西凑,以及自己多番尝试,最终还是成功了。在这里写篇博客记录一下,也希望能帮助到需要的人。
这么做的目的我就不说了,来看此文的人自然会有他的需要。现在直接进入主题。
用ant生成build.xml和local.properties,这个网上很多,也不说了。
修改local.properties:
sdk-folder=E:/android-sdk-windows
jdk-home=D:\Program Files\Java\jdk1.7.0_05
sdk-tools=${sdk-folder}/tools
sdk-platform=${sdk-folder}/platforms/android-14
sdk-platform-tools=${sdk-folder}/platform-tools
这份配置还是比较简单的。麻烦的是build.xml,关键处我已经加了注解:
<?xml version="1.0" encoding="UTF-8"?>
<project name="yxApp" default="debug">
<!-- The local.properties file is created and updated by the 'android' tool.
It contains the path to the SDK. It should *NOT* be checked into
Version Control Systems. -->
<property file="local.properties" />
<property name="outdir" value="bin" />
<property name="out.absolute.dir" location="${outdir}" />
<property name="project.dir" value="." />
<property name="temp.dir" value="${project.dir}/temp" /><!-- 临时目录,会把源码拷过来,修改一些东西 -->
<property name="outdir-gen" value="${temp.dir}/gen"/><!-- R.java的临时目录-->
<!-- Input directories -->
<property name="resource-dir" value="res" />
<property name="asset-dir" value="assets" />
<property name="src-dir" value="${project.dir}/src" />
<property name="src-dir-ospath" value="${basedir}/${src-dir}" />
<property name="external-lib" value="libs" />
<!-- Output directories -->
<property name="outdir-classes" value="${outdir}/classes" />
<property name="out.classes.absolute.dir" location="${outdir-classes}" />
<!-- Intermediate files -->
<property name="dex-file" value="classes.dex" />
<property name="intermediate-dex" value="${out.absolute.dir}/${dex-file}" />
<!-- The final package file to generate -->
<property name="out-package" value="${outdir}/${ant.project.name}.apk" />
<!-- 需要的工具 -->
<property name="aapt" value="${sdk-platform-tools}/aapt.exe" />
<property name="aidl" value="${sdk-platform-tools}/aidl.exe" />
<property name="dx" value="${sdk-platform-tools}/dx.bat"/>
<property name="adb" value="${sdk-tools}/adb" />
<property name="apk-builder" value="${sdk-tools}/apkbuilder.bat" />
<property name="android-jar" value="${sdk-platform}/android.jar" />
<!-- The final package file to generate -->
<property name="resources-package" value="${outdir}/${ant.project.name}" />
<property name="resources-package-ospath" value="${basedir}/${resources-package}" />
<property name="out-debug-package" value="${outdir}/${ant.project.name}-debug.apk" />
<property name="out-debug-package-ospath" value="${basedir}/${out-debug-package}" />
<property name="out-unsigned-package" value="${outdir}/${ant.project.name}-unsigned.apk" />
<property name="out-unsigned-package-ospath" value="${basedir}/${out-unsigned-package}" />
<property name="out-signed-package" value="${outdir}/${ant.project.name}-signed.apk" />
<property name="out-signed-package-ospath" value="${basedir}/${out-signed-package}" />
<property name="zipalign-package-ospath" value="${basedir}/${ant.project.name}_release.apk" />
<property name="jarsigner" value="${jdk-home}/bin/jarsigner.exe"/>
<property name="zipalign" value="${sdk-tools}/zipalign.exe"/>
<property name="old_package_name" value="com.supcon.orchid.bapApp" /><!-- 工程中的包名-->
<property name="new_package_name" value="com.supcon.orchid.yxApp" /><!-- 新的包名 -->
<!-- init -->
<target name="init">
<echo>Creating all output directories </echo>
<delete dir="${outdir}" />
<delete dir="${outdir-classes}" />
<delete dir="${outdir-gen}" />
<mkdir dir="${outdir}" />
<mkdir dir="${outdir-classes}" />
<mkdir dir="${outdir-gen}" />
<delete dir="${temp.dir}"></delete>
<mkdir dir="${temp.dir}"/>
<!--这里会把工程下面的一些需要处理的文件,都复制到temp里 -->
<copy todir="${temp.dir}">
<fileset dir="${project.dir}" includes="**/src/**"/>
<fileset dir="${project.dir}" includes="**/gen/**"/>
<fileset dir="${project.dir}" includes="*.*"/>
</copy>
<!-- 替换AndroidManifest中的包名 -->
<replaceregexp flags="g" encoding="UTF-8" byline="true">
<regexp pattern="package(.*)${old_package_name}"/>
<substitution expression="package="${new_package_name}"/>
<fileset dir="${temp.dir}" includes="AndroidManifest.xml"/>
</replaceregexp>
<!-- 替换java文件中对R.java import的包名 -->
<replaceregexp flags="g" encoding="UTF-8" byline="true">
<regexp pattern="import(.*)${old_package_name}.R"/>
<substitution expression="import ${new_package_name}.R"/>
<fileset dir="${temp.dir}/src" includes="**/*.java"/>
<fileset dir="${temp.dir}/src" includes="*.java"/>
</replaceregexp>
</target>
<!-- 生成R.java -->
<target name="resource-src" depends="init">
<echo>Generating R.java...</echo>
<exec executable="${aapt}" failοnerrοr="true">
<arg value="package" />
<arg value="-m" />
<arg value="-J" />
<arg value="${outdir-gen}" />
<arg value="-M" />
<arg value="${temp.dir}/AndroidManifest.xml" />
<arg value="-S" />
<arg value="${resource-dir}" />
<arg value="-I" />
<arg value="${android-jar}" />
</exec>
</target>
<!-- Generate java classes from .aidl files. -->
<target name="aidl" depends="init">
<echo>Compiling aidl files into Java classes...</echo>
<apply executable="${aidl}" failοnerrοr="true">
<arg value="-p${android-framework}" />
<arg value="-I${src-dir}" />
<fileset dir="${src-dir}">
<include name="**/*.aidl" />
</fileset>
</apply>
</target>
<!-- 编译文件. -->
<target name="compile" depends="init, resource-src, aidl">
<javac encoding="utf-8"
target="1.5"
debug="true"
extdirs=""
srcdir="${src-dir};${outdir-gen}"
destdir="${outdir-classes}"
bootclasspath="${android-jar}">
<classpath>
<fileset dir="${external-lib}" includes="*.jar" />
</classpath>
</javac>
</target>
<!-- Step 3. Convert this project's .class files into .dex files. -->
<target name="dex" depends="compile">
<echo>Converting compiled files into ${intermediate-dex}... </echo>
<exec executable="${dx}" failοnerrοr="true">
<arg value="--dex" />
<arg value="--output=${intermediate-dex}" />
<arg path="${out.classes.absolute.dir}" />
</exec>
</target>
<!-- Step 4. Put the project's resources into the output package file. -->
<target name="package-res-and-assets">
<echo>Packaging resources and assets...</echo>
<exec executable="${aapt}" failοnerrοr="true">
<arg value="package" />
<arg value="-f" />
<arg value="-M" />
<arg value="${temp.dir}/AndroidManifest.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}"/>
</exec>
</target>
<!-- Step 4. Same as package-res-and-assets, but without "-A ${asset-dir}" -->
<target name="package-res-no-assets">
<echo>Packaging resources...</echo>
<exec executable="${aapt}" failοnerrοr="true">
<arg value="package" />
<arg value="-f" />
<arg value="-M" />
<arg value="${temp.dir}/AndroidManifest.xml" />
<arg value="-S" />
<arg value="${resource-dir}" />
<!-- No assets directory -->
<arg value="-I" />
<arg value="${android-jar}" />
<arg value="-F" />
<arg value="${resources-package}" />
</exec>
</target>
<!-- Invoke the proper target depending on whether or not an assets directory is present. -->
<!-- TODO: find a nicer way to include the "-A ${asset-dir}" argument only when the assets dir exists. -->
<target name="package-res">
<available file="${asset-dir}" type="dir" property="res-target" value="and-assets" />
<property name="res-target" value="no-assets" />
<antcall target="package-res-${res-target}" />
</target>
<!-- Step 5. Package the application and sign it with a debug key.
This is the default target when building. It is used for debug. -->
<target name="debug" depends="dex, package-res">
<echo>Packaging ${out-debug-package-ospath}, and signing it with a debug key...</echo>
<exec executable="${apk-builder}" failοnerrοr="true">
<arg value="${out-debug-package-ospath}" />
<arg value="-z" />
<arg value="${resources-package-ospath}" />
<arg value="-f" />
<arg value="${intermediate-dex}" />
<arg value="-rf" />
<arg value="${src-dir-ospath}" />
</exec>
</target>
<!-- Step 5. Package the application without signing it. -->
<target name="release" depends="dex, package-res">
<echo>Packaging ${out-debug-package-ospath}, and signing it with a debug key...</echo>
<exec executable="${apk-builder}" failοnerrοr="true">
<arg value="${out-unsigned-package-ospath}" />
<arg value="-u" />
<arg value="-z" />
<arg value="${resources-package-ospath}" />
<arg value="-f" />
<arg value="${intermediate-dex}" />
<arg value="-rf" />
<arg value="${src-dir-ospath}" />
</exec>
</target>
<loadproperties srcFile="project.properties" />
<import file="custom_rules.xml" optional="true" />
<import file="${sdk-folder}/tools/ant/build.xml" />
</project>
修改了build.xml后,再用ant打包,应该就可以生成一个包名不一样的apk了。
我这里是打了debug的包,没加签名,关于签名的,网上也有资料,加下就好。另外,由于androidMenefast.xml中的package被改过了,所以在写“<activity android:name=”的时候,不能写.abcActivity,而要把工程的包名都带上了。
这么做的目的我就不说了,来看此文的人自然会有他的需要。现在直接进入主题。
用ant生成build.xml和local.properties,这个网上很多,也不说了。
修改local.properties:
sdk-folder=E:/android-sdk-windows
jdk-home=D:\Program Files\Java\jdk1.7.0_05
sdk-tools=${sdk-folder}/tools
sdk-platform=${sdk-folder}/platforms/android-14
sdk-platform-tools=${sdk-folder}/platform-tools
这份配置还是比较简单的。麻烦的是build.xml,关键处我已经加了注解:
<?xml version="1.0" encoding="UTF-8"?>
<project name="yxApp" default="debug">
<!-- The local.properties file is created and updated by the 'android' tool.
It contains the path to the SDK. It should *NOT* be checked into
Version Control Systems. -->
<property file="local.properties" />
<property name="outdir" value="bin" />
<property name="out.absolute.dir" location="${outdir}" />
<property name="project.dir" value="." />
<property name="temp.dir" value="${project.dir}/temp" /><!-- 临时目录,会把源码拷过来,修改一些东西 -->
<property name="outdir-gen" value="${temp.dir}/gen"/><!-- R.java的临时目录-->
<!-- Input directories -->
<property name="resource-dir" value="res" />
<property name="asset-dir" value="assets" />
<property name="src-dir" value="${project.dir}/src" />
<property name="src-dir-ospath" value="${basedir}/${src-dir}" />
<property name="external-lib" value="libs" />
<!-- Output directories -->
<property name="outdir-classes" value="${outdir}/classes" />
<property name="out.classes.absolute.dir" location="${outdir-classes}" />
<!-- Intermediate files -->
<property name="dex-file" value="classes.dex" />
<property name="intermediate-dex" value="${out.absolute.dir}/${dex-file}" />
<!-- The final package file to generate -->
<property name="out-package" value="${outdir}/${ant.project.name}.apk" />
<!-- 需要的工具 -->
<property name="aapt" value="${sdk-platform-tools}/aapt.exe" />
<property name="aidl" value="${sdk-platform-tools}/aidl.exe" />
<property name="dx" value="${sdk-platform-tools}/dx.bat"/>
<property name="adb" value="${sdk-tools}/adb" />
<property name="apk-builder" value="${sdk-tools}/apkbuilder.bat" />
<property name="android-jar" value="${sdk-platform}/android.jar" />
<!-- The final package file to generate -->
<property name="resources-package" value="${outdir}/${ant.project.name}" />
<property name="resources-package-ospath" value="${basedir}/${resources-package}" />
<property name="out-debug-package" value="${outdir}/${ant.project.name}-debug.apk" />
<property name="out-debug-package-ospath" value="${basedir}/${out-debug-package}" />
<property name="out-unsigned-package" value="${outdir}/${ant.project.name}-unsigned.apk" />
<property name="out-unsigned-package-ospath" value="${basedir}/${out-unsigned-package}" />
<property name="out-signed-package" value="${outdir}/${ant.project.name}-signed.apk" />
<property name="out-signed-package-ospath" value="${basedir}/${out-signed-package}" />
<property name="zipalign-package-ospath" value="${basedir}/${ant.project.name}_release.apk" />
<property name="jarsigner" value="${jdk-home}/bin/jarsigner.exe"/>
<property name="zipalign" value="${sdk-tools}/zipalign.exe"/>
<property name="old_package_name" value="com.supcon.orchid.bapApp" /><!-- 工程中的包名-->
<property name="new_package_name" value="com.supcon.orchid.yxApp" /><!-- 新的包名 -->
<!-- init -->
<target name="init">
<echo>Creating all output directories </echo>
<delete dir="${outdir}" />
<delete dir="${outdir-classes}" />
<delete dir="${outdir-gen}" />
<mkdir dir="${outdir}" />
<mkdir dir="${outdir-classes}" />
<mkdir dir="${outdir-gen}" />
<delete dir="${temp.dir}"></delete>
<mkdir dir="${temp.dir}"/>
<!--这里会把工程下面的一些需要处理的文件,都复制到temp里 -->
<copy todir="${temp.dir}">
<fileset dir="${project.dir}" includes="**/src/**"/>
<fileset dir="${project.dir}" includes="**/gen/**"/>
<fileset dir="${project.dir}" includes="*.*"/>
</copy>
<!-- 替换AndroidManifest中的包名 -->
<replaceregexp flags="g" encoding="UTF-8" byline="true">
<regexp pattern="package(.*)${old_package_name}"/>
<substitution expression="package="${new_package_name}"/>
<fileset dir="${temp.dir}" includes="AndroidManifest.xml"/>
</replaceregexp>
<!-- 替换java文件中对R.java import的包名 -->
<replaceregexp flags="g" encoding="UTF-8" byline="true">
<regexp pattern="import(.*)${old_package_name}.R"/>
<substitution expression="import ${new_package_name}.R"/>
<fileset dir="${temp.dir}/src" includes="**/*.java"/>
<fileset dir="${temp.dir}/src" includes="*.java"/>
</replaceregexp>
</target>
<!-- 生成R.java -->
<target name="resource-src" depends="init">
<echo>Generating R.java...</echo>
<exec executable="${aapt}" failοnerrοr="true">
<arg value="package" />
<arg value="-m" />
<arg value="-J" />
<arg value="${outdir-gen}" />
<arg value="-M" />
<arg value="${temp.dir}/AndroidManifest.xml" />
<arg value="-S" />
<arg value="${resource-dir}" />
<arg value="-I" />
<arg value="${android-jar}" />
</exec>
</target>
<!-- Generate java classes from .aidl files. -->
<target name="aidl" depends="init">
<echo>Compiling aidl files into Java classes...</echo>
<apply executable="${aidl}" failοnerrοr="true">
<arg value="-p${android-framework}" />
<arg value="-I${src-dir}" />
<fileset dir="${src-dir}">
<include name="**/*.aidl" />
</fileset>
</apply>
</target>
<!-- 编译文件. -->
<target name="compile" depends="init, resource-src, aidl">
<javac encoding="utf-8"
target="1.5"
debug="true"
extdirs=""
srcdir="${src-dir};${outdir-gen}"
destdir="${outdir-classes}"
bootclasspath="${android-jar}">
<classpath>
<fileset dir="${external-lib}" includes="*.jar" />
</classpath>
</javac>
</target>
<!-- Step 3. Convert this project's .class files into .dex files. -->
<target name="dex" depends="compile">
<echo>Converting compiled files into ${intermediate-dex}... </echo>
<exec executable="${dx}" failοnerrοr="true">
<arg value="--dex" />
<arg value="--output=${intermediate-dex}" />
<arg path="${out.classes.absolute.dir}" />
</exec>
</target>
<!-- Step 4. Put the project's resources into the output package file. -->
<target name="package-res-and-assets">
<echo>Packaging resources and assets...</echo>
<exec executable="${aapt}" failοnerrοr="true">
<arg value="package" />
<arg value="-f" />
<arg value="-M" />
<arg value="${temp.dir}/AndroidManifest.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}"/>
</exec>
</target>
<!-- Step 4. Same as package-res-and-assets, but without "-A ${asset-dir}" -->
<target name="package-res-no-assets">
<echo>Packaging resources...</echo>
<exec executable="${aapt}" failοnerrοr="true">
<arg value="package" />
<arg value="-f" />
<arg value="-M" />
<arg value="${temp.dir}/AndroidManifest.xml" />
<arg value="-S" />
<arg value="${resource-dir}" />
<!-- No assets directory -->
<arg value="-I" />
<arg value="${android-jar}" />
<arg value="-F" />
<arg value="${resources-package}" />
</exec>
</target>
<!-- Invoke the proper target depending on whether or not an assets directory is present. -->
<!-- TODO: find a nicer way to include the "-A ${asset-dir}" argument only when the assets dir exists. -->
<target name="package-res">
<available file="${asset-dir}" type="dir" property="res-target" value="and-assets" />
<property name="res-target" value="no-assets" />
<antcall target="package-res-${res-target}" />
</target>
<!-- Step 5. Package the application and sign it with a debug key.
This is the default target when building. It is used for debug. -->
<target name="debug" depends="dex, package-res">
<echo>Packaging ${out-debug-package-ospath}, and signing it with a debug key...</echo>
<exec executable="${apk-builder}" failοnerrοr="true">
<arg value="${out-debug-package-ospath}" />
<arg value="-z" />
<arg value="${resources-package-ospath}" />
<arg value="-f" />
<arg value="${intermediate-dex}" />
<arg value="-rf" />
<arg value="${src-dir-ospath}" />
</exec>
</target>
<!-- Step 5. Package the application without signing it. -->
<target name="release" depends="dex, package-res">
<echo>Packaging ${out-debug-package-ospath}, and signing it with a debug key...</echo>
<exec executable="${apk-builder}" failοnerrοr="true">
<arg value="${out-unsigned-package-ospath}" />
<arg value="-u" />
<arg value="-z" />
<arg value="${resources-package-ospath}" />
<arg value="-f" />
<arg value="${intermediate-dex}" />
<arg value="-rf" />
<arg value="${src-dir-ospath}" />
</exec>
</target>
<loadproperties srcFile="project.properties" />
<import file="custom_rules.xml" optional="true" />
<import file="${sdk-folder}/tools/ant/build.xml" />
</project>
修改了build.xml后,再用ant打包,应该就可以生成一个包名不一样的apk了。
我这里是打了debug的包,没加签名,关于签名的,网上也有资料,加下就好。另外,由于androidMenefast.xml中的package被改过了,所以在写“<activity android:name=”的时候,不能写.abcActivity,而要把工程的包名都带上了。