Android的apk组成结构

Android  2021年6月27日 pm12:12发布3年前 (2021)更新 城堡大人
130 0 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. 2024: TextView.setWidth()竟然失效了(0条评论)
  2. 2024: 老舍:理想的生活,不是房子车子票子(0条评论)
  3. 2023: JNI静态注册(0条评论)
  4. 2020: Android的LevelListDrawable简单使用(0条评论)
  5. 2018: [摘]Java中String首字母大写方法(0条评论)
版权声明 1、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

[摘]深入浅出UML类图(三)

本文作者:刘伟  http://blog.csdn.net/lovelion类与类之间的关系(2)      2. 依赖关系依赖(Dependency)关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。大多数情况下,...

Android消息机制之一基础简介(1)

在项目中,使用Handler是比较多的,延迟处理信息啊,或者跨线程刷新UI界面啊等.用大家都会用,但要用好,或许只能多看看源码和跟大牛们学习学习了.Handler.java,Looper.java,Message.java,MessageQueue.java这几个类主要是在/frameworks/...

[代码片段]获取Sdcard或者U盘的磁盘大小,空闲大小等

前言代码功能:获取Sdcard或者U盘的磁盘大小,空闲大小等。好记性不如烂笔头正文存在单位转换 /** * 磁盘单位转换 * * @param size * @return */ public static String u...

替换preg_replace

推荐使用 读书导航 极客导航 :125啦极客导航(http://www.biumall.com/jike.html)PHP版本升级后preg_replace过期了,虽然都可以用,为了安全考虑,PHP官方推荐使用preg_replace_callback替代。php手册(PHP 4 >= ...

我常用的Monkey命令

Monkey的概念“猴子测试”是指没有测试经验的人甚至对计算机根本不了解的人(就像猴子一样)不需要知道程序的任何用户交互方面的知识,如果给他一个程序,他就会针对他看到的界面进行操作,其操作是无目的的、乱点乱按的。这种测试方式在产品周期中的早期阶段会找到很多很好的bug,为用户节省不少的时间。...

[摘]Handler内存泄露原理及解决方法

SHUI知道本想总结,也懒了,看网上也有很多人总结,也就摘抄于此,以供自己查阅。前言因为Android采取了单线程UI模型,开发者无法在子线程中更新UI,为此Android为我们提供了Handler这个工具,可以开发者切换到主线程更新UI。示例首先看一段示例代码public class...