最近尝试着修改Android P的编译脚本,目的是为了将系统源码和BSP源码分开编译。

由于厂家定制,Android内核的源码一般都在vendor目录下,本文尝试去掉vendor中的kernel源码,还能正常编译Android其他源码,便于做系统开发或者app发开,不依赖kernel源码编译。

相关源码:
build/make/core/Makefile
device/fsl/imx8q/mek_8q/AndroidBoard.mk
device/fsl/imx8q/mek_8q/BoardConfig.mk
device/fsl/common/build/dtbo.mk
system/core/fs_mgr/fs_mgr_avb.cpp
vendor\nxp-opensource\uboot-imx\lib\avb\libavb\avb_slot_verify.c
vendor\nxp-opensource\uboot-imx\lib\avb\libavb\avb_vbmeta_image.h

升级镜像文件包括:
boot.img
bootloader-imx8qm.img
bootloader-imx8qm-xen.img
dtbo-imx8qm.img
dtbo-imx8qm-xen.img
vendor.img
partition-table-28GB.img
system.img
spl-imx8qm.bin
libusb-1.0.dll
spl-imx8qm-xen.bin
u-boot-imx8qm-xen-dom0.imx
uuu.exe
uuu_imx_android_flash.bat
vbmeta-imx8qm.img
vbmeta-imx8qm-xen.img

device/fsl/imx8q/mek_8q/AndroidBoard.mk

AndroidBoard.mk中去掉kernel和uboot的编译脚本mk文件:

LOCAL_PATH := $(call my-dir)# build without kernel and uboot,rm by sunxiaolin 20191021#include device/fsl/common/build/kernel.mk#include device/fsl/common/build/uboot.mkinclude device/fsl/common/build/dtbo.mkinclude device/fsl/common/build/imx-recovery.mkinclude device/fsl/common/build/gpt.mkinclude $(LOCAL_PATH)/AndroidUboot.mkinclude $(FSL_PROPRIETARY_PATH)/fsl-proprietary/media-profile/media-profile.mkifneq ($(PRODUCT_IMX_CAR),true)include $(FSL_PROPRIETARY_PATH)/fsl-proprietary/sensor/fsl-sensor.mkendif

device/fsl/common/build/dtbo.mk

继续去掉dtbo的编译,因为dtbo.mk中包含了vbmeta-imx8qm.img的编译,而且vbmeta需要跟系统镜像system.img放在一起编译。dtbo-imx8qm.img则需要跟kernel,uboot部分一起编译。

1、去掉kernel_imx相关的编译内容
2、去掉dtboimage: $(BOARD_PREBUILT_DTBOIMAGE)相关的编译内容
3、修改vbmeta的编译内容,主要去掉

  • 去掉$(BOARD_PREBUILT_DTBOIMAGE)
  • 去掉DTBO_IMG=echo $(PRODUCT_OUT)/dtbo-$${DTS_PLATFORM}.img; \
  • 去掉RECOVERY_IMG=echo $(PRODUCT_OUT)/recovery-$${DTS_PLATFORM}.img; \
  • 去掉–include_descriptors_from_image $$DTBO_IMG \
  • 去掉–include_descriptors_from_image $$DTBO_IMG \
  • 去掉–include_descriptors_from_image $$RECOVERY_IMG \

device/fsl/imx8q/mek_8q/BoardConfig.mk

1、去掉所有vendor/目录的拷贝操作,例如:PRODUCT_COPY_FILES +=
device/fsl/imx8q/etc/wifi/fw_bcmdhd.bin:vendor/etc/wifi/fw_bcmdhd.bin
2、去掉所有KERNEL_OUT目录的拷贝操作,例如:

ifeq ($(PRODUCT_IMX_CAR_M4),true)BOARD_VENDOR_KERNEL_MODULES += \                            $(KERNEL_OUT)/drivers/hid/usbhid/usbhid.ko \
BOARD_RECOVERY_KERNEL_MODULES += \$(KERNEL_OUT)/drivers/gpu/drm/bridge/ds90ub947.ko \endif

build/make/core/Makefile

build/make/core/Makefile文件是整个Android编译的核心文件。

1、去掉boot.img部分的编译内容,例如:
#INSTALLED_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot.img
2、去掉vendor.img部分的编译内容。例如:
#BUILT_VENDORIMAGE_TARGET := $(PRODUCT_OUT)/vendor.img
3、去掉dtbo.img部分的编译内容。例如:
#INSTALLED_DTBOIMAGE_TARGET := $(PRODUCT_OUT)/dtbo.img
4、去掉avb校验,注释一下部分的代码:

#ifdef BOARD_AVB_BOOT_KEY_PATH#$(eval $(call check-and-set-avb-chain-args,BOOT))#else#INTERNAL_AVB_MAKE_VBMETA_IMAGE_ARGS += \#    --include_descriptors_from_image $(INSTALLED_BOOTIMAGE_TARGET)#endif

