转载自 ericxu21.blog.chinaunix.net 的博客 命令行开发、编译、打包Android应用程序 (2012-01-14 21:56) 标签: 打包 Android 应用程序 开发


Android SDK提供了一系列命令行工具,用来进行Android应用的开发、调试、打包等工作!Eclipse能够进行Android应用开发的相关工作,也是调用了这些工具而已.

只有掌握了命令下的工作方式,工作起来才会更加的得心应手.下面就抛开Eclipse集成开发工具,徒手走一遍Android开发、编译、打包的流程!

注:本文只作参考之用,因为LBSDemo工程中有本人自己加入的代码,有第三方jar包,so文件等等!故一步一步按照本文操作是行不通的!


1:创建Android应用程序

Android SDK提供了一个android.bat批处理工具,它可以用来处理以下工作,这里只介绍它的子命令create project来进行程序的创建.


  1. D:\Android>android --help
  2. Usage:
  3. android [global options] action [action options]

  4. Global options:
  5. -v --verboseVerbose mode: errors, warnings and informational messages are pr
  6. inted.
  7. -h --help Help on a specific command.
  8. -s --silent Silent mode: only errors are printed out.

  9. Valid actions are composed of a verb and an optional direct object:
  10. - list : Lists existing targets or virtual devices.
  11. - list avd : Lists existing Android Virtual Devices.
  12. - list target : Lists existing targets.
  13. - create avd : Creates a new Android Virtual Device.
  14. - move avd : Moves or renames an Android Virtual Device.
  15. - delete avd : Deletes an Android Virtual Device.
  16. - update avd : Updates an Android Virtual Device to match the folders
  17. of a new SDK.
  18. - create project : Creates a new Android project.
  19. - update project : Updates an Android project (must already have an Androi
  20. dManifest.xml).
  21. - create test-project: Creates a new Android project for a test package.
  22. - update test-project: Updates the Android project for a test package (must al
  23. ready have an AndroidManifest.xml).
  24. - create lib-project : Creates a new Android library project.
  25. - update lib-project : Updates an Android library project (must already have a
  26. n AndroidManifest.xml).
  27. - update adb : Updates adb to support the USB devices declared in the
  28. SDK add-ons.
  29. - update sdk : Updates the SDK by suggesting new platforms to install
  30. if available.
复制代码 --create project子命令的用法如下:

  1. Action "create project":
  2. Creates a new Android project.
  3. Options:
  4. -n --name 应用程序的名字
  5. -t --target SDK Target ID
  6. -p --path 应用程序的工作目录
  7. -k --package应用程序的包名
  8. -a --activity 默认创建的Activity的名字
复制代码 了解了相关命令及其用法,现在就可以用之来创建应用程序:在D:\Android工作目录下创建LBSDemo程序 命令自动创建了如下内容:

2:编译Android应用程序 A:生成R.java文件Android程序代码中会大量地引用各类资源文件,这些资源文件不是通过手动进行引用的,AndroidSDK提供了一个R.java类来进行资源的管理,方便程序员对资源文件的引用及管理,所以如果要让程序编译通过,首先就需要生成R.java类。 编译R.java类需要用到AndroidSDK提供的aapt工具,aapt参数众多,以下是主要参数:
  1. -done or more device assets to include, separated by commas
  2. -fforce overwrite of existing files
  3. -gspecify a pixel tolerance to force images to grayscale, default 0
  4. -jspecify a jar or zip file containing classes to include
  5. -kjunk path of file(s) added
  6. -mmake package directories under location specified by -J
  7. -uupdate existing packages (add new, replace older, remove deleted files)
  8. -vverbose output
  9. -xcreate extending (non-application) resource IDs
  10. -zrequire localization of resource attributes marked with
  11. localization="suggested"
  12. -Aadditional directory in which to find raw asset files
  13. -GA file to output proguard options into.
  14. -Fspecify the apk file to output
  15. -Iadd an existing package to base include set
  16. -Jspecify where to output R.java resource constant definitions
  17. -Mspecify full path to AndroidManifest.xml to include in zip
  18. -Pspecify where to output public resource definitions
  19. -Sdirectory in which to find resources.Multiple directories will be scann
  20. d
