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)
上一篇 2022年1月29日 下午5:00
下一篇 2022年1月29日 下午5:00


相关推荐

  • hashmap和hashtable和hashset的区别_为什么要用hashmap

    hashmap和hashtable和hashset的区别_为什么要用hashmap1.HashMap1) hashmap的数据结构     Hashmap是一个数组和链表的结合体(在数据结构称“链表散列“),如下图示:     当我们往hashmap中put元素的时候,先根据key的hash值得到这个元素在数组中的位置(即下标),然后就可以把这个元素放到对应的位置中了。如果这个元素所在的位子上已经存放有其他元素了,那么在同一个位子上的元素将以链表的形

    2025年12月2日
    9
  • vue.js与jquery的区别_说出两者之间的区别

    vue.js与jquery的区别_说出两者之间的区别jQuery:曾经是前端最流行的js库。Vue:是一个兴起的js库,是一个精简的MVVM。从技术角度讲。Vue.js专注于MVVM模型的ViewModel层,它通过双向数据绑定把view和Model层连接起来,通过对数据的操作完成对页面视图的渲染。二者的区别是:一、Vue和jQuery对比jquery是使用选择器()选取DOM对象,对其进行赋值、取值、事件绑定等操作,和原生的HTML的区别只在于可以更方便的选取和操作DOM对象,而数据和界面是在一起的。二、Vue则是通过Vue对.

    2022年10月16日
    5
  • java反射的原理,作用

    什么是反射,反射原理Java反射的原理:java类的执行需要经历以下过程,编译:.java文件编译后生成.class字节码文件加载:类加载器负责根据一个类的全限定名来读取此类的二进制字节流到JVM内部,并存储在运行时内存区的方法区,然后将其转换为一个与目标类型对应的java.lang.Class对象实例连接:细分三步验证:格式(class文件规范)语义(final类是否有子类)…

    2022年4月11日
    46
  • document.all详解「建议收藏」

    document.all详解「建议收藏」(1)document.all是页面内所有元素的一个集合。 document.all[]这个数组可以访问文档中所有元素。document.all(0)表示页面内第一个元素(2)document.all可以判断浏览器是否是IEif(document.all){alert(“isIE!”);}(3)也可以通过给某个元素设置id属性(id=good),然

    2022年7月12日
    27
  • idea 2021激活码[在线序列号][通俗易懂]

    idea 2021激活码[在线序列号],https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
    121
  • MyBatis核心组件之SqlSessionFactory

    MyBatis核心组件之SqlSessionFactoryMyBatis的核心组件MyBatis的核心组件分为4个部分:SqlSessionFactoryBuilder(构造器):它会根据配置或者代码来生成SqlSessionFactory,采用的是分布构建的Builder模式。SqlSessionFactory(工厂接口):依靠它来生成SqlSession,使用的是工厂模式。SqlSession(会话):一个既可以发送SQL执行返回结果,也可…

    2022年5月22日
    28

发表回复

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

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