APK的基本结构

APK文件的含义及构成

APK (Android application package)指Android应用程序包,是 Android 系统中的一种文件格式,用来对安卓应用程序的文件进行打包。APK文件包含了应用程序的所有文件,包括静态资源文件(assets)、库文件(lib)、签名文件(META-INF)、编译资源文件(res)、配置清单文件(AndroidManifest.xml)、核心代码文件(classes.dex)和资源映射文件(resources.arsc)等信息,APK文件的基本结构示例见图1。通常,可以从应用市场或者网站下载APK文件,然后使用 Android 系统提供的安装器安装应用程序。本文通过某APK文件解压后的文件夹来介绍这些文件资源的作用。

图1 APK的基本结构

 静态资源文件

静态资源文件主要指存放在assets文件夹中的文件。assets文件夹是一种未经编译的资源目录,它会被打包进APK文件中,在安装应用程序之后可以被访问。assets 文件夹中的文件不会被解压缩,这意味着它们的访问速度会比较快,但是会占用更多的安装包空间。通常情况下,开发者会将应用程序中的静态文件、配置文件、原始数据或者其他不常改变的文件放在 assets 文件夹中。这样可以使得应用程序的下载包大小变小,并且可以更快速地访问这些文件。

如图2所示,在静态资源assets文件夹中,可能存放一些图片包括(jpg、png、gif等),还有可能存放js文件。

图2 assets文件夹示例

库文件

图3 lib文件夹示例

库文件主要指lib文件夹中的文件,在这个文件夹中,存放了运行APP所需要的so文件,也就是动态链接库的二进制文件。为了适配不同安卓系统处理器的版本,lib文件夹中的so库也是按不同处理器版本的文件夹分类放置。在图3的示例中,分成了三种文件夹包括armeabi、armeabi-v7a和x86文件夹,分别用来存储适配arm5架构、arm7架构、Intel32架构的CPU处理器版本的安卓系统。例如,如果智能手机使用的是arm7架构CPU处理器版本的安卓系统,APP在运行时就会调用armeabi-v7a文件夹下的动态链接库文件执行程序。

在安卓系统中库文件分文两种,一种是共享库文件(Shared Libraries),另一种是本地库文件(Native Libraries)。共享库文件是可供多个应用程序使用的库,它们被存放在系统目录中。在Android系统中,共享库文件以 .so 为后缀,常见的共享库文件包括 libc.so 和 libm.so。

而lib文件夹存放的就是本地库文件。本地库是专门为应用程序所使用的库,它们被打包进APK文件中,在安装应用程序之后会被放到私有目录中。在 Android 系统中,本地库文件也以 .so 为后缀,armeabi-v7a的so文件示例见图4。对于一个Android应用程序来说,本地库文件往往是应用程序所特有的,并且不会被其他应用程序使用。例如,一个应用程序可能使用本地库文件来封装特定的硬件访问功能,或者使用本地库文件来进行加密解密操作。

图4 armeabi-v7a的so文件示例

签名文件

图5 META-INF文件夹示例

签名文件指的是存放在META-INF文件夹中的文件。META-INF 文件夹是 Android 系统中的一种特殊文件夹,它用来存放应用程序的签名信息。在 META-INF 文件夹中可以找到三种常见的文件:CERT.RSA、CERT.SF和MANIFEST.MF,META-INF文件夹示例见图5。CERT.RSA、CERT.SF这两个文件用来存放应用程序的签名信息。当安装一个应用程序时,Android 系统会检查这两个文件,以确保应用程序的完整性和安全性。MANIFEST.MF文件用来存放应用程序的所有文件的清单信息。

当打包应用程序时,这些文件会自动生成,并且会被打包进APK 文件中。通常情况下,不需要手动修改这些文件,但是有时候可能需要编辑这些文件来更新应用程序的版本号或者修改权限要求。

META-INF文件夹,用于存放签名证书,在APK安装时作为校验的凭据,用于保护APK不被恶意篡改,同时也是对APK著作权和所有权的声明。例如,对安装包的任意文件最作修改,导致安卓系统检查计算后的签名信息与APK文件中存储的签名信息不一致,最终无法安装,会出现签名冲突的问题。

编译资源文件

图6 res文件夹示例

