android JNI库实现reboot,recovery[通俗易懂]

android JNI库实现reboot,recovery

大家好,又见面了,我是全栈君。

1、recovery函数:

#define	UPDATE_TITLE			"--update_package="
#define UPDATE_COMMAND_FILE		"/cache/recovery/command"
#define UPDATE_FLAG_FILE		"/cache/recovery/last_flag"
#define LAST_INSTALL_FILE		"/cache/recovery/last_install"
#define LAST_LOG_FILE			"/cache/recovery/last_log"
#define LAST_LOCALE_FILE		"/cache/recovery/last_locale"

#define printf 	ALOGD

int factory_data_reset(void)
{
	char data[] = {"--wipe_data\n--locale=en_US\n"};
	int len = 0, fd;

	printf("[%s]command:%s\n", __FUNCTION__, data);
	
	fd = open(UPDATE_COMMAND_FILE, O_RDWR|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR);
	if (fd < 0)
	{
		printf("[%s]creat command file failed\n", __FUNCTION__);
		return -3;
	}
	len = strlen(data);
	if (write(fd, data, len) != len)
	{
		printf("[%s]write command file failed\n", __FUNCTION__);
		close(fd);
		return -4;
	}
	close(fd);

	//delete last_install,last_log
	if (remove(LAST_INSTALL_FILE) != 0)
		printf("[%s]remove last_install failed\n", __FUNCTION__);

	if (remove(LAST_LOG_FILE) != 0)
		printf("[%s]remove last_log failed\n", __FUNCTION__);
		
	if (remove(LAST_LOCALE_FILE) != 0)
		printf("[%s]remove last_locale failed\n", __FUNCTION__);

	sync();

	//reboot to recovery
	__reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART2, (void*) "recovery");//这句须要root权限!
	printf("[%s]reboot failed\n", __FUNCTION__);
	return -7;
}

2、OTA升级函数

int install_ota_package(char const * package_file, int use_fuse)
{
	char *path = NULL;
	int len = 0, size, fd;
	
	len = strlen(package_file);
	if (len <= 0)
	{
		printf("[%s]strlen(package_file)=%d\n", __FUNCTION__, len);
		return -1;
	}
	
	path = (char*)malloc(len+24+3);
	if (path == 0)
	{
		printf("[%s]malloc failed\n", __FUNCTION__);
		return -2;
	}
	
	//UPDATE_COMMAND_FILE
	memset(path, 0, len+24+3);
	if (use_fuse)//(strncmp(package_file, "/vtfuse", 7) != 0)
	{
		strcpy(path, "--update_package=/vtfuse");
		strcpy(&path[24], package_file);
		strcpy(&path[24+len], "\n");
	}
	else
	{
		strcpy(path, "--update_package=");
		strcpy(&path[17], package_file);
		strcpy(&path[17+len], "\n");
	}
	printf("[%s]command:%s\n", __FUNCTION__, path);
	
	fd = open(UPDATE_COMMAND_FILE, O_RDWR|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR);
	if (fd < 0)
	{
		printf("[%s]creat command file failed\n", __FUNCTION__);
		free(path);
		return -3;
	}
	size = strlen(path);
	if (write(fd, path, size) != size)
	{
		printf("[%s]write command file failed\n", __FUNCTION__);
		free(path);
		close(fd);
		return -4;
	}
	close(fd);
	
	//UPDATE_FLAG_FILE
	memset(path, 0, len+24+3);
	if (use_fuse)//(strncmp(package_file, "/vtfuse", 7) != 0)
	{
		strcpy(path, "updating$path=/vtfuse");
		strcpy(&path[21], package_file);
		strcpy(&path[21+len], "\n");
	}
	else
	{
		strcpy(path, "updating$path=");
		strcpy(&path[14], package_file);
		strcpy(&path[14+len], "\n");
	}
	printf("[%s]last_flag:%s\n", __FUNCTION__, path);
	
	fd = open(UPDATE_FLAG_FILE, O_RDWR|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR);
	if (fd < 0)
	{
		printf("[%s]creat last_flag file failed\n", __FUNCTION__);
		free(path);
		return -5;
	}
	size = strlen(path);
	if (write(fd, path, size) != size)
	{
		printf("[%s]write last_flag file failed\n", __FUNCTION__);
		free(path);
		close(fd);
		return -6;
	}
	close(fd);
	
	//delete last_install,last_log
	if (remove(LAST_INSTALL_FILE) != 0)
		printf("[%s]remove last_install failed\n", __FUNCTION__);

	if (remove(LAST_LOG_FILE) != 0)
		printf("[%s]remove last_log failed\n", __FUNCTION__);

	sync();
	free(path);
	
	//reboot to recovery
	__reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART2, (void*) "recovery");//相同须要root权限
	printf("[%s]reboot failed\n", __FUNCTION__);
	return -7;
}


