andriod文件结构
Android包(英语:Android Package,APK),是Android操作系统使用的一种应用程序包文件格式,用于分发和安装移动应用及中间件。一个Android应用程序的代码想要在Android设备上运行,必须先进行编译,然后被打包成为一个被Android系统所能识别的文件才可以被运行,而这种能被Android系统识别并运行的文件格式便是“APK”。 一个APK文件内包含被编译的代码文件(.dex 文件),文件资源(resources), assets,证书(certificates),和清单文件(manifest file)。
APK文件基于ZIP文件格式,它与JAR文件的构造方式相似。它的互联网媒体类型互联网媒体类型)是:
application/vnd.android.package-archive
。
首先,将.apk
文件后缀名改为.zip
,然后解压打开,以下面著名开源项目KnowWeather为例:
其中:
文件夹名称 | 作用 |
---|---|
META-INF | 在Android应用的APK文件中,META-INF文件夹是存放数字签名相关文件的文件夹,签名信息可以验证APK文件的完整性,相当于APK的身份证(验证文件是否被修改) |
assets | 存放APK的静态资源文件,比如视频,音频,图片等,这个文件夹下的资源文件不会被编译。不被编译的资源文件是指在编译过程中不会被转换成二进制代码的文件,而是直接被打包到最终的程序中。这些文件通常是一些静态资源,如图片、音频、文本文件等。 |
res | 资源文件目录,二进制格式。实际上,APK文件下的res文件夹并不是二进制格式,而是经过编译后的二进制资源文件。在Android应用程序开发中,资源文件通常是以XML格式存储的,如布局文件、字符串资源、颜色资源等。在编译时,Android编译器会将这些XML资源文件编译成二进制格式的资源文件,以提高应用程序的运行效率和安全性。虽然res文件夹下的二进制资源文件不能直接编辑和修改,但是开发者仍然可以通过Android提供的资源管理工具,如aapt、apktool等,来反编译和编辑这些资源文件的。 |
AndroidManifest.xml | AndroidManifest.xml是Android应用程序中最重要的文件之一,它包含了应用程序的基本信息,如应用程序的名称、图标、版本号、权限、组件(Activity、Service、BroadcastReceiver、Content Provider)等等。在应用程序运行时,系统会根据这个文件来管理应用程序的生命周期,启动和关闭应用程序,管理应用程序的组件等等。 |
classes.dex | classes.dex是java源码编译后生成的java字节码文件,APK运行的主要逻辑 |
resources.arsc | 是 Android 系统中的一种特殊文件,它用来存放应用程序的资源表。资源表是一种二进制文件,它包含了应用程序的资源 ID 和资源类型的映射关系。 |
lib | armeabi-v7a基本通用所有android设备 arm64-v8a只适用于64位的android设备 x86常见用于android模拟器 x86-64目录适用于支持x86_64架构的Android设备 目录下的.so文件是c或c++编译的动态链接库文件 |
这里没找到lib文件,可能是该应用是纯Java/Kotlin
开发且没有使用任何特定于平台的代码。
AndriodManifest.xml
有效元素 | 作用 |
---|---|
<action> |
向 Intent 过滤器添加操作。 |
<activity> |
声明 Activity 组件。 |
<activity-alias> |
声明 Activity 的别名。 |
<application> |
应用的声明。 |
<category> |
向 Intent 过滤器添加类别名称。 |
<compatible-screens> |
指定与应用兼容的每个屏幕配置。 |
<data> |
向 Intent 过滤器添加数据规范。 |
<grant-uri-permission> |
指定父级内容提供程序有权访问的应用数据的子集。 |
<instrumentation> |
声明支持您监控应用与系统进行交互的 Instrumentation 类。 |
<intent-filter> |
指定 Activity、服务或广播接收器可以响应的 Intent 类型。 |
<manifest> |
AndroidManifest.xml 文件的根元素。 |
<meta-data> |
可以提供给父级组件的其他任意数据项的名称-值对。 |
<path-permission> |
定义内容提供程序中特定数据子集的路径和所需权限。 |
<permission> |
声明安全权限,可用于限制对此应用或其他应用的特定组件或功能的访问。 |
<permission-group> |
为相关权限的逻辑分组声明名称。 |
<permission-tree> |
声明权限树的基本名称。 |
<provider> |
声明内容提供程序组件。 |
<receiver> |
声明广播接收器组件。 |
<service> |
声明服务组件。 |
<supports-gl-texture> |
声明应用支持的一种 GL 纹理压缩格式。 |
<supports-screens> |
声明应用支持的屏幕尺寸,并为大于此尺寸的屏幕启用屏幕兼容模式。 |
<uses-configuration> |
指明应用要求的特定输入功能。 |
<uses-feature> |
声明应用使用的单个硬件或软件功能。 |
<uses-library> |
指定应用必须链接到的共享库。 |
<uses-permission> |
指定为使应用正常运行,用户必须授予的系统权限。 |
<uses-permission-sdk-23> |
指明应用需要特定权限,但仅当应用在运行 Android 6.0(API 级别 23)或更高版本的设备上安装时才需要。 |
<uses-sdk> |
您可以通过整数形式的 API 级别,表示应用与一个或多个版本的 Android 平台的兼容性。 |
参考代码:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1"
android:versionName="1.0"
package="com.example.myapp">
<!-- Beware that these values are overridden by the build.gradle file -->
<uses-sdk android:minSdkVersion="15" android:targetSdkVersion="26" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<!-- This name is resolved to com.example.myapp.MainActivity
based upon the package attribute -->
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".DisplayMessageActivity"
android:parentActivityName=".MainActivity" />
</application>
</manifest>
res
res子目录 | 存储的资源类型 |
---|---|
animator/ |
用于定义属性动画的 XML 文件。 |
anim/ |
用于定义补间动画的 XML 文件。属性动画也可保存在此目录中,但为了区分这两种类型,属性动画首选 animator/ 目录。 |
color/ |
定义颜色状态列表的 XML 文件。如需了解详情,请参阅颜色状态列表资源。 |
drawable/ |
位图文件(PNG、.9.png 、JPG 或 GIF)或编译为以下可绘制资源子类型的 XML 文件:位图文件九宫图(可调整大小的位图)状态列表形状动画可绘制对象其他可绘制对象如需了解详情,请参阅可绘制资源。 |
mipmap/ |
适用于不同启动器图标密度的可绘制对象文件。如需详细了解如何使用 mipmap/ 文件夹管理启动器图标,请参阅将应用图标放在 mipmap 目录中。 |
layout/ |
用于定义界面布局的 XML 文件。如需了解详情,请参阅布局资源。 |
menu/ |
用于定义应用菜单(例如选项菜单、上下文菜单或子菜单)的 XML 文件。如需了解详情,请参阅菜单资源。 |
raw/ |
需以原始形式保存的任意文件。如要使用原始 InputStream 打开这些资源,请使用资源 ID(即 R.raw.*filename* )调用 Resources.openRawResource() 。但是,如需访问原始文件名和文件层次结构,请考虑将资源保存在 assets/ 目录(而非 res/raw/ )下。assets/ 中的文件没有资源 ID,因此您只能使用 AssetManager 读取这些文件。 |
values/ |
包含字符串、整数和颜色等简单值的 XML 文件。其他 res/ 子目录中的 XML 资源文件会根据 XML 文件名定义单个资源,而 values/ 目录中的文件可描述多个资源。对于此目录中的文件,<resources> 元素的每个子元素均会定义一个资源。例如,<string> 元素会创建 R.string 资源,<color> 元素会创建 R.color 资源。由于每个资源均使用自己的 XML 元素进行定义,因此您可以随意命名文件,并在某个文件中放入不同的资源类型。但是,您可能需要将独特的资源类型放在不同的文件中,使其一目了然。例如,对于可在此目录中创建的资源,下面给出了相应的文件名约定:arrays.xml 用于资源数组(类型化数组)colors.xml 用于颜色值dimens.xml 用于维度值strings.xml 用于字符串值styles.xml 用于样式如需了解详情,请参阅字符串资源、样式资源和更多资源类型。 |
xml/ |
可在运行时通过调用 Resources.getXML() 读取的任意 XML 文件。各种 XML 配置文件(例如搜索配置)都必须保存在此处。 |
font/ |
带有扩展名的字体文件(例如 TTF、OTF 或 TTC),或包含 <font-family> 元素的 XML 文件。如需详细了解以资源形式使用的字体,请参阅将字体添加为 XML 资源。 |