复制代码 aapt编译R.java文件具体如下:需要进入LBSDemo应用程序目录,新建一个gen目录,没有gen目录,命令将会出现找不到文件的错误!命令成功执行后将会在gen目录下生成成包结构的目录树,及R.java文件!


参数说明
  1. -f -m -J gen :以覆盖的形式在gen目录下生成带包路径的R.java

  2. -S res:指定资源文件

  3. -I E:\Android\SDK\android-sdk_r09-windows\platforms\android-7\android.jar:使用指定版本的android jar包

  4. -M AndroidManifest.xml:指定程序的配置文件
复制代码 B:根据.aidl定义文件生成java文件 将.aidl文件生成.java文件需要用到AndroidSDK自带的aidl工具,此工具具体参数如下:
  1. -I<DIR> search path for import statements.
  2. -d<FILE> generate dependency file.
  3. -p<FILE> file created by --preprocess to import.
  4. -o<FOLDER> base output folder for generated files.
  5. -b fail when trying to compile a parcelable.
复制代码 值得注意的是:这个工具的参数与参数值之间不能有空格,Google也有对工资不满意的工程师!

C:用JAVASDK提供的javac命令工具将.java源文件编译为.class文件javac命令用法如下:
  1. 其中,可能的选项包括:
  2. -g 生成所有调试信息
  3. -g:none 不生成任何调试信息
  4. -g:{lines,vars,source} 只生成某些调试信息
  5. -nowarn 不生成任何警告
  6. -verbose 输出有关编译器正在执行的操作的消息
  7. -deprecation 输出使用已过时的 API 的源位置
  8. -classpath <路径> 指定查找用户类文件和注释处理程序的位置
  9. -cp <路径> 指定查找用户类文件和注释处理程序的位置
  10. -sourcepath <路径> 指定查找输入源文件的位置
  11. -bootclasspath <路径> 覆盖引导类文件的位置
  12. -extdirs <目录> 覆盖安装的扩展目录的位置
  13. -endorseddirs <目录> 覆盖签名的标准路径的位置
  14. -proc:{none,only} 控制是否执行注释处理和/或编译。
  15. -processor <class1>[,<class2>,<class3>...]要运行的注释处理程序的名称;绕过默认
  16. 的搜索进程
  17. -processorpath <路径> 指定查找注释处理程序的位置
  18. -d <目录> 指定存放生成的类文件的位置
  19. -s <目录> 指定存放生成的源文件的位置
  20. -implicit:{none,class} 指定是否为隐式引用文件生成类文件
  21. -encoding <编码> 指定源文件使用的字符编码
  22. -source <版本> 提供与指定版本的源兼容性
  23. -target <版本> 生成特定 VM 版本的类文件
  24. -version 版本信息
  25. -help 输出标准选项的提要
  26. -Akey[=value] 传递给注释处理程序的选项
  27. -X 输出非标准选项的提要
  28. -J<标志> 直接将 <标志> 传递给运行时系统
复制代码 具体如下[因为需要编译的.java文件分布在不同的文件夹下,故写了多个*.java文件路径.引用了第三方Jar包,故要将jar包指定入classpath]:


D:使用Android SDK提供的dx.bat命令行脚本生成classes.dex文件将工程bin目录下的class文件编译成classes.dex,Android虚拟机只能执行dex文件!

命令生成的.dex文件如下

E:使用Android SDK提供的aapt.exe生成资源包文件(包括res、assets、androidmanifest.xml等):aapt用法参考上面!

命令生成的.ap_文件如下:

F:利用AndroidSDK提供的apkbuilder工具生成未签名的APK文件重要参数如下:
  1. -v Verbose.
  2. -d Debug Mode: Includes debug files in the APK file.
  3. -u Creates an unsigned package.
  4. -storetype Forces the KeyStore type. If ommited the default is used.

  5. -z Followed by the path to a zip archive.
  6. Adds the content of the application package.

  7. -f Followed by the path to a file.
  8. Adds the file to the application package.

  9. -rf Followed by the path to a source folder.
  10. Adds the java resources found in that folder to the application
  11. package, while keeping their path relative to the source folder.

  12. -rj Followed by the path to a jar file or a folder containing
  13. jar files.
  14. Adds the java resources found in the jar file(s) to the application
  15. package.

  16. -nf Followed by the root folder containing native libraries to
  17. include in the application package.
