Android的apk组成结构

Android 3xcn.com@站长2021年6月27日 pm12:12发布3年前 (2021)更新
0
导航号,我的单页导航
目录

前言

总所周知,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

版权声明 1、 本站名称 91易搜
2、 本站网址 https://www.91es.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权请留言
4、 本站禁止发布或转载任何违法的相关信息,如有发现请向站长举报
导航号,我的单页导航

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

暂无评论...