• android recovery代码修改之原生建议


     我们都知道recovery升级的时候,是根据升级脚本updater-script里面的函数,去一步步执行的,比如mountformat等相关的操作,有时候我们需要增加一些自己特殊的更新的接口,这时候就可能需要再单独封装一个函数接口,我所知道的,绝大多数的开发者,都是直接在bootable/recovery/updater/install.cpp里面的RegisterInstallFunctions里面,直接注册一个函数,这样功能上面是实现了,但是修改上面并不规范。

     

        其实google给我们预留了自定义函数的接口,我们只需要按照要求就可以增加我们自己封装的函数接口,又不改动原生的代码。这个接口就是RegisterDeviceExtensions();在其他的一些博客中,看到的有关这个的描述很少,基本上都是一笔带过。

     

        RegisterDeviceExtensions():与设备相关的额外添加項,在源码中并没有任何实现。

        其实这个说法是错误的,RegisterDeviceExtensions()就是google预留的接口,我们来追寻下这个函数的一些逻辑流程。

        首先我们来找找RegisterDeviceExtensions()的定义在哪里,我们发现bootable/recovery/updater/updater.cpp里面有个文件包含:

    // Generated by the makefile, this function defines the
    // RegisterDeviceExtensions() function, which calls all the
    // registration functions for device-specific extensions.
    #include "register.inc"

        我们通过注释,发现了这个register.inc是跟RegisterDeviceExtensions()函数定义有关的,我们在out目录下find下,发现了register.inc这个文件,打开这个文件,发现是个空的函数定义(obj/PACKAGING/updater_extensions_intermediates/register.inc)

     

    void RegisterDeviceExtensions() {
    }

        我们发现bootable/recovery/updater下面的Android.mk也有RegisterDeviceExtensions()相关的定义实现:

     

    $(inc) : libs := $(TARGET_RECOVERY_UPDATER_LIBS)
    $(inc) : $(inc_dep_file)
    	$(hide) mkdir -p $(dir $@)
    	$(hide) echo "" > $@
    	$(hide) $(foreach lib,$(libs),echo "extern void Register_$(lib)(void);" >> $@;)
    	$(hide) echo "void RegisterDeviceExtensions() {" >> $@
    	$(hide) $(foreach lib,$(libs),echo "  Register_$(lib)();" >> $@;)
    	$(hide) echo "}" >> $@

        我们发现register.inc就是在这里生成的,如果定义了TARGET_RECOVERY_UPDATER_LIBS这个变量,那么就会在RegisterDeviceExtensions()调用这个变量的注册函数Register_$(lib)()

        视乎有些明白了,我们把自己需要的增加的函数接口生成一个库updater_lib1,然后把这个库定义成updater的依赖库,updater_lib1里面的api定义为Register_updater_lib1(),那么这个注册函数Register_updater_lib1()就会被RegisterDeviceExtensions()调用,而RegisterDeviceExtensions()就跟原生的RegisterInstallFunctions()一样了。

    现在我们重新来理一下思路

        我们把需要增加的函数(write_logo_image)的实现封装在一个库update_lib1里面,这个库update_lib1里面有个注册函数Register_updater_lib1()去注册write_logo_image

    Value* WriteLogoImageFn(const char* name, State* state, int argc, Expr* argv[]) {
    }
    void Register_updater_lib1() {
        RegisterFunction("write_logo_image", WriteLogoImageFn);
    }

        然后把updater_lib1作为updater的依赖:

    TARGET_RECOVERY_UPDATER_LIBS := updater_lib1

        这样register.inc即为:

    extern void Register_updater_lib1(void);
    void RegisterDeviceExtensions() {
      Register_updater_lib1();
    }

        调用RegisterDeviceExtensions()即为注册自定义的安装函数接口。

        通过上述方法修改,直接不用修改bootable/recovery/updater下面的任何代码,就可以增加我们需要的函数接口,尽量保证不修改google原生的代码。

  • 相关阅读:
    Tomcat下bootstrap启动分析
    Ubuntu读取/root/.profile时发现错误:mesg:ttyname fa
    【转载】Activiti delete process definition by key
    Ubuntu16解锁root
    Activiti源码:ActivitiEventSupport类中eventListeners的设计
    [转载] Activiti Tenant Id 字段释疑
    Linux下使用NTFS格式移动硬盘
    Linux dd命令制作U盘启动盘
    Activiti源码:StandaloneInMemProcessEngineConfiguration与SpringProcessEngineConfiguration
    Activiti源码学习:ExecutionListener与TaskListener的区别
  • 原文地址:https://www.cnblogs.com/codeking100/p/10338564.html
Copyright © 2020-2023  润新知