复制代码 注:1,如果需要将so文件打包进apk,一定要加上-nf参数2,如果第三方jar包里含有图片资源,一定要加上-rj参数,不然jar包里资源文件解不出来,程序会因为无法引用资源而报错!

命令生成的.apk文件


H:利用JAVASDK提供的keytools工具生成证书文件!上面只是生成了一个没有证书的apk文件,Android是不会去安装一个没有数字证书签名的apk包的,所以需要安装apk的话,必须用一个数字证书对其签名后,才可!


此处输入命令后,此命令会与用户产生交互,如果你不想产生交互的情况,那么就要提前把命令想问的都告诉它! keytool -genkey -alias HelloWorld.keystore -keyalg RSA -validity 1000 -keystore HelloWorld.keystore -dname "CN=w,OU=w,O=localhost,L=w,ST=w,C=CN" -keypass 123456 -storepass 123456 命令生成的.keystore文件如下:





I:最后一步,通过jarsigner命令用证书文件对未签名的APK文件进行签名重要参数如下:
  1. [-keystore <url>] 密钥库位置

  2. [-storepass <口令>] 用于密钥库完整性的口令

  3. [-storetype <类型>] 密钥库类型

  4. [-keypass <口令>] 专用密钥的口令(如果不同)

  5. [-sigfile <文件>] .SF/.DSA 文件的名称

  6. [-signedjar <文件>] 已签名的 JAR 文件的名称

  7. [-digestalg <算法>] 摘要算法的名称

  8. [-sigalg <算法>] 签名算法的名称

  9. [-verify] 验证已签名的 JAR 文件

  10. [-verbose] 签名/验证时输出详细信息

  11. [-certs] 输出详细信息和验证时显示证书

  12. [-tsa <url>] 时间戳机构的位置

  13. [-tsacert <别名>] 时间戳机构的公共密钥证书

  14. [-altsigner <类>] 替代的签名机制的类名

  15. [-altsignerpath <路径列表>] 替代的签名机制的位置

  16. [-internalsf] 在签名块内包含 .SF 文件

  17. [-sectionsonly] 不计算整个清单的散列

  18. [-protected] 密钥库已保护验证路径

  19. [-providerName <名称>] 提供者名称

  20. [-providerClass <类> 加密服务提供者的名称
  21. [-providerArg <参数>]] ... 主类文件和构造函数参数
复制代码 具体用法如下:




大功告成,终于完成了!



总结:通过对这些命令的运用,你才能清楚地知道程序开发、编译、打包的每一个细节、才知道Eclipse是如何工作的、就算换了一个集成开发工具、也能很快得心应手!甚至能开发一套与Eclipse里打包一样功能的工具呢!下面的就是本人对上面命令的一个总结!如果公司需要,你也可以动手写一个!




更多相关文章

  1. NPM 和webpack 的基础使用
  2. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  3. 热修复AndFix详解
  4. Android怎样修改系统时间?
  5. 关于Android的keystore生成和查看keystore
  6. 一个android工程的运行过程
  7. android新建项目时gen目录下的R文件没有自动的生成
  8. android 命令介绍
  9. Android制作并替换系统开机动画bootanimation.zip(需root)

随机推荐

  1. sqlserver中的自定义函数的方法小结
  2. .Net下执行sqlcmd的方法
  3. SqlServer下通过XML拆分字符串的方法
  4. Sqlserver 常用日期时间函数
  5. SQLServer中SELECT语句的执行顺序
  6. 在SQLServer上查看SQL语句的执行时间的方
  7. sqlserver 存储过程分页代码第1/2页
  8. 当恢复sqlserver bak文件时,原始的用户无
  9. 数据库中经常用到的操作和管理数据库的语
  10. 删除Table表中的重复行的方法