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. Struts2(三)——数据在框架中的数据流转问题

    一款软件,无在乎对数据的处理.而B/S软件,一般都是用户通过浏览器客户端输入数据,传递到服务器,服务器进行相关处理,然后返回到指定的页面,进行相关显示,完成相关功能.这篇博客重点简述一下Struts2 ...

  2. dojo事件

    dojo.connect 和 dojo.disconnect /*建立连接*/ dojo.connect(/*Object|null*/ obj, /*String*/ event, /*Object ...

  3. C# Winform中执行post操作并获取返回的XML类型的数据

    /// <summary> /// 返回指定日期的订单数据 /// </summary> /// <param name="StartDate"> ...

  4. 异常 java.lang.NumberFormatException: For input string:

    今天在写项目时,将String类型转换为Integer类型爆出此异常,记录如下: 代码如下: 1 String a = "2222222222"; //10个2 Integer b ...

  5. mysql的分页存储过程,能够传出总记录数

    最近用mysql + asp.net来写网站,既然mysql已经支持存储过程了,那么像分页这么常用的东西,当然要用存储过程啦 不过在网上找了一些,发现都有一个特点——就是不能传出总记录数,干脆自己研究 ...

  6. 智能电视TV开发---如何实现程序省电

    对于很多使用智能手机的用户来,很多抱怨手机耗电太快,很多人买手机的时候卖家都是推荐买两块电池,还有如果用户留心的话,在买手机的网页上,卖家会显示播放视频多长时间,听音乐多长时间,待机多长时间,不过看的 ...

  7. safari 在 iPad Portrait 模式默认设置980px宽度

    最近在做网站兼容性时发现 safari 在 iPad Portrait 模式,默认为html.body标签设置了980px宽度,导致页面被纵向截断,解决方法为在页面head区插入以下代码即可完美解决. ...

  8. android的数据存储方式

    数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的5种方式,分别是: 1 使用SharedPreferences存储数据 2 文件存储数据 3 SQLite数据库存储数据 ...

  9. [makefile] filter-out

    $(filter-out ,) 名称:反过滤函数——filter-out.功能:以模式过滤字符串中的单词,去除符合模式的单词.可以有多个模式.返回:返回不符合模式的字串.示例: objects=mai ...

  10. SQL Server 找出值得优化的语句

    方法 1. sys.dm_exec_qurey_stats 返回 SQL Server 中缓存查询计划的聚合性能统计信息. 缓存计划中的每个查询语句在该视图中对应一行, 并且行的生存期与计划本身相关联 ...