Chinaunix首页 | 论坛 | 博客
  • 博客访问: 823585
  • 博文数量: 247
  • 博客积分: 166
  • 博客等级: 入伍新兵
  • 技术积分: 2199
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-15 16:10
文章分类

全部博文(247)

文章存档

2017年(1)

2015年(63)

2014年(80)

2013年(94)

2012年(9)

分类: Android平台

2015-02-13 17:28:14

1.Android程序编译、打包、签名、发布的三种方式: 
方式一:命令行手动编译打包 
方式二:使用ant自动编译打包 
方式三:使用eclipse+ADT编译打包 

2.Android编译、打包的步骤: 
2.1第一步 生成R.java类文件: 
Eclipse中会自动生成R.java,ant和命令行使用android SDK提供的aapt.ext程序生成R.java。 

2.2第二步 将.aidl文件生成.java类文件: 
Eclipse中自动生成,ant和命令行使用android SDK提供的aidl.exe生成.java文件。 

2.3第三步 编译.java类文件生成class文件: 
Eclipse中自动生成,ant和命令行使用jdk的javac编译java类文件生成class文件。 

2.4第四步 将class文件打包生成classes.dex文件: 
Eclipse中自动生成,ant和命令行使用android SDK提供的dx.bat命令行脚本生成classes.dex文件。 

2.5第五步 打包资源文件(包括res、assets、androidmanifest.xml等): 
Eclipse中自动生成,ant和命令行使用Android SDK提供的aapt.exe生成资源包文件。 

2.6第六步 生成未签名的apk安装文件: 
Eclipse中自动生成debug签名文件存放在bin目录中,ant和命令行使用android SDK提供的apkbuilder.bat命令脚本生成未签名的apk安装文件。 

2.7第七步 对未签名的apk进行签名生成签名后的android文件: 
Eclipse中使用Android Tools进行签名,ant和命令行使用jdk的jarsigner对未签名的包进行apk签名。

3.命令行手动编译打包详解 
详见:http://blog.chinaunix.net/uid-28379399-id-4834182.html

