android recovery代码修改之原生建议
我们都知道recovery升级的时候,是根据升级脚本updater-script里面的函数,去一步步执行的,比如mount,format等相关的操作,有时候我们需要增加一些自己特殊的更新的接口,这时候就可能需要再单独封装一个函数接口,我所知道的,绝大多数的开发者,都是直接在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原生的代码。
android recovery代码修改之原生建议的更多相关文章
- Android:用代码修改一行文字中某几个字的颜色
TextView changeVideoQualityTxt = (TextView) rootView.findViewById(R.id.enter_wireless_display_txt); ...
- android recovery 系统代码分析 -- 选择进入【转】
本文转载自:http://blog.csdn.net/andyhuabing/article/details/9226569 最近做Recovery的规范及操作指导文档,花了一些时间将流程搞清. An ...
- Android之vector代码修改颜色
前言:google给了很多material design icon,在开发过程中,可以下载下来直接使用,下载地址为https://materialdesignicons.com/ . 1.下载图标,并 ...
- 修改Android 4.2.2的原生Camera引出的java.lang.UnsatisfiedLinkError: Native method not found,及解决方法
修改Android 4.2.2的原生Camera应用,做一些定制,将Camera的包名从之前的 package com.android.* 修改成了com.zhao3546.*. 调整后,应用可以正常 ...
- 给Android程序员的六个建议
给Android程序员的六个建议 分类: 安卓相关2015-07-14 23:58 177人阅读 评论(0) 收藏 举报 android程序员 如果你一年前写的代码 , 在现在看来你还感觉写的很不错 ...
- Android Stuido代码混淆
一.Android Studio 代码混淆基本配置首先我们要在build.gradle里设置 miifyEnabled 里改为true,表示可以混淆 proguardFiles getDefaultP ...
- 移动开发:美团外卖Android Lint代码检查实践
概述 Lint是Google提供的Android静态代码检查工具,可以扫描并发现代码中潜在的问题,提醒开发人员及早修正,提高代码质量.除了Android原生提供的几百个Lint规则,还可以开发自定义L ...
- Android Studio 代码混淆(你真的会混淆吗)
一.前言 今天要打包新产品,突然忘了混淆的参数是怎么写的了,虽然之前也混淆过,可是具体配置的参数代码有些记不起来了,因此决定花点时间写篇博客记录一下,方便以后查找和自己的记忆. 二.Android S ...
- Android开发代码规范(转)
Android开发代码规范 1.命名基本原则 在面向对象编程中,对于类,对象,方法,变量等方面的命名是非常有技巧的.比如,大小写的区分,使用不同字母开头等等.但究其本,追其源,在为一个资源其名称 ...
随机推荐
- Ubuntu 18.0.4安装Mongodb
2.21更新: 安装后本地通过robo 3T连接正常,但是其它机器通过IP连接时报错,继续查找,解决方案在这里(传送门),原因是mongodb安装完成后默认监听本地地址,也就是127.0.0.1,这样 ...
- laravel5.5 __construct函数 无法使用session() 解决方法和实例
从网上查询资料得知,在laravel中使用__construct方法的时候,session还没开启,此时就需要用到中间件来解决. $this->middleware(function ($req ...
- Linux学习笔记之二————Linux系统的文件和目录
一.Windows和Linux文件系统区别 1.在 windows 平台下,打开“计算机”,我们看到的是一个个的驱动器盘符: 每个驱动器都有自己的根目录结构,这样形成了多个树并列的情形,如图所示: ...
- 课程四(Convolutional Neural Networks),第一周(Foundations of Convolutional Neural Networks) —— 1.Practice questions:The basics of ConvNets
[解释] 100*(300*300*3)+ 100=27000100 [解释] (5*5*3+1)*100=7600 [中文翻译] 您有一个输入是 63x63x16, 并 将他与32个滤波器卷积, 每 ...
- EL表达式报错: According to TLD or attribute directive in tag file, attribute value does not accept any expressions
EL表达式报错: According to TLD or attribute directive in tag file, attribute value does not accept any ex ...
- Python学习的路上,Anaconda送你一双遮天神翼
一.背景 最近在学习python,发现在本地搭建python环境的时候,要是想要同时搭建不同python版本的环境,就比较麻烦,很容易就出现冲突了,很是头疼.然后光明就出现这山重水复疑无路的时候, ...
- 从零开始学 Web 之 DOM(一)DOM的概念,对标签操作
大家好,这里是「 Daotin的梦呓 」从零开始学 Web 系列教程.此文首发于「 Daotin的梦呓 」公众号,欢迎大家订阅关注.在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识 ...
- Java并发编程之synchronized关键字
整理一下synchronized关键字相关的知识点. 在多线程并发编程中synchronized扮演着相当重要的角色,synchronized关键字是用来控制线程同步的,可以保证在同一个时刻,只有一个 ...
- iOS开发(1):设置APP的图标与启动图 | iOS图标的尺寸 | LaunchScreen的使用
每个APP都应该有自己的图标跟启动图. 这里介绍怎么设置iOS的APP的图标跟启动图. (1)图标 小程的xcode是10.0版本,设置图标的入口如下: 点击入口后,进到设置页面,如下: 可以看到有很 ...
- xmldocument内嵌入另一个xmldocument,xmlnode的方法
string xmlstr1 = @"<root><head>myHead</head><body></body></roo ...