最近实验在中兴 V880 blade上写个自己的在线卡刷的应用(当然了事先已经root刷了第三方的ClockworkMod Recovery v4.0.0.5版本)
20120729个人补充:
(这个地方你要注意以下之前在CM论坛上看到880在印度的手机版本还有一个 recovery_flash脚本,刷了第三方的ClockworkMod Recovery 还会给你还原回来,给你锁住了recovery这个功能
http://forum.cyanogenmod.com/topic/49652-idea-zte-blade-india/#entry335808
通过调用 RecoverySystem.installPackage 接口一键升级系统(当然了本文的update.zip包是签名验证过的,不涉及很多的签名不通过问题,不发散问题)
在网上搜索了一下
参见:
http://markmail.org/message/occuzybn36xeikcm
http://wifihack.net/blog/2012/04/android-clockworkmod-recovery-system-updat/
http://blog.lytsing.org/archives/356.html
应用添加了如下权限
<uses-permission android:name="android.permission.DELETE_CACHE_FILES" />
<uses-permission android:name="android.permission.ACCESS_CACHE_FILESYSTEM" />
<uses-permission android:name="android.permission.REBOOT" />
代码如下
private void excuteUpdateZip() {
// TODO Auto-generated method stub
try {
RecoverySystem.installPackage(this, new File("/sdcard/update-cm-7.2.0-RC0-Blade-KANG-signed.zip"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
但是卡刷失败,结果如下
FileNotFoundException: /cache/recovery/command (Permission denied)
补充:
{
本人已经测试过如果在增加写的APK中直接访问并写入/cache/recovery/command 是没有权限问题的
private static File RECOVERY_DIR = new File("/cache/recovery");
private static File COMMAND_FILE = new File(RECOVERY_DIR, "command");
RECOVERY_DIR.mkdirs(); // In case we need it
COMMAND_FILE.delete(); // In case it's not writable
FileWriter command = new FileWriter(COMMAND_FILE);
try {
command.write("--wipe_cache");
command.write("\n");
} finally {
command.close();
}
}
很奇怪,为什么会有这个问题,而且网上也都是提出类似问题,没有解决的方法提出。
没有办法,只好修改system的RO权限,改为RW权限,然后将生成的APK放入system/app,之后reboot。
修改挂载文件设备的权限的方法参见:
android 修改文件属性(U960S删除快门声实例)
界面显示rebooting,之后出现了一个机器人感叹号的图片
进入Adb 查看cache/recovery,目录查看 log
发现
Finding update package...
I:Update location: /mnt/sdcard/update-cm-7.2.0-RC0-Blade-KANG-signed.zip
E:unknown volume for path [/mnt/sdcard/update-cm-7.2.0-RC0-Blade-KANG-signed.zip
原来问题在这里,进入recovery模式以后,SD卡挂载的的目录为sdcard。造成了路径偏差。不过就实验目的来说已经达到了只不过需要将应用设置为系统应用。
问题到此为止,目前看来只能是在机器里面定制 framework里面的RecovrySystem代码 检查一下路径如果有mnt则去除掉,就可以 正常刷机了。