zoukankan      html  css  js  c++  java
  • 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原生的代码。

  • 相关阅读:
    DRUPAL-PSA-CORE-2014-005 && CVE-2014-3704 Drupal 7.31 SQL Injection Vulnerability /includes/database/database.inc Analysis
    WDCP(WDlinux Control Panel) mysql/add_user.php、mysql/add_db.php Authentication Loss
    Penetration Testing、Security Testing、Automation Testing
    Tomcat Server Configuration Automation Reinforcement
    Xcon2014 && Geekpwn2014
    phpMyadmin /scripts/setup.php Remote Code Injection && Execution CVE-2009-1151
    Linux System Log Collection、Log Integration、Log Analysis System Building Learning
    The Linux Process Principle,NameSpace, PID、TID、PGID、PPID、SID、TID、TTY
    Windows Management Instrumentation WMI Security Technology Learning
    IIS FTP Server Anonymous Writeable Reinforcement, WEBDAV Anonymous Writeable Reinforcement(undone)
  • 原文地址:https://www.cnblogs.com/codeking100/p/10338564.html
Copyright © 2011-2022 走看看