系统恢复分析
编者:厦门大学信息学院通信工程系2015级研究生 韩国安、李文聪、蔡志标
源码目录位置:bdk/bootable/recovery/
1、recovery目录结构分析
recovery包含很多个文件夹:
表1.1 主要目录的意义如下表所示:
目录 | 意义 |
---|---|
Applypatch | 文件夹是应用补丁 |
Edify | 是类似android系统用来运行updater-scripts(刷机脚本)的Edify语言 |
Etc | 是保存系统的配置文件 |
Fonts | 系统字体文件 |
Minadbd | 在android中使用mina框架处理socket通信方法 |
adb | 本身是一个客户端 |
Minui | 在recovery的UI显示部分应用层调用minui库实现了图形的描绘以及固定大小的文字显示 |
Minzip | 提供简单的Zip文件支持 |
Mtdutils | 是mtd-utils工具如使用mtd-util工具向nand flash写入文件系统jffs2.img |
Otafault | 默认的OTA升级是指系统提供的标准软件升级方式 |
res-560dpi、res-hdpi、res-mdpi、res-xhdpi、res-xxhdpi、res-xxhdpi | 不同像素的图片资源 |
Tests | 测试文件 |
Tools | 工具包 |
Uncrypt | 在系统recovery时如果系统是加密的就解密 |
Updater | 在recovery中使用updater脚本来完成升级 |
update_verifier | 更新认证 |
update_verifier | 是操作系统内核运行之前运行的可以初始化硬件设备建立内存空间映射图从而将系统的软硬件环境带到一个合适状态以便最终调用操作系统内核 |
2.recovery目录下Andriod.mk文件分析
LOCAL_PATH := $(call my-dir)
%Android.mk开始必须定义变量LOCAL_PATH它用来指定源文件的位置。my‐dir: 编译系统提供的'my‐dir'宏函数,被用来获取当前的目录。
%首先创建一个名为libfusesideload的第一个模块,代码如下:
include $(CLEAR_VARS)
%编译系统提供CLEAR_VARS变量,它指向了一个用来清除LOCAL_XXX开头的变量(例如LOCAL_MODULE, LOCAL_SRC_FILES但是LOCAL_PATH除外)的makefile文件,需要它的原因是整个的编译上下文中,所有的变量都是全局的,这样就可以保证这些变量只在局部范围内起作用。
LOCAL_SRC_FILES := fuse_sideload.cpp
%LOCAL_SRC_FILES必须包含一系列的C/C++源文件,它将会被建立和装载到模块中。在该代码将源文件fuse_sideload.cpp建立并装载到模块中。
LOCAL_CLANG := true
%启用clang编译器
LOCAL_CFLAGS := -O2 -g -DADB_HOST=0 -Wall -Wno-unused-parameter
LOCAL_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE
%LOCAL_CFLAGS为C编译器传递额外的参数,例如该代码中的-g表示生成调试信息,其他的gcc命令读者可自行查阅相关文献
LOCAL_MODULE := libfusesideload
%创建一个LOCAL_MODULE,MODULE名字必须是唯一的并且不包含任何的空格,编译系统将自动的修改生成文件的前缀和后缀,该代码创建了一个名为libfusesideload的LOCAL_MODULE。
LOCAL_STATIC_LIBRARIES := libcutils libc libmincrypt
%LOCAL_STATIC_LIBRARIES的作用是链接进来静态库的模块,后面跟着的是需要加进来的静态库的模块的名称,而不是静态库的名称,该代码的作用是将libcutils,libc以及libmincrypt三个静态库模块链接进来。
include $(BUILD_STATIC_LIBRARY)
%BUILD_STATIC_LIBRARY是编译系统提供的变量,指向一个GNU Makefile脚本,负责收集自从上次调用'include $(CLEAR_VARS)'以来,定义在LOCAL_XXX变量中的所有信息,并且决定编译什么,如何正确地去做,并根据其规则生成静态库。
%至此完成模块libfusesideload的创建
%接下来创建名为recovery的第二个模块
include $(CLEAR_VARS)
%再次重置除LOCAL_PATH外的以开头LOCAL_XXX的变量,以便接下进行新的赋值。
LOCAL_SRC_FILES := \
adb_install.cpp \
asn1_decoder.cpp \
bootloader.cpp \
device.cpp \
fuse_sdcard_provider.cpp \
install.cpp \
recovery.cpp \
roots.cpp \
screen_ui.cpp \
ui.cpp \
verifier.cpp \
wear_ui.cpp \
%将以上的.cpp源文件建立并装载到模块中。
LOCAL_MODULE := recovery
%创建名为recovery的LOCAL_MODULE
LOCAL_FORCE_STATIC_EXECUTABLE := true
%LOCAL_FORCE_STATIC_EXECUTABLE作用:如果编译时候需要链接的动态库存在静态库形式,那么在这个编译变量等于true的情况下,将会链接到对应的静态库而不是动态库,这个只有文件系统中/sbin目录下的应用程序会用到。
ifeq ($(TARGET_USERIMAGES_USE_F2FS),true)
ifeq ($(HOST_OS),linux)
LOCAL_REQUIRED_MODULES := mkfs.f2fs
endif
endif
%判断TARGET_USERIMAGES_USE_F2FS是否是ture以及HOST_os是否为linux,如果二者都满足这将LOCAL_REQUIRED_MODULES设置为mkfs.f2fs。LOCAL_REQUIRED_MODULES的作用在于指定模块运行所依赖的模块,即在加载本模块是同步加载mkfs.f2fs模块
RECOVERY_API_VERSION := 3
RECOVERY_FSTAB_VERSION := 2
%设置RECOVERY_API以及RECOVERY_FSTAB的版本号
LOCAL_CFLAGS += -DRECOVERY_API_VERSION=$(RECOVERY_API_VERSION)
LOCAL_CFLAGS += -Wno-unused-parameter
LOCAL_CLANG := true
%启用clang编译器,为C编译器传递额外的参数
LOCAL_C_INCLUDES += \
system/vold \
system/extras/ext4_utils \
system/core/adb \
%LOCAL_C_INCLUDES作用为添加额外的C/C++编译头文件路径,该代码添加了三个路径:system/vold,system/extras/ext4_utils以及system/core/adb
LOCAL_STATIC_LIBRARIES := \
libbatterymonitor \
libext4_utils_static \
libsparse_static \
libminzip \
libz \
libmtdutils \
libmincrypt \
libminadbd \
libfusesideload \
libminui \
libpng \
libfs_mgr \
libbase \
libcutils \
libutils \
liblog \
libselinux \
libm \
libc
%将以上列出的静态库模块链接进来
LOCAL_HAL_STATIC_LIBRARIES := libhealthd
ifeq ($(TARGET_USERIMAGES_USE_EXT4), true)
LOCAL_CFLAGS += -DUSE_EXT4
LOCAL_C_INCLUDES += system/extras/ext4_utils
LOCAL_STATIC_LIBRARIES += libext4_utils_static libz
endif
%判断$(TARGET_USERIMAGES_USE_EXT4)是否为ture,如果是则在C编译器中传入-DUSE_EXT4参数,添加C/C++编译头文件路径system/extras/ext4_utils,链接静态库的libext4_utils_static以及libz模块
LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
%LOCAL_MODULE_PATH作用是指定模块的生成路径为$(TARGET_RECOVERY_ROOT_OUT)/sbin
ifeq ($(TARGET_RECOVERY_UI_LIB),)
LOCAL_SRC_FILES += default_device.cpp
else
LOCAL_STATIC_LIBRARIES += $(TARGET_RECOVERY_UI_LIB)
endif
%判断$(TARGET_RECOVERY_UI_LIB),如果符合条件将default_device.cpp添加到模块中,反之,将静态库模块$(TARGET_RECOVERY_UI_LIB)链接进来
include $(BUILD_EXECUTABLE)
%生成静态库,至此完成名为recovery的第二个模块的创建
%创建名为libverifier的第三个模块
include $(CLEAR_VARS)
%重置除LOCAL_PATH外的以开头LOCAL_XXX的变量,以便接下进行新的赋值。
LOCAL_CLANG := true
%启用clang编译器
LOCAL_MODULE := libverifier
%创建名为libverifier的LOCAL_MODULE
LOCAL_MODULE_TAGS := tests
%添加该模块的标记为
LOCAL_SRC_FILES := \
asn1_decoder.cpp \
verifier.cpp \
ui.cpp
%将以上的.cpp源文件tests建立并装载到模块中。
include $(BUILD_STATIC_LIBRARY)
%生成静态库,至此完成名为libverifier的第三个模块的创建
%导入所有指定目录下的Android.mk文件
include $(LOCAL_PATH)/minui/Android.mk \
$(LOCAL_PATH)/minzip/Android.mk \
$(LOCAL_PATH)/minadbd/Android.mk \
$(LOCAL_PATH)/mtdutils/Android.mk \
$(LOCAL_PATH)/tests/Android.mk \
$(LOCAL_PATH)/tools/Android.mk \
$(LOCAL_PATH)/edify/Android.mk \
$(LOCAL_PATH)/uncrypt/Android.mk \
$(LOCAL_PATH)/otafault/Android.mk \
$(LOCAL_PATH)/updater/Android.mk \
$(LOCAL_PATH)/update_verifier/Android.mk \
$(LOCAL_PATH)/applypatch/Android.mk