前言
总所周知,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 }
采用分包的好处:
- 单个dex文件方法总数65K的限制
- 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库有两种方式:
- 一种在src/mian中创建jniLibs,并复制so库进入
- 一种在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类进行访问, 存放到这里的资源在运行打包的时候都会打入程序安装包中
参考文章
- 《Android的apk组成结构》
- 《dex分包变形记》
- 《APK包体的基本结构》
- 《使用Android Studio编译assets文件未打包进apk》
- 《Android Studio添加第三方库libs和so》