Android apk打包过程

概述

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

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

时间: 2024-10-21 09:21:19

Android apk打包过程的相关文章

android Apk打包过程概述_android是如何打包apk的

最近看了老罗分析android资源管理和apk打包流程的博客,参考其他一些资料,做了一下整理,脱离繁琐的打包细节和数据结构,从整体上概述了apk打包的整个流程. 流程概述: 1.打包资源文件,生成R.java文件 2.处理aidl文件,生成相应java 文件 3.编译工程源代码,生成相应class 文件 4.转换所有class文件,生成classes.dex文件 5.打包生成apk 6.对apk文件进行签名 7.对签名后的apk文件进行对其处理 打包过程使用的工具 名称 功能介绍 在操作系统中的

Android学习--apk打包过程

1. 使用aapt工具,给所有的res目录下的资源文件生成对应的id,id会被放进R.java文件中 2. JavaC编译器,将所有Java文件转换为Class文件,其中,内部类会分别生成.class文件,命名格式为MainActivity$内部类.class R$String.class等 3. 将class中的公共常量提取出来,生成dex文件 4. aapt将生成的menifest+dex+resource+程序签名打包成zip格式,其实就是apk格式.说明,META-INF是程序签名信息

Android APK安装过程学习笔记

1.什么是APK APK,即Android Package,Android安装包.不同平台的安装文件格式都不同,类似于Windows的安装包是二进制的exe格式,Mac的安装包是dmg格式.APK可以再Android上执行安装,APK的本质是一个Zip压缩包,只是后缀被修改为apk,其中打包了源代码编译出的class.dex.一些图片视屏资源文件和一些Native库文件.APK文件与Zip文件最大的一个不同是APK包含签名文件,用于保证安装包安全不被修改. 2.什么是DEX文件和ODEX文件 J

从Android源码到apk——apk打包过程

Android程序是怎么从源码变成可以安装使用的apk的 原文链接http://sparkyuan.github.io/2016/04/01/从源码到APK/ ,转载请注明出处 流程 官方版 详细版 上面就是一个关于构建过程的一个典型的流程图. aapt(Android Asset Packaging Tool)给你的Activity提供所需的资源文件,如 AndroidManifest.xml,XML文件,并编译它们.同时产生R.java文件,使你可以在java代码中引用这些资源. aidl工

Android APK打包流程

简单build流程图 官网给了我们一张非常简单的编译.打包.apk生成内容以及签名的图片.图片大体介绍了从Project到运行到设备或者模拟器的一个大体流程,我们也从中看到一个完整的apk包含如下内容:一个或多个dex文件.resources.arsc.未编译的资源文件以及AndroidManifest.xml文件等等 详细build流程图 官网给了我们一张非常清晰的打包流程图: 编译打包步骤: 1. 打包资源文件,生成R.java文件 打包资源的工具是aapt(The Android Asse

Android APK安装过程介绍

课题路径:从Myfile中点击应用进行安装,到安装完成,过程分析 思想方法:在研究PreloadInstaller的时候我们直接从整个apk的文件结构入手,由整体到部分的分析:但现在整个PMS非常庞大.我们采取抓住某个功能点分析,由点到面,直到掌控全部 目录现象    1log分析    3PackageInstaller 功能的提取    4PackageInstaller/AndroidManifest.xml    4PackageInstallerActivity.java    4In

详谈Android apk打包:关于APK数字签名详解介绍

本文主要为大家详细讲解APK数字签名方面的内容,并介绍APK调试模式和发布模式下数字签名的方式. 本文转自:http://www.jizhuomi.com/android/environment/293.html 1.什么是数字签名 数字签名就是为你的程序打上一种标记,来作为你自己的标识,当别人看到签名的时候会知道它是与你相关的. 2.为什么要数字签名 最简单直接的回答:系统要求的. Android系统要求每一个Android应用程序必须要经过数字签名才能够安装到系统中,也就是说如果一个Andr

Android Studio打包过程和应用安装过程

三个部分,检查项目和读取基本配置,Gradle Build,Apk Install和LaunchActivity. 应用安装到手机,会复制APK安装包到data/app目录下,解压并扫描安装包,把dex文件保存到dalvik-cache目录,并在data/data目录下创建对应的应用数据目录. 原文地址:https://www.cnblogs.com/wenjiang/p/8215391.html

Eclipse下配置Ant脚本 自己主动打包带签名的Android apk

尽管eclipse非常少用了,可是在古老的项目上还是会用到.一个麻烦事是打带签名包的时候.非常不方便.下边纪录下配置ant,自己主动打包带签名apk的过程,作为备忘.(PC环境为MAC) 1,第一步得安ant,下载相应安装包,解压后配置环境变量: export ANT_HOME="/Users/yanzi/work/apache-ant-1.9.4" export PATH=${PATH}:${ANT_HOME}/bin 通过which ant检查是否成功安装. 2,在项目文件夹下执行