【0-2】安卓逆向-APK文件结构和打包

APK文件结构

APK (Android application package)指 Android 应用程序包,是 Android 系统中的一种文件格式,用来对安卓应用程序的文件进行打包。直接解压如下图所示。
在这里插入图片描述

文件注释
assets目录存放APK的静态资源文件,比如视频,音频,图片等
lib 目录armeabi-v7a基本通用所有android设备,arm64-v8a只适用于64位的android设备,x86常见用于android模拟器,其目录下的.so文件是c或c++编译的动态链接库文件
META-INF目录保存应用的签名信息,签名信息可以验证APK文件的完整性,相当于APK的身份证(验证文件是否又被修改)
res目录res目录存放资源文件,包括图片,字符串等等,APK的脸蛋由他的layout文件设计
AndroidMainfest.xml文件APK的应用清单信息,它描述了应用的名字,版本,权限,引用的库文件等等信息
classes.dex文件classes.dex是java源码编译后生成的java字节码文件,APK运行的主要逻辑
resources.arsc文件resources.arsc是编译后的二进制资源文件,它是一个映射表,映射着资源和id,通过R文件中的id就可以找到对应的资源

assets(静态资源文件)

assets 文件夹是一种未经编译的资源目录,assets 文件夹中的文件不会被解压缩,这意味着它们的访问速度会比较快,但是会占用更多的安装包空间。通常情况下,开发者会将应用程序中的静态文件、配置文件、原始数据或者其他不常改变的文件放在 assets 文件夹中

lib

存放了运行APP所需要的so文件,也就是动态链接库的二进制文件,为了适配不同安卓系统处理器的版本,lib文件夹中的so库也是按不同处理器版本的文件夹分类放置。

armeabi、armeabi-v7a和x86文件夹,分别用来存储适配arm5架构、arm7架构、Intel32架构的CPU处理器版本的安卓系统。例如,如果智能手机使用的是arm7架构CPU处理器版本的安卓系统,APP在运行时就会调用armeabi-v7a文件夹下的动态链接库文件执行程序。

在安卓系统中库文件分文两种,一种是共享库文件(Shared Libraries),另一种是本地库文件(Native Libraries)。共享库文件是可供多个应用程序使用的库,它们被存放在系统目录中。在 Android 系统中,共享库文件以 .so 为后缀,常见的共享库文件包括 libc.so 和 libm.so。

lib文件夹存放的就是本地库文件。本地库是专门为应用程序所使用的库,它们被打包进 APK 文件中,在安装应用程序之后会被放到私有目录中。在 Android 系统中,本地库文件也以 .so 为后缀,armeabi-v7a的so文件示例见图4。对于一个 Android 应用程序来说,本地库文件往往是应用程序所特有的,并且不会被其他应用程序使用。例如,一个应用程序可能使用本地库文件来封装特定的硬件访问功能,或者使用本地库文件来进行加密解密操作

META-INF

META-INF文件夹,用于存放签名证书,在APK安装时作为校验的凭据,用于保护APK不被恶意篡改,同时也是对APK著作权和所有权的声名。例如,对安装包的任意文件最作修改,导致安卓系统检查计算后的签名信息与APK文件中存储的签名信息不一致,最终无法安装,会出现签名冲突的问题。

在 META-INF 文件夹中可以找到三种常见的文件:

  1. CERT.RSA
  2. CERT.SF
  3. MANIFEST.MF
    在这里插入图片描述

res(编译资源文件)

res文件夹,存放的也是资源文件,与assets文件夹不同的是,这里是编译后的资源文件。直接打开可能显示乱码。在 res 文件夹中你会找到许多子文件夹,每个子文件夹都用来存放特定类型的资源文件,主要的文件夹包括drawable 文件夹(图片资源文件)、layout 文件夹(布局文件)和values 文件夹(值资源文件:应用程序使用的常量值、字符串、颜色信息)。

AndroidManifest.xml

配置清单文件,也是编译过的文件,用来描述应用程序的清单信息。包括包名、应用名、权限、安卓四大组件、版本、引用的库文件等重要信息都在这里面声名。

当你安装应用程序时,Android 系统会读取这个文件,以确定应用程序的基本信息和权限要求。

开发者可以在 AndroidManifest.xml 文件中声明应用程序使用的权限,例如访问网络、访问文件、访问相机等。在应用程序安装时,用户会看到这些权限的描述信息,然后决定是否允许应用程序使用这些权限。

AndroidManifest.xml 文件还用来声明应用程序的主要组件,例如活动(Activity)、服务(Service)、广播接收器(BroadcastReceiver)等。这些组件是安卓应用程序的四大组件的组成部分,它们负责实现应用程序的功能。

属性定义
versionCode版本号,主要用来更新,例如:12
versionName版本名,给用户看的,例如:1.2
package包名,例如:com.zj.52pj.demo
uses-permission android:name=“”应用权限,例如:android.permission.INTERNET 代表网络权限
android:label=“@string/app_name”应用名称
android:icon=“@mipmap/ic_launcher”应用图标路径
android:debuggable=“true”应用是否开启debug权限

classes.dex

classes.dex是java源码编译后生成的java字节码文件。

lasses.dex文件是 Android 系统中的核心代码文件,它是 Dalvik 可执行文件的缩写。classes.dex文件运行在Dalvik虚拟机上的核心代码文件,它反编译后的语言是smali代码语言,smali代码可转换为java代码。APK打包时存放多个dex的原因是每个dex文件的大小是有限制的。

.dex 文件的好处是,它可以使得应用程序的下载包大小变小,因为 Java 字节码文件可以被压缩得比较小。但是,.dex 文件的缺点是,它的访问速度略慢于共享库文件。因此,在 Android 系统中,一般情况下会尽量使用共享库文件来实现应用程序的功能。

resources.arsc

用来存放应用程序的资源表,包含应用程序资源id和资源类型的映射关系。

在 Android 系统中,所有的资源文件都必须在 res 文件夹中存放,并且需要使用特定的文件名和文件夹名。当你编译应用程序时,编译器会将 res 文件夹中的资源文件编译成资源表,并且将资源表打包进 APK 文件中。

用程序通常是通过资源 ID在这个资源映射表中寻找对应的资源,来获取相应的参数。

打包

google官方推出的流程图
在这里插入图片描述

APK安装过程

APK启动流程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值