修改了以上这么多之后,系统可以分开编译过。

分开之后,Android系统打包升级Image包括:
partition-table-28GB.img
system.img
spl-imx8qm.bin
libusb-1.0.dll
spl-imx8qm-xen.bin
u-boot-imx8qm-xen-dom0.imx
uuu.exe
uuu_imx_android_flash.bat
vbmeta-imx8qm.img
vbmeta-imx8qm-xen.img

Android系统内核打包升级Image包括:
boot.img
bootloader-imx8qm.img
bootloader-imx8qm-xen.img
dtbo-imx8qm.img
dtbo-imx8qm-xen.img
vendor.img

使用uuu.exe工具进行正常升级,发现系统起不来,报错:

Read public key errorAVB TIPC client not initialized

vendor.img avb校验失败:
avb主要是bootloader的校验和vendor的校验,校验失败后系统启动不了。

avb校验

vendor\nxp-opensource\uboot-imx\lib\avb\libavb\avb_slot_verify.c
vendor\nxp-opensource\uboot-imx\lib\avb\libavb\avb_vbmeta_image.h

bootloader校验

avb_vbmeta_image.h中定义了

/* Flags for the vbmeta image. * * AVB_VBMETA_IMAGE_FLAGS_HASHTREE_DISABLED: If this flag is set, * hashtree image verification will be disabled. * * AVB_VBMETA_IMAGE_FLAGS_VERIFICATION_DISABLED: If this flag is set, * verification will be disabled and descriptors will not be parsed. */typedef enum {  AVB_VBMETA_IMAGE_FLAGS_HASHTREE_DISABLED = (1 << 0),  AVB_VBMETA_IMAGE_FLAGS_VERIFICATION_DISABLED = (1 << 1)} AvbVBMetaImageFlags;

位运算:
(1 << 0),即0x00000001
(1 << 1),即0x00000010

这两个flag分别表示是否使能dm-verity和verification功能,默认是会开启这两个验证功能。

禁止avb校验功能,即verification功能;禁止dm-verity

vendor\nxp-opensource\uboot-imx\lib\avb\libavb\avb_slot_verify.c