编译资源文件主要指存放在res文件夹中的文件。res文件夹,存放的也是资源文件,与assets文件夹不同的是,这里是编译后的资源文件。直接打开可能显示乱码。在 res 文件夹中你会找到许多子文件夹,每个子文件夹都用来存放特定类型的资源文件,res文件夹示例见图6。主要的文件夹包括drawable 文件夹、layout 文件夹和values 文件夹。

drawable 文件夹用来存放图片资源文件,包括位图文件(.png, .jpg, .gif 等)和矢量图文件(.svg)。

layout 文件夹用来存放布局文件,布局文件用来描述应用程序的界面结构。

values 文件夹用来存放值资源文件,值资源文件用来存放应用程序中使用的常量值和颜色信息。

在Android 系统中,所有的资源文件都必须在 res 文件夹中存放,并且需要使用特定的文件名和文件夹名。这样的好处是,Android 系统会自动为每个资源文件分配一个唯一的资源 ID,使得安卓系统可以方便地引用这些资源。

配置清单文件

AndroidManifest.xml文件是配置清单文件,也是编译过的文件,用来描述应用程序的清单信息。包括包名、应用名、权限、安卓四大组件、版本等重要信息都在这里面声明。

当打包应用程序时,AndroidManifest.xml 文件会自动生成,并且会被打包进 APK 文件中。当你安装应用程序时,Android 系统会读取这个文件,以确定应用程序的基本信息和权限要求。

开发者可以在AndroidManifest.xml 文件中声明应用程序使用的权限,例如访问网络、访问文件、访问相机等。在应用程序安装时,用户会看到这些权限的描述信息,然后决定是否允许应用程序使用这些权限。

AndroidManifest.xml 文件还用来声明应用程序的主要组件,例如活动(Activity)、服务(Service)、广播接收器(BroadcastReceiver)等。这些组件是安卓应用程序的四大组件的组成部分,它们负责实现应用程序的功能。

核心代码文件

核心代码文件主要指classes.dex文件。classes.dex文件是 Android 系统中的重要代码文件,它是 Dalvik 可执行文件的缩写。Dalvik 是 Android 系统中的一种虚拟机,它负责在 Android 系统中运行应用程序的代码。classes.dex文件运行在Dalvik虚拟机上的核心代码文件,它反编译后的语言是smali代码语言,smali代码可转换为java代码。对于大的APK文件会出现多个dex文件,但在APP实际运行的过程中会将多个dex文件合并成一个dex文件运行。APK打包时存放多个dex的原因是每个dex文件的大小是有限制的。

.dex 文件中存放的是 Java 字节码,这是 Java 编译器编译出来的机器码。.dex 文件本身是一种二进制文件,它使用一种特殊的格式来存放字节码。

在打包Android 应用程序时,.dex 文件会自动生成,并且会被打包进 APK 文件中。当你安装应用程序时,.dex 文件会被解压缩并放到私有目录中,然后被 Dalvik 虚拟机加载并运行。

.dex 文件的好处是,它可以使得应用程序的下载包大小变小,因为 Java 字节码文件可以被压缩得比较小。但是,.dex 文件的缺点是,它的访问速度略慢于共享库文件。因此,在 Android 系统中,一般情况下会尽量使用共享库文件来实现应用程序的功能。

资源映射文件

resources.arsc文件是 Android 系统中的一种特殊文件,它用来存放应用程序的资源表。资源表是一种二进制文件,它包含了应用程序的资源 ID 和资源类型的映射关系。

在Android系统中,所有的资源文件都必须在 res 文件夹中存放,并且需要使用特定的文件名和文件夹名。当你编译应用程序时,编译器会将 res 文件夹中的资源文件编译成资源表,并且将资源表打包进 APK 文件中。

resources.arsc文件的好处是,它可以使得应用程序的资源文件变小,因为资源表文件可以被压缩得比较小。但是,resources.arsc 文件的缺点是,它的访问速度略慢于普通的文本文件。因此,在Android系统中,一般情况下会尽量使用普通的文本文件来存放应用程序的资源信息。

注意,resources.arsc文件仅仅是一个辅助文件,它本身并没有什么实际意义。应用程序通常是通过资源 ID在这个资源映射表中寻找对应的资源,来获取相应的参数。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容