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

android JNI库实现reboot,recovery的更多相关文章

  1. Android JNI如何调用第三方库

    http://www.2cto.com/kf/201504/388764.html Android JNI找不到第三方库的解决方案 cannot load library 最近做一个jni项目,拿到的 ...

  2. 【转】Android下编译jni库的二种方法(含示例)

    原文网址:http://blog.sina.com.cn/s/blog_3e3fcadd01011384.html 总结如下:两种方法是:1)使用Android源码中的Make系统2)使用NDK(从N ...

  3. 【转】Android下编译jni库的二种方法(含示例) -- 不错

    原文网址:http://blog.sina.com.cn/s/blog_3e3fcadd01011384.html 总结如下:两种方法是:1)使用Android源码中的Make系统2)使用NDK(从N ...

  4. android开发源代码分析--多个activity调用多个jni库的方法

    android开发源代码分析--多个activity调用多个jni库的方法 有时候,我们在开发android项目时会遇到须要调用多个native c/jni库文件,下面是本人以前实现过的方法,假设有知 ...

  5. Android 4.4.2 动态加入JNI库方法记录 (二 app应用层)

    欢迎转载,务必注明出处:http://blog.csdn.net/wang_shuai_ww/article/details/44458553 源代码下载地址:http://download.csdn ...

  6. 获取Android APK JNI库

    /************************************************************************** * 获取Android APK JNI库 * 说 ...

  7. Android 4.4.2 动态加入JNI库方法记录 (一 JNI库层)

    欢迎转载,务必注明出处.http://blog.csdn.net/wang_shuai_ww/article/details/44456755 本篇是继<s5p4418 Android 4.4. ...

  8. 利用gdb 调试android jni c动态库

    http://blog.dornea.nu/2015/07/01/debugging-android-native-shared-libraries/ Since I haven't done thi ...

  9. [转载]—— Android JNI知识点

    Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 ...

随机推荐

  1. 转(havel 算法)

    http://www.cnblogs.com/wally/p/3281361.html poj 1659(havel算法) 题目链接:http://poj.org/problem?id=1659 思路 ...

  2. 【转】V4L2+swscale+X264+live555实现流媒体服务端

    写这边博客,一方面是因为自己在做项目的时候不太做笔记,怕以后自己忘记了.另一方面,是让正在寻求资料的同行少走一点弯路吧.不能说我这个方案怎么的好,至少是有一点参考价值的.这边博客需要一定基础才能看明白 ...

  3. Unity屏幕射线碰撞

    Layers层: 从Layers设置看来,最多支持32层.  图层的值开始依次 0^2,1^2, 2^2, 3^3 依次增加. 当摄像机Culling Mask属性 Nothing= –1 Eveni ...

  4. Swift的基础,操作符,字符串和集合类型

    这篇文章主要讲解苹果Swift官方指南的第二章前四节的要点内容,如果想看完整的英文文档可以去苹果开发者页面下载. Basic 声明常量let 声明变量var 注释依旧使用"//" ...

  5. NET基础课--应用程序编译和执行1

  6. 初次使用Oracle

    这是我第一次写博客,主要是记录下自己这半个多月以来的学习笔记,以备以后可以随时查看. 首先就是安装Oracle的问题的,我系统是Win7 64位的,出现各种问题郁闷得不行,最终安装个Oracle102 ...

  7. InvokeRequired方法和Invoke函数

    c#中禁止跨进程直接访问控件,为了解决这个问题,出现了InvokeRequried属性,当一个控件的InvokeRequried属性值为真时,说明有控件外的线程想要访问它.这时便会调用到Invoke方 ...

  8. Apache无法启动解决方案

    Apache无法启动错误原因: 原因一:80端口占用例如IIS,另外就是迅雷.我的apache服务器就是被迅雷害得无法启用! 原因二:软件冲突装了某些软件会使apache无法启动如Dr.com 你打开 ...

  9. PHP 表单防止刷新提交的方法

    当然,最直接的办法就是尽量不要使用自动提交的表单,然而,当我们需要网页主动post表单进行初始化时,就不得不面对这个问题了 -------------------------------------- ...

  10. Python信息采集器使用轻量级关系型数据库SQLite

    1,引言Python自带一个轻量级的关系型数据库SQLite.这一数据库使用SQL语言.SQLite作为后端数据库,可以搭配Python建网站,或者为python网络爬虫存储数据.SQLite还在其它 ...