4.1 Android开发基础
4.1.1 Android四大组件
Android应用程序包括以下4个核心组件。
①Activity:面向用户的应用组件或者用户操作的可视化界面,基于Activity基类,底层由ActivityManager统一管理,也负责处理应用内或应用间发送的Intent消息。
②Broadcast Receiver:接受并过滤广播消息的组件,应用想显示的接收广播消息,需在Manifest清单文件中注册一个receiver,用Intent filter过滤特定类型的广播消息,见图4-1-1。应用内也可以通过registerReceiver在运行时动态注册。
图4-1-1
③Service:通常用于处理后台耗时逻辑。用户不直接与Service对应的应用进程交互。与其他Android应用组件一样,Service也可以通过IPC机制接收和发送Intent。
使用Service必须在Manifest清单文件中注册,见图4-1-2。Service可以通过Intent进行启动、停止和绑定。
④Content Provider:应用程序间数据共享的组件。如ContactsProvider(联系人提供者)对联系人信息统一管理,可以被其他应用(申请权限之后)访问,应用还可以创建自己的Content Provider,并且把自身数据暴露给其他应用。
图4-1-2
4.1.2 APK文件结构
APK(Android application Package,Android应用程序包)文件通常包含以下文件和目录。
1.meta-inf目录
meta-inf目录包括如下文件。
❖ manifest.mf:清单文件。
❖ cert.rsa:应用签名文件。
❖ cert.sf:资源列表及对应的SHA-1签名。
2.lib目录
lib目录包括平台相关的库文件,可能包括以下文件。
❖ armeabi:所有ARM处理器相关文件。
❖ armeabi-v7a:ARMv7及以上处理器相关文件。
❖ arm64-v8a:所有ARMv8处理器下的arm64相关文件。
❖ x86:所有x86处理器相关文件。
❖ x86_64:所有x86_64处理器相关文件。
❖ mips:MIPS处理器相关文件。
3.res
res文件是没有编译至resources.arsc中的其他资源文件。
4.assets
assets文件是指能通过AssetManager访问到的资源文件。
5.AndroidManifest.xml
AndroidManifest.xml是Android组件清单文件,包含应用名字、版本、权限等信息,以二进制XML文件格式存储在APK文件中,能通过apktool、AXMLPrinter2等工具转换成XML明文格式文件。
6.classes.dex
classes.dex是Android运行时可执行文件。
7.resources.arsc
resources.arsc包含编译好的部分资源文件。
4.1.3 DEX文件格式
DEX是Dalvik VM executes的简称,即Android Dalvik可执行程序。DEX文件中包含该可执行程序的所有Java层代码。DEX经过压缩和优化,不仅能减小程序大小,还能加快类及方法的查找效率。DEX文件结构见图4-1-3。
图4-1-3
DEX文件的header部分包含了文件大小、校验值、各数据类型表的偏移和大小等数据。类型表有以下类型。
❖ string表:每个表项都指向一个string数据偏移。string数据由两部分组成,起始位置为uleb128算法编码的变长string长度,后面紧跟string的具体数据,由'\0'结尾。
❖ type表:存储各type在string表中的索引。
❖ proto表:每项包含3个元素,分别为函数原型简写、返回类型索引、参数偏移,参数偏移处第一个元素类型为uint,表示参数个数。
❖ field表:每个表项用3个元素描述了一个变量,分别为该变量所属的类、该变量所属的类型、该变量的名字。
❖ method表:每个表项用3个元素来描述一个函数,分别为该函数所属的类、该函数的函数原型、该函数的名字。
❖ class表:每个表项用8个元素来描述一个类,分别为类名、类属性access flag、父类偏移、接口偏移、源文件索引、类注释、类数据偏移、静态变量偏移。
❖ maps表:保存上述各表的大小和起始偏移,系统能够通过该表快速定位到各表。
4.1.4 Android APl
截止2019年5月,Android最新API级别为28,对应版本为Pie,每个大版本API都有较大的变化。在AndroidManifest.xml清单文件中,我们可以看到该应用最低支持的API版本及编译使用的API版本。Android官方API列表见图4-1-4。
图4-1-4
4.1.5 Android示例代码
Android编程语言为Java,但是从2017年5月的Google I/O大会开始,Android官方语言改为了Kotlin(基于JVM的编程语言),弥补了Java缺失的现代语言特性,简化了代码,使得开发者可以编写尽量少的代码。本章仍以原始Java代码为例,展示Android应用的基本代码。
Android应用的入口是onCreate函数:
AndoridManifest.xml文件包括该应用的入口、权限、可接受的参数。