概述

android打包过程,下面这张图取自Android开发权威指南,非常清晰。

整个过程使用的工具有

名称 功能介绍 在操作系统中的路径
aapt Android资源打包工具 ${ANDROID_SDK_HOME}/platform-tools/appt
aidl Android接口描述语言转化为.java文件的工具 ${ANDROID_SDK_HOME}/platform-tools/aidl
javac Java Compiler ${JDK_HOME}/javac或/usr/bin/javac
dex 转化.class文件为Davik VM能识别的.dex文件 ${ANDROID_SDK_HOME}/platform-tools/dex
apkbuilder 生成apk包 ${ANDROID_SDK_HOME}/tools/apkbuilder
jarsigner .jar文件的签名工具 ${JDK_HOME}/jarsigner或/usr/bin/jarsigner
zipalign 字节码对齐工具 ${ANDROID_SDK_HOME}/tools/zipalign

使用aapt生成R文件

例如:aapt l <你的apk文件>,这个命令就是查看apk内容
permissions 打印app包的权限
resources 打印资源表
configurations 打印配置信息
xmltree 打印制定的xml信息
xmlstrings 打印制定字符串
[-0 extension [-0 extension ...]] [-g tolerance] [-j jarfile] /
[--debug-mode] [--min-sdk-version VAL] [--target-sdk-version VAL] /
[--app-version VAL] [--app-version-name TEXT] [--custom-package VAL] /
[--rename-manifest-package PACKAGE] /
[--rename-instrumentation-target-package PACKAGE] /
[--utf16] [--auto-add-overlay] /
[--max-res-version VAL] /
[-I base-package [-I base-package ...]] /
[-A asset-source-dir] [-G class-list-file] [-P public-definitions-file] /
[-S resource-sources [-S resource-sources ...]] [-F apk-file] [-J R-file-dir] /

[--product product1,product2,...] /

[raw-files-dir [raw-files-dir] ...]

使用javac命令编译java源码

java [options] [sourcefiles] [@files]
其中:
options:命令行选项;
sourcefiles:一个或多个要编译的源文件;
@files:一个或多个对源文件进行列表的文件,有时候要编译的文件很多,一个个敲命令会显得很长,也不方便修改,可以把要编译的源文件列在文件中,在文件名前加@,这样就可以对多个文件进行编译,对编译一个工程很有用,方便,省事。
有几个比较重要的选项:
-d 用于指定编译成的class文件的存放位置,缺省情况下不指定class文件的存放目录,编译的class文件将和源文件在同一目录下;
-classpath 可以简写成-cp,用于搜索编译所需的class文件,指出编译所用到的class文件的位置,如jar、zip或者其他包含class文件的目录,指定该选项会覆盖CLASSPATH的设定;
-sourcepath用于搜索编译所需的源文件(即java文件),指定要搜索的源文件的位置,如jar、zip或其他包含java文件的目录;
需要注意windows下和linux下文件路径分隔符和文件列表(即-classpath和-sourcepath指定的文件)分隔符的区别:
windows下文件路径分隔符用 \ ,文件列表分隔符用分号 ;
linux下文件路径分隔符用 / ,文件列表分隔符用冒号 :

下面我们来一步一步的分析一下。

aapt的用法有:

1. 列出apk包的内容

aapt l[ist] [-v] [-a] file.{zip,jar,apk}

-v 以table形式列出来

-a 详细列出内容

2. 查看apk一些信息

aapt d[ump] [--values] WHAT file.{apk} [asset [asset ...]]

badging 打印app包的label和icon

例如:aapt d permissions <apk文件>, 这个就是显示这个apk所具有的权限

3. 编译Android资源

aapt p[ackage] [-d][-f][-m][-u][-v][-x][-z][-M AndroidManifest.xml] /

这个比较复杂,只解释几个关键参数。

-f 如果编译出来的文件已经存在,强制覆盖。

-m 使生成的包的目录放在-J参数指定的目录。

-J 指定生成的R.java的输出目录

-S res文件夹路径

-A assert文件夹的路径

-M AndroidManifest.xml的路径

-I 某个版本平台的android.jar的路径

-F 具体指定apk文件的输出

例如:

1). 将工程的资源编译R.java文件

aapt package -m -J<R.java目录> -S<res目录> -I<android.jar目录> -M <AndroidManifest.xml目录>

2). 将工程的资源编译编译到一个包里

aapt package -f -S<res目录> -I<android.jar目录> -A<assert目录> -M <AndroidManifest.xml目录> -F <输出的包目录>

4. 打包好的apk中移除文件

aapt r[emove] [-v] file.{zip,jar,apk} file1 [file2 ...]

