Android的apk组成结构

站长公众号

前言

总所周知,APK是Android PacKage的缩写,即Android安装包。APK文件其实就是ZIP的压缩格式,如果把APK改成ZIP可以通过压缩软件进行解析。(目前部分压缩软件可以直接解压APK)

本文参考网上文章,进行整理。

好记性不如烂笔头

正文

我们解压APK后的组成部分如下(大致的,部分文件内的没有显示):

AndroidManifest.xml
│  classes.dex
│  classes2.dex
│  classes3.dex
│  resources.arsc
├─lib
│  └─armeabi-v7a
├─META-INF
└─res

今天就大概的整理一下各种目录的意义或者作用。

AndroidManifest.xml

程序的配置文件,四大组件的申明,权限的申明(Android 6.0后权限需要动态申请)等等、

classes.dex

从tree上面知道,存在classes.dex、classes2.dex和 classes3.dex,这是因为AS在Gradle默认采用了dex分包配置。

defaultConfig {
//不配置默认是true,如果不想分包就可以改为false
multiDexEnabled true
}

采用分包的好处:

  1. 单个dex文件方法总数65K的限制
  2. Dexopt 的 LinearAlloc 限制

PS: 具体详细内容可以看《dex分包变形记》

resources.arsc

资源文件(字符文件),对一款软件显示的文字进行修改(对英语软件汉化)

反编译后消失,被反编译到res文件下的values文件夹下了,做汉化什么的时候有可能会用到。

lib

这里存放so库的,只有工程中存放了so库,就存在这个目录。

有网上写的是libs,而我的是lib,不知是否他们写错了?!

工程里存在的结构是:

├─libs
│  └─armeabi-v7a
│          libijkffmpeg.so
│          libijkplayer.so
│          libijksdl.so

所以解压APK后的目录结构是:(注意下面是是lib不是libs)

├─lib
│  └─armeabi-v7a
│          libijkffmpeg.so
│          libijkplayer.so
│          libijksdl.so

我们知道工程中添加so库有两种方式:

  1. 一种在src/mian中创建jniLibs,并复制so库进入
  2. 一种在app目录创建libs,并复制so,同时配置一下gradle目录so库的目录

以往经验,发现第一种方式在Android Studio直接编译运行存在一些问题(可能是Android环境存在问题),个人偏第二种方式。

PS: 具体使用方式请看《Android Studio添加第三方库libs和so

META-INF

一个 manifest ,从 java jar 文件引入的描述包信息的目录。

res

资源文件目录,图片,配置文件等

assets

存放资源文件,且不会在R.java中创建ID标志,同时可以以目录结构存在。

不会在R.java文件下生成相应的标记, assets文件夹可以自己创建文件夹,必须使用AssetsManager类进行访问, 存放到这里的资源在运行打包的时候都会打入程序安装包中

参考文章

  1. Android的apk组成结构
  2. dex分包变形记
  3. APK包体的基本结构
  4. 使用Android Studio编译assets文件未打包进apk
  5. Android Studio添加第三方库libs和so

站长公众号
版权声明:125la.com站长 发表于 2021年6月27日 下午12:12 。
转载请注明: Android的apk组成结构 | 125啦读书导航

相关文章

站长公众号

暂无评论

暂无评论...