3、事实上上面两个函数假设编译成exe在root下执行确实能够实现recovery和OTA升级。怎样在jni或者apk中掉用和实现了?

3.1 apk申请system权限,须要签名或者在源代码中编译!


3.2 apk是无法直接获取到root权限的,最多system权限,因此我们能够採service!

參考:http://blog.chinaunix.net/uid-12348673-id-3030823.html


3.3 将上面的函数写两个应用。编译后放在/system/bin/下,这样我们就可以在jni中或apk中去开启service:

init.rc中:

 servicerecovery /system/bin/recovery

 disabled


apk: SystemProperties.set(“ctl.start”“recovery”);



jni: property_set(“ctl.start”“recovery”);


3.4这样就能够实现recovery,OTA了!


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115856.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • css怎么设置注释快捷键,html中注释的快捷键是

    css怎么设置注释快捷键,html中注释的快捷键是html中注释的快捷键是command或ctrl+/超文本标记语言(HyperTextMarkupLanguage),标准通用标记语言下的一个应用。HTML不是一种编程语言,而是一种标记语言(markuplanguage),是网页制作所必备的。“超文本”就是指页面内可以包含图片、链接,甚至音乐、程序等非文字元素。超文本标记语言(或超文本标签语言)的结构包括“头”部分、和“主体”部分,其中“…

    2022年6月9日
    60
  • 基于情感词典的情感分析流程图_情感的解释

    基于情感词典的情感分析流程图_情感的解释思路以及代码都来源于下面两篇文章:一个不知死活的胖子:Python做文本情感分析之情感极性分析 RanFengzheng的博客:基于情感词典的文本情感极性分析相关代码基于情感词典的情感分析应该是最简单的情感分析方法了,大致说一下使用情感词典进行情感分析的思路:对文档分词,找出文档中的情感词、否定词以及程度副词,然后判断每个情感词之前是否有否定词及程度副词,将它之前的否定词和程度副词划分为一个组…

    2022年8月23日
    8
  • awstats 配置「建议收藏」

    awstats 配置「建议收藏」awstats一、首先修改httpd.conf  httpd-vhost.conf把log模式由common改成combinedvi/usr/local/apache2/conf/httpd.confvi/usr/local/apache2/conf/extra/httpd-vhost.conf/usr/local/apache2/bin/apachectlrestart二、安装Geo-…

    2022年7月16日
    13
  • 宝塔免费ssl_十四运小程序

    宝塔免费ssl_十四运小程序首先声明我也不是什么大佬,只是坑踩多了有经验了而已,看了无数大佬的文章教程,研究了大佬们的Github仓库说明,在此记录,方便自己,也方便大家,各位的点赞、收藏、关注是我持续更新的动力,写的内容也越来越多,如有侵权请私信我删除相关内容

    2022年10月14日
    3
  • Stack overflow at line 解决办法(重复引入JS导致)

    Stack overflow at line 解决办法(重复引入JS导致)这几天碰到了个莫名其妙的问题,我在一个TR的onDblClick事件里写了一个window.open(XXX);可是每当我双击这一行的时候总是给我报Stackoverflowatline7这个错误,在网上找了很多方法都不行,后来查看源文件发现我把一个外部JS引入了2次,我本身的jsp引入的一次,我每个jsp都会去引入一个公共的jsp,在公共jsp里面我又引入了一次。后来我把本身的jsp引入

    2022年7月15日
    13
  • 精馏装置流程图_枪的构造原理

    精馏装置流程图_枪的构造原理1.什么是CA证书。看过一些博客,写的比较形象具体。◇普通的介绍信想必大伙儿都听说过介绍信的例子吧?假设A公司的张三先生要到B公司去拜访,但是B公司的所有人都不认识他,他咋办捏?常

    2022年8月3日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号