Android的apk组成结构

Android2021年6月27日 pm12:12发布3年前 (2021)更新 91es.com站长
80 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、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com[备用域名]
3、 本站内容: 部分来源于网络,仅供站长学习和参考,若侵权请留言

暂无评论

暂无评论...

随机推荐

Android Intent匹配及mimeType匹配

前言activity的启动分为显式调用和隐式调用。显式调用需要明确指定组件的信息。隐式调用是通过匹配目标组件的IntentFilter这里是记录一下如何使用匹配目标组建隐式启动Activity正文通过组建匹配,可以再不知道应用包名的情况启动对应的Activity(或者说应用),一个...

徐志摩 :偶然

我是天空里的一片云,偶尔投影在你的波心──你不必讶异,更无须欢喜──在转瞬间消灭了踪影。 你我相逢在黑夜的海上,你有你的,我有我的,方向;你记得也好,最好你忘掉在这交会时互放的光亮!

冰心:我们把春天吵醒了

季候上的春天,像一个困倦的孩子,在冬天温暖轻软的绒被下,安稳地合目睡眠。但是,向大自然索取财富、分秒必争的中国人民,是不肯让它多睡懒觉的!六亿五千万人商量好了,用各种洪大的声音和震天撼地的动作来把它吵醒。大雪纷飞。砭骨的朔风,扬起大地上尖刀般的沙土……我们心里带着永在的春天,成群结队地...

老舍:理想的生活,不是房子车子票子

我的理想家庭要有七间小平房:一间是客厅,古玩字画全非必要,只要几把很舒服宽松的椅子,一二小桌。一间书房,书籍不少,不管什么头版与古本,而都是我所爱读的;一张书桌,桌面是中国漆的,放上热茶杯不至烫成个圆白印;文具不讲究,可是都很好用;桌上老有一两枝鲜花,插在小瓶里。两间卧室,我独居一间,没有臭...

Source Insight 4.0安装

前言简单记录一下Source Insight 4.0的安装,方便自己使用。Source Insight确实是个好软件。正文下载下载Source Insight 4.0安装包://官网https://www.sourceinsight.com/download/下载程序破解补丁包:...

刘明:从一幅寿桃走近一位画家

源于一次写生活动,有幸认识了一位画家,他就是长安画院的周西省大哥。称呼他为大哥,有一种亲和力是源于他的一件小事,感动了我。那就是有缘去了一趟我的老家,他让我的父母坐下,他用手机播放一段我做的视频,让他们看,并说:“老人家,你们看看,这就是您的儿子拍摄的作品。”人与人之间相遇相识有缘是奇妙的,这种...