android用ant打出不同包名的apk

      之前做这个东西的时候,网上也查了很多资料,但大部分都是转载来的,并且基本都是雷同的,试了之后却没有成功,而且注解也写得很少,让人不大好修改。最后经过各种资料的东拼西凑,以及自己多番尝试,最终还是成功了。在这里写篇博客记录一下,也希望能帮助到需要的人。
    这么做的目的我就不说了,来看此文的人自然会有他的需要。现在直接进入主题。
    用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=&quot;${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,而要把工程的包名都带上了。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值