码迷,mamicode.com
首页 > 移动开发 > 详细

Android apk打包过程

时间:2016-06-21 07:18:43      阅读:727      评论:0      收藏:0      [点我收藏+]

标签:

概述

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文件。以后单独说明。



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

技术分享


Android apk打包过程

标签:

原文地址:http://blog.csdn.net/robertcpp/article/details/51628815

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!