4.ant自动打包android程序详解 
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project name="Byread" default="release">
  3.     <property environment="env" />
  4.     <!-- android-folder android sdk安装目录,需要配置ANDROID_SDK_HOME坏境变量,值为android sdk安装目录 -->
  5.     <property name="android-folder" value="${env.ANDROID_SDK_HOME}" />
  6.     <property name="android-tools" value="${android-folder}/tools" />
  7.     <property name="android-platformtools" value="${android-folder}/platform-tools" />
  8.     <property name="sdk-folder" value="${android-folder}/platforms/android-4.2" />
  9.     <property name="sdk-tools" value="${sdk-folder}/tools" />
  10.     <property name="android-framework" value="${sdk.folder}/framework.aidl" />
  11.     

  12.     <!-- 打包签名详细步骤:     
  13.                         1.生成R.java类文件
  14.                         2..aidl文件生成.java类文件
  15.                         3.编译.java类文件生成class文件
  16.                         4.将class文件打包生成classes.dex文件
  17.                         5.打包资源文件(包括res、assets、androidmanifest.xml等)
  18.                          6.生成未签名的apk安装文件
  19.                          7.对未签名的apk进行签名生成签名后的android文件
  20.     -->
  21.     
  22.     <!-- 一些用到的工具命令 -->
  23.     <property name="aapt" value="${android-platformtools}/aapt.exe" />
  24.     <property name="dx" value="${android-platformtools}/dx.bat" />
  25.     <property name="apk-builder" value="${android-tools}/apkbuilder.bat" />
  26.     <property name="aidl" value="${android-platformtools}/aidl.exe" />
  27.     <property name="adb" value="${android-platformtools}/adb.exe" />
  28.     <property name="android-jar" value="${sdk-folder}/android.jar" />
  29.     <property name="jarsigner" value="${env.JAVA_HOME}/bin/jarsigner.exe" />

  30.     <!-- 应用配置 :
  31.         application-package 包名
  32.         useragent             生成签名后的apk包目录
  33.         version             版本号
  34.     -->
  35.     <property name="application-package" value="com.ws.app" />
  36.     <property name="useragent" value="apk" />
  37.     <property name="version" value="1.00" />
  38.     
  39.     <!-- 在工程目录下,定义初始文件:
  40.         bin-dir bin目录,打包过程生成文件存放位置
  41.         gen-dir      gen目录,R文件存放位置
  42.         res-dir      res目录,资源文件
  43.         asset-dir      asset目录,静态文件存放目录
  44.         external-libs 第三方jar包存放目录
  45.     -->
  46.     <property name="bin-dir" value="bin" />
  47.     <property name="gen-dir" value="gen" />
  48.     <property name="res-dir" value="res" />
  49.     <property name="asset-dir" value="assets" />
  50.     <property name="src-dir" value="src" />
  51.     <property name="src-dir-ospath" value="${basedir}/${src-dir}" />
  52.     <property name="external-libs" value="libs" />
  53.     <property name="external-libs-ospath" value="${basedir}/${external-libs}" />
  54.     
  55.     <!-- 打包过程中生成的中间文件 :
  56.         bin-dir-classes bin目录下的classes目录,存放源码编译后的文件
  57.         dex-file          命名的dex文件
  58.         intermediate-dex dex文件生成目录
  59.     -->
  60.     <property name="bin-dir-classes" value="${bin-dir}/classes" />
  61.     <property name="bin-dir-classes-ospath" value="${basedir}/${bin-dir-classes}" />
  62.     <property name="dex-file" value="classes.dex" />
  63.     <property name="intermediate-dex" value="${bin-dir}/${dex-file}" />
  64.     <property name="intermediate-dex-ospath" value="${basedir}/${intermediate-dex}" />

  65.     <!-- 打包过程中生成的包文件 :
  66.         resources-package 将AndroidManifest.xml,res和assets文件夹中的资源文件打包生成文件包
  67.         out-unsigned-package 打包成的未签名的apk包
  68.         out-signed-package     打包成的已签名的apk包
  69.     -->
  70.     <property name="resources-package" value="${bin-dir}/res.zip" />
  71.     <property name="resources-package-ospath" value="${basedir}/${resources-package}" />
  72.     <property name="out-unsigned-package" value="${bin-dir}/${ant.project.name}-unsigned.apk" />
  73.     <property name="out-unsigned-package-ospath" value="${basedir}/${out-unsigned-package}" />
  74.     <property name="out-signed-package" value="${useragent}/${ant.project.name}.apk" />
  75.     <property name="out-signed-package-ospath" value="${basedir}/${out-signed-package}" />

  76.     
  77.     <!-- 初始化文件路径:
  78.         生成bin目录,bin下的classes目录,存放apk的目录
  79.     -->
  80.     <target name="init">
  81.         <echo>初始化文件路径... </echo>
  82.         <delete dir="${bin-dir}" />
  83.         <delete dir="${useragent}" />
  84.         <mkdir dir="${bin-dir}" />
  85.         <mkdir dir="${bin-dir-classes}" />
  86.         <mkdir dir="${useragent}" />    
  87.     </target>

  88.     <!-- 1.生成R.java类文件.
  89.     
  90.         -m -J ${gen-dir}      代表按覆盖的形式在gen目录下生成带包路径的R.java
  91.         -M AndroidManifest.xml 指定程序的配置文件
  92.         -S ${res-dir} 指定资源文件
  93.         -I ${android-jar}      指定使用的android类
  94.         
  95.         相当于命令行:aapt package -f -m -J D:\android\workspace\htmlapp\gen -S D:\android\workspace\htmlapp\res
  96.                 -I D:\android\sdk\android.jar -M D:\android\workspace\htmlapp\AndroidManifest.xml
  97.     -->
  98.     <target name="resource-src" depends="init">
  99.         <echo>1.生成R.java类文件...</echo>
  100.         <exec executable="${aapt}" failonerror="true">
  101.             <arg value="package" />
  102.             <arg value="-m" />
  103.             <arg value="-J" />
  104.             <arg value="${gen-dir}" />
  105.             <arg value="-M" />
  106.             <arg value="AndroidManifest.xml" />
  107.             <arg value="-S" />
  108.             <arg value="${res-dir}" />
  109.             <arg value="-I" />
  110.             <arg value="${android-jar}" />
  111.         </exec>
  112.     </target>

  113.     <!-- 2..aidl文件生成.java类文件.
  114.         ${src-dir} 工程中的.aidl文件
  115.     -->
  116.     <target name="aidl" depends="resource-src">
  117.         <echo>2..aidl文件生成.java类文件...</echo>
  118.         <apply executable="${aidl}" failonerror="true">
  119.             <arg value="-p${android-framework}" />
  120.             <arg value="-I${src-dir}" />
  121.             <fileset dir="${src-dir}">
  122.                 <include name="**/*.aidl" />
  123.             </fileset>
  124.         </apply>
  125.     </target>

  126.     <!-- 3.编译.java类文件生成class文件.
  127.     
  128.         -encoding GB18030              指定源文件使用的字符编码
  129.         -target 1.6                     生成特定VM版本的类文件
  130.         -bootclasspath ${android-jar} 覆盖引导类文件的位置
  131.         -d ${bin-dir-classes}          指定存放生成的类文件的位置
  132.         
  133.         相当于命令行:javac -encoding GB18030 -target 1.6 -bootclasspath D:\android\sdk\android.jar
  134.                 -d D:\android\workspace\htmlapp\bin\classes D:\android\workspace\htmlapp\src\com\ws\app\*
  135.     -->
  136.     <target name="compile" depends="aidl">
  137.         <echo>3.编译.java类文件生成class文件...</echo>
  138.         <javac encoding="GB18030" target="1.6" debug="true" extdirs="" srcdir="." destdir="${bin-dir-classes}" bootclasspath="${android-jar}">
  139.             <classpath>
  140.                 <fileset dir="${external-libs}" includes="*.jar" />
  141.             </classpath>
  142.         </javac>
  143.     </target>

  144.     <!-- 4.将class文件打包生成classes.dex文件.
  145.     
  146.         output=${intermediate-dex-ospath} 为生成的目标文件classes.dex
  147.         ${bin-dir-classes-ospath}            class文件所在目录
  148.         ${external-libs-ospath}                jar包所在目录
  149.         
  150.         相当于命令行:dx -dex -output=D:\android\workspace\htmlapp\bin\classes.dex
  151.                 D:\android\workspace\htmlapp\bin\classes D:\android\workspace\htmlapp\libs
  152.     -->
  153.     <target name="dex" depends="compile">
  154.         <echo>4.将class文件打包生成classes.dex文件</echo>
  155.         <exec executable="${dx}">
  156.             <arg value="--dex" />
  157.             <arg value="--output=${intermediate-dex-ospath}" />
  158.             <arg path="${bin-dir-classes-ospath}" />
  159.             <arg value="${external-libs-ospath}" />
  160.         </exec>
  161.     </target>

  162.     <!-- 5.打包资源文件(包括res、assets、androidmanifest.xml).
  163.     
  164.         ${res-dir}             工程下的res目录,存放资源文件
  165.         ${asset-dir}         工程下的asset目录,存放资源
  166.         ${android-jar} 需要的jar文件
  167.         ${resources-package} 将AndroidManifest.xml,res和assets文件夹中的资源文件打包生成文件包
  168.         
  169.         相当于命令行:aapt package -f -M D:\android\workspace\htmlapp\AndroidManifest.xml -S D:\android\workspace\htmlapp\res
  170.                 -A D:\android\workspace\htmlapp\assets -I D:\android\sdk\android.jar -F D:\android\workspace\htmlapp\bin\res.zip
  171.     -->
  172.     <target name="package-res-and-assets">
  173.         <echo>Packaging resources and assets...</echo>
  174.         <exec executable="${aapt}" failonerror="true">
  175.             <arg value="package" />
  176.             <arg value="-f" />
  177.             <arg value="-M" />
  178.             <arg value="AndroidManifest.xml" />
  179.             <arg value="-S" />
  180.             <arg value="${res-dir}" />
  181.             <arg value="-A" />
  182.             <arg value="${asset-dir}" />
  183.             <arg value="-I" />
  184.             <arg value="${android-jar}" />
  185.             <arg value="-F" />
  186.             <arg value="${resources-package}" />
  187.         </exec>
  188.     </target>

  189.     <!-- 打包资源文件(包括res和androidmanifest.xml,不包括assets). -->
  190.     <target name="package-res-no-assets">
  191.         <echo>Packaging resources...</echo>
  192.         <exec executable="${aapt}" failonerror="true">
  193.             <arg value="package" />
  194.             <arg value="-f" />
  195.             <arg value="-M" />
  196.             <arg value="AndroidManifest.xml" />
  197.             <arg value="-S" />
  198.             <arg value="${res-dir}" />
  199.             <!-- No assets directory -->
  200.             <arg value="-I" />
  201.             <arg value="${android-jar}" />
  202.             <arg value="-F" />
  203.             <arg value="${resources-package}" />
  204.         </exec>
  205.     </target>

  206.     <!-- 打包资源文件. -->
  207.     <target name="package-res">
  208.         <echo>5.打包资源文件...</echo>
  209.         <available file="${asset-dir}" type="dir" property="res-target" value="and-assets" />
  210.         <property name="res-target" value="no-assets" />
  211.         <antcall target="package-res-${res-target}" />
  212.     </target>

  213.     <!-- 6.生成未签名的apk安装文件.
  214.     
  215.         ${out-unsigned-package-ospath} 生成的未签名的apk
  216.         ${resources-package-ospath}     上一步生成的资源包
  217.         ${intermediate-dex-ospath} 目标文件classes.dex
  218.         ${src-dir-ospath}             源码目录
  219.         ${external-libs-ospath} 第三方jar包存放目录
  220.     
  221.         相当于命令行:apkbuilder D:\android\workspace\htmlapp\bin\LBSDemo.apk -v -u -z D:\android\workspace\htmlapp\bin\res.zip
  222.                 -f D:\android\workspace\htmlapp\bin\classes.dex -rf D:\android\workspace\htmlapp\src
  223.     -->
  224.     <target name="package" depends="dex, package-res">
  225.         <echo>6.生成未签名的apk安装文件...</echo>
  226.         <exec executable="${apk-builder}" failonerror="true">
  227.             <arg value="${out-unsigned-package-ospath}" />
  228.             <arg value="-u" />
  229.             <arg value="-z" />
  230.             <arg value="${resources-package-ospath}" />
  231.             <arg value="-f" />
  232.             <arg value="${intermediate-dex-ospath}" />
  233.             <arg value="-rf" />
  234.             <arg value="${src-dir-ospath}" />
  235.             <arg value="-rj" />
  236.             <arg value="${external-libs-ospath}" />
  237.         </exec>
  238.     </target>
  239.     
  240.     <!-- 7.对未签名的apk进行签名生成签名后的android文件.
  241.         
  242.         -keystore htmlapp.keystore 密钥文件
  243.         -storepass 121718 密钥文件密码
  244.         -keypass 121718              密钥别名密码
  245.         ${out-signed-package-ospath} 签名后生成的apk文件
  246.         ${out-unsigned-package-ospath} 未签名的apk文件
  247.         html应用 密钥别名
  248.     
  249.         相当于命令行:jarsigner -verbose -keystore D:\android\workspace\htmlapp\htmlapp.keystore -storepass 121718
  250.                 -signedjar D:\android\workspace\htmlapp\bin\LBSDemo_signed.apk D:\android\workspace\htmlapp\bin\LBSDemo.apk html应用
  251.     -->
  252.     <target name="jarsigner" depends="package">
  253.         <echo>7.对未签名的apk进行签名生成签名后的android文件...</echo>
  254.         <exec executable="${jarsigner}" failonerror="true">
  255.             <arg value="-verbose" />
  256.             <arg value="-keystore" />
  257.             <arg value="htmlapp.keystore" />
  258.             <arg value="-storepass" />
  259.             <arg value="121718" />
  260.             <arg value="-keypass" />
  261.             <arg value="121718" />
  262.             <arg value="-signedjar" />
  263.             <arg value="${out-signed-package-ospath}" />
  264.             <arg value="${out-unsigned-package-ospath}" />
  265.             <arg value="html应用" />
  266.         </exec>
  267.     </target>
  268.     
  269.     <!-- 发布. -->
  270.     <target name="release" depends="jarsigner">
  271.         <echo>发布...</echo>
  272.     </target>

  273. </project>
5.eclipse打包签名 
详见:http://blog.chinaunix.net/uid-28379399-id-4833767.html

参考:http://blog.csdn.net/zuolongsnail/article/details/6444361
          http://jojol-zhou.iteye.com/blog/729271
          http://sinfrancis.iteye.com/blog/721582
阅读(838) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~