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了!


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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 【032】JavaScript 计算笛卡尔积[通俗易懂]

    【032】JavaScript 计算笛卡尔积[通俗易懂]这是一个用JavaScript实现笛卡尔积的例子。注意:本文中所说的集合是指数学上的集合,不是es6里的Set。整体思路如下:用户传入一个二维的数组,每个子数组都是一个要进行笛卡尔积计算的集合。返回一个二维数组,每个子数组都是一个有序对或者n元有序组。当用户传入一个集合的时候,为了兼容业务,返回形如:[[a],[b]…]的二维数组。当用户只传入两个集合计算的时候,普通的嵌套计算即可。当用

  • java中switch的用法和逻辑运算符[通俗易懂]

    java中switch的用法和逻辑运算符[通俗易懂]一、switch的用法常见用法如下:importjava.util.Scanner;publicclassA{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);intscore=sc.nextInt();if(score>100&&score<0){Syst

  • Eclipse 运行时弹出A Java Exception has occurred

    Eclipse 运行时弹出A Java Exception has occurred错误原因:较高版本的JDK编译的javaclass文件试图在较低版本的JVM上运行而产生的错误。首先,因为之前jdk版本是10,后来安装了jdk1.7,想用1.7的,但是由于eclipse的编译器中仍然使用原来的版本所以导致错误。因为我用的eclipse的编译器来编译的。因为很多编译器都自带javac,而不是采用操作系统中的编译器。如果你的编译器是eclipse的话,那么需要在项目的属性里设置j…

  • 炉石传说怎么改服务器(炉石firestone怎么用)

    魔兽世界中,炉石是一个相当关键的道具,因为玩家在深入野外探险以后,如果要原路返回就太耗时间了,因此炉石很重要,那么炉石怎么用呢,下面游戏吧小编为大家带来介绍。魔兽世界炉石怎么用魔兽世界中炉石只需要玩家右键点击炉石就能使用,可以直接在背包里点,或者拖到快捷键上用快捷键点。炉石冷却时间为半个小时,使用炉石需要一定的施法时间,过程中玩家的施法动作像在双手搓东西,因此也叫搓炉石。玩家需要注意的是,炉石传送…

  • 3DES加密算法原理

    3DES加密算法原理

  • string的format方法_string str = new string(“abc”)

    string的format方法_string str = new string(“abc”)问题在开发的时候一段字符串的中间某一部分是需要可变的比如一个Textview需要显示”XXX用户来自上海年龄21性别男” 其中的XXX是用户名每个用户也是不一样的 地区上海为可变的string数据 年龄21为可变的int数据 性别男为可变的string数据 遇到这种情况你们是怎么样解决的呢?把这段字符串保存在常量类里吗?不!我们应该遵循Google的开发…

发表回复

您的电子邮箱地址不会被公开。

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