static AvbSlotVerifyResult load_and_verify_vbmeta({//省略一部分代码//.../* If verification has been disabled by setting a bit in the image, * we're done... except that we need to load the entirety of the * requested partitions. */ //修改vbmeta_header.flags标志为AVB_VBMETA_IMAGE_FLAGS_VERIFICATION_DISABLEDvbmeta_header.flags = AVB_VBMETA_IMAGE_FLAGS_VERIFICATION_DISABLED;if (vbmeta_header.flags & AVB_VBMETA_IMAGE_FLAGS_VERIFICATION_DISABLED) {  AvbSlotVerifyResult sub_ret;  avb_debugv(      full_partition_name, ": VERIFICATION_DISABLED bit is set.\n", NULL);  /* If load_requested_partitions() fail it is always a fatal   * failure (e.g. ERROR_INVALID_ARGUMENT, ERROR_OOM, etc.) rather   * than recoverable (e.g. one where result_should_continue()   * returns true) and we want to convey that error.   */  sub_ret = load_requested_partitions(      ops, requested_partitions, ab_suffix, slot_data);  if (sub_ret != AVB_SLOT_VERIFY_RESULT_OK) {    ret = sub_ret;  }  goto out;}//省略一部分代码//...     /* Compare the flags for top-level VBMeta struct with flags in     * the command-line descriptor so command-line snippets only     * intended for a certain mode (dm-verity enabled/disabled)     * are skipped if applicable.     */    apply_cmdline = true;     //修改toplevel_vbmeta_flags标志为AVB_VBMETA_IMAGE_FLAGS_HASHTREE_DISABLED    toplevel_vbmeta_flags = AVB_VBMETA_IMAGE_FLAGS_HASHTREE_DISABLED;    if (toplevel_vbmeta_flags & AVB_VBMETA_IMAGE_FLAGS_HASHTREE_DISABLED) {      if (kernel_cmdline_desc.flags &          AVB_KERNEL_CMDLINE_FLAGS_USE_ONLY_IF_HASHTREE_NOT_DISABLED) {        apply_cmdline = false;      }    } else {      if (kernel_cmdline_desc.flags &          AVB_KERNEL_CMDLINE_FLAGS_USE_ONLY_IF_HASHTREE_DISABLED) {        apply_cmdline = false;      }    }}
AvbSlotVerifyResult avb_slot_verify({//省略一部分代码//...    /* If verification is disabled, we are done ... we specifically     * don't want to add any androidboot.* options since verification     * is disabled.     */     //add by sunxiaolin 20191107     //修改toplevel_vbmeta.flags标志为AVB_VBMETA_IMAGE_FLAGS_VERIFICATION_DISABLED     toplevel_vbmeta.flags = (1 << 1);    if (toplevel_vbmeta.flags & AVB_VBMETA_IMAGE_FLAGS_VERIFICATION_DISABLED) {      /* Since verification is disabled we didn't process any       * descriptors and thus there's no cmdline... so set root= such       * that the system partition is mounted.       */      avb_assert(slot_data->cmdline == NULL);      slot_data->cmdline =          avb_strdup("root=PARTUUID=$(ANDROID_SYSTEM_PARTUUID)");      if (slot_data->cmdline == NULL) {        ret = AVB_SLOT_VERIFY_RESULT_ERROR_OOM;        goto fail;      }    } else {      /* Add options - any failure in avb_append_options() is either an       * I/O or OOM error.       */      AvbSlotVerifyResult sub_ret = avb_append_options(ops,                                                       slot_data,                                                       &toplevel_vbmeta,                                                       algorithm_type,                                                       hashtree_error_mode);      if (sub_ret != AVB_SLOT_VERIFY_RESULT_OK) {        ret = sub_ret;        goto fail;      }    }    //省略一部分代码//...}

禁止dm-verity还有一种方法,即在升级成功后,使用:
adb disable-verity
重启生效。

还需要修改vendor校验

vendor校验

system/core/fs_mgr/fs_mgr_avb.cpp

FsManagerAvbUniquePtr FsManagerAvbHandle::DoOpen(FsManagerAvbOps* avb_ops) {//省略一部分代码//...    // Checks whether FLAGS_VERIFICATION_DISABLED is set:    //   - Only the top-level vbmeta struct is read.    //   - vbmeta struct in other partitions are NOT processed, including AVB HASH descriptor(s)    //     and AVB HASHTREE descriptor(s).    AvbVBMetaImageHeader vbmeta_header;    avb_vbmeta_image_header_to_host_byte_order(        (AvbVBMetaImageHeader*)avb_handle->avb_slot_data_->vbmeta_images[0].vbmeta_data,        &vbmeta_header);    //将vbmeta_header.flags设置为:AVB_VBMETA_IMAGE_FLAGS_VERIFICATION_DISABLED    vbmeta_header.flags = AVB_VBMETA_IMAGE_FLAGS_VERIFICATION_DISABLED;    bool verification_disabled =        ((AvbVBMetaImageFlags)vbmeta_header.flags & AVB_VBMETA_IMAGE_FLAGS_VERIFICATION_DISABLED);    if (verification_disabled) {        avb_handle->status_ = kAvbHandleVerificationDisabled;    } else {        // Verifies vbmeta structs against the digest passed from bootloader in kernel cmdline.        std::unique_ptr<FsManagerAvbVerifier> avb_verifier = FsManagerAvbVerifier::Create();        if (!avb_verifier) {            LERROR << "Failed to create FsManagerAvbVerifier";            return nullptr;        }        if (!avb_verifier->VerifyVbmetaImages(*avb_handle->avb_slot_data_)) {            LERROR << "VerifyVbmetaImages failed";            return nullptr;        }        // Checks whether FLAGS_HASHTREE_DISABLED is set.        bool hashtree_disabled =            ((AvbVBMetaImageFlags)vbmeta_header.flags & AVB_VBMETA_IMAGE_FLAGS_HASHTREE_DISABLED);        if (hashtree_disabled) {            avb_handle->status_ = kAvbHandleHashtreeDisabled;        }    }//省略一部分代码//...}

更多相关文章

  1. Android(安卓)NDK安装
  2. 在Ubuntu上下载、编译和安装Android最新源码
  3. Android(安卓)NDK 编译过程中遇到错误 exception handling disab
  4. 【幻灯片分享】Android程序的编译,安装和运行 | 小米科技 汪文俊
  5. Android(安卓)系统编译与调试(zz)
  6. android源码的编译问题总结
  7. Android(安卓)中的拿来主义(编译,反编译,AXMLPrinter2,smali,baksm
  8. Android(安卓)studio 升级到4.0-4.0.1版本项目编译异常问题总结
  9. android5.0以后 framework 添加资源 编译 id can not find symbo

随机推荐

  1. Android(安卓)Studio如何轻松整理字符串
  2. [Android(安卓)特效] Android(安卓)通过
  3. 移动开发者大会.html5。Android。ios。wp
  4. android中怎样声明操作通话记录的权利
  5. android edittext的属性
  6. 完美解决隐藏Listview和RecyclerView去掉
  7. 横竖屏布局小技巧
  8. android与j2me移植之clipRect
  9. Android中的5种数据存储方式
  10. Android练习小项目时踩到的坑