例如:aapt r <你的apk文件> AndroidManifest.xml, 这个就是将apk中的AndroidManifest移除掉

5. 添加文件到打包好的apk中

aapt a[dd] [-v] file.{zip,jar,apk} file1 [file2 ...]

例如:aapt a <你的apk文件> <要添加的文件路径>, 这个就是将文件添加到打包好的apk文件中

6. 显示aapt的版本

aapt v[ersion]

例如:aapt v, 就是打印这个结果 Android Asset Packaging Tool, v0.2

javac 用于编译Java文件,格式为:

使用Dex工具将class文件打包成dex文件

dx --dex [--debug] [--verbose] [--positions=<style>] [--no-locals]
[--no-optimize] [--statistics] [--[no-]optimize-list=<file>] [--no-strict]
[--keep-classes] [--output=<file>] [--dump-to=<file>] [--dump-width=<n>]
[--dump-method=<name>[*]] [--verbose-dump] [--no-files] [--core-library]
[--num-threads=<n>]
[<file>.class | <file>.{zip,jar,apk} | <directory>] ...
Convert a set of classfiles into a dex file, optionally embedded in a
jar/zip. Output name must end with one of: .dex .jar .zip .apk. Positions
options: none, important, lines.
dx --annotool --annotation=<class> [--element=<element types>]
[--print=<print types>]
dx --dump [--debug] [--strict] [--bytes] [--optimize]
[--basic-blocks | --rop-blocks | --ssa-blocks | --dot] [--ssa-step=<step>]
[--width=<n>] [<file>.class | <file>.txt] ...
Dump classfiles, or transformations thereof, in a human-oriented format.
dx --junit [-wait] <TestClass>
Run the indicated unit test.
dx --find-usages <file.dex> <declaring type> <member>
Find references and declarations to a field or method.
declaring type: a class name in internal form, like Ljava/lang/Object;
member: a field or method name, like hashCode
dx -J<option> ... <arguments, in one of the above forms>
Pass VM-specific options to the virtual machine that runs dx.
dx --version 打印版本号
dx --help 打印帮助信息
-d Debug Mode: Includes debug files in the APK file.
-u Creates an unsigned package.
-storetype Forces the KeyStore type. If ommited the default is used.
-z Followed by the path to a zip archive.
Adds the content of the application package.
-f Followed by the path to a file.
Adds the file to the application package.
-rf Followed by the path to a source folder.
Adds the java resources found in that folder to the application
package, while keeping their path relative to the source folder.
-rj Followed by the path to a jar file or a folder containing
jar files.
Adds the java resources found in the jar file(s) to the application
package.
-nf Followed by the root folder containing native libraries to
include in the application package.

使用aapt打包文件,命令已经在上面介绍过。

使用apkbuildert生成未签名的apk安装文件

需要注意的是,最新的android sdk已经找不到apkbuider这个命令了,

而使用sdklib.jar里面的com.android.sdklib.build.ApkBuilderMain这个类

使用jarsigner对未签名的包进行apk签名

第一步:生成keystore
第二步:jarsigner签名apk

keytool -genkey -v -keystore android.keystore -alias android.keystore -keyalg RSA -validity 20000

jarsigner -verbose -keystore android.keystore -signedjar android_signed.apk android.apk android.keystore

jarsigner用法[选项] jar文件别名

jarsigner -verify [选项] jar文件

[-keystore <url>]密钥库位置

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[-providerClass <>加密服务提供者的名称

[-providerArg <参数>]] ...主类文件和构造函数参数

使用Zipalign优化程序包

Usage: zipalign [-f] [-v] <align> infile.zip outfile.zip

zipalign -c [-v] <align> infile.zip

<align>: alignment in bytes, e.g. ’4′ provides 32-bit alignment

-c: check alignment only (does not modify file)

还有一些没有提到,比如编译so库,编译aidl文件。以后单独说明。



欢迎扫描二维码,一起学习交



更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. Android2.2的camera应用程序中支持双camera切换(二)
  6. Android如何打印std::cout/printf(重定向stdout)
  7. 获取apk签名信息
  8. 在Android应用中实现Google搜索的例子
  9. Android(安卓)手绘 - 支持保存为图片

随机推荐

  1. Android(安卓)图片处理之不同res-dpi文件
  2. android获取本地视频缩略图和时长的两种
  3. Android(安卓)适配18:9全面屏
  4. android wifi 点对点传输
  5. RN不用启动Android(安卓)Studio用命令行
  6. UIStackView
  7. Android(安卓)常用的性能分析工具详解:GPU
  8. Android(安卓)有些机型hint不显示
  9. Android(安卓)ConstraintLayout 约束布局
  10. Android(安卓)基础常见记录