在保证手机有recovery模式的前提下.
手机正常待机模式,已经打开usb调试,使用数据线连接手机,在cmd命令下输入
D:\PROGRA~1\adt-bundle-windows-x86\sdk\platform-tools>adb reboot recovery
让手机重启进入recovery模式.
进入adb shell
D:\PROGRA~1\adt-bundle-windows-x86\sdk\platform-tools>adb shell
~ # ls
ls
boot init sys
cache init.rc system
data proc tmp
datadata res ueventd.goldfish.rc
default.prop root ueventd.lenovo.rc
dev sbin ueventd.rc
emmc sd-ext
etc sdcard
~ #
在recovery模式未选择从sdcard选择update.zip/或是挂载sdcard前mount情况如下,会发现虽然有sdcard挂载点,但是并没有挂载sdcar分区.(或是输入df -h 即可查看到分区情况)
~ # mount
mount
rootfs on / type rootfs (rw)
tmpfs on /dev type tmpfs (rw,relatime,mode=755)
devpts on /dev/pts type devpts (rw,relatime,mode=600)
proc on /proc type proc (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
/dev/block/mtdblock4 on /cache type yaffs2 (rw,nodev,noatime,nodiratime)
点击上面这些操作后,即可挂载了sdcard分区,也就是可以通过这个操作,查看一下它是怎么挂载的.
~ # mount
mount
rootfs on / type rootfs (rw)
tmpfs on /dev type tmpfs (rw,relatime,mode=755)
devpts on /dev/pts type devpts (rw,relatime,mode=600)
proc on /proc type proc (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
/dev/block/mtdblock4 on /cache type yaffs2 (rw,nodev,noatime,nodiratime)
/dev/block/mmcblk0p1 on /sdcard type vfat (rw,nodev,noatime,nodiratime,fmask=0000,dmask=0000,allow_utime=0022,codepage=cp437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)
~ #
然后以后可以手工mount sdcard
mount --help
可以查看使用方法
mount -w /dev/block/mmcblk0p1 /sdcard 挂载sdcard到sdcard节点.
然后如果已经处于此节点下时,需要退回上级再进入,ls时才能看到东西.
卸载分区是 umount -d /sdcard
从update.zip的/\META-INF\com\google\android下把update-binary拉入sdcard备用.
或是使用 D:\PROGRA~1\adt-bundle-windows-x86\sdk\platform-tools\adb.exe push c:/update-binary "/sdcard/update-binary" 方式上传到sdcard根目录下.
因为sdcar一盘是fat32,需要cp /sdcard/update-binary /tmp 或其它目录,
再设置一下权限
chmod 0777 /temp/update-binary
然后
/tmp/update-binary 1 2 /sdcard/update.zip
就可以运行升级,即可看到升级的过程,跟从recovery模式中选择 "从sdcard选择update.zip" 操作是一样的效果.
网上比较少说到这个方式.看一下update-binary的c代码,它需要三个参数,1是zip的版本号好像是只接受1,2,3或是0,不了解android4的这个文件代码是怎么样的.
然后2参数是把运行反馈到那里.相当于stdout/stderr的方式,
而后面那个就是签名过的update.zip,文件名无谓.
所以,基本上可以使用bat来达到签名->上传->重启到recovery->update->查看更新情况->reboot一bat操作了.
拖入文件上传到手机sdcard根目录bat
@echo off
set "s=%~f1"
set "nn=%~nx1"
if "%s%"=="" (
echo 请把操作文件拖到本bat文件上再放开来运行
) else (
title 上传中...
echo 进行中...%s%
D:\PROGRA~1\adt-bundle-windows-x86\sdk\platform-tools\adb.exe push "%s%" "/sdcard/%nn%"
echo 完成.
title 上传完成
)
pause
--------一键刷机脚本,某些东西需要修改.bat---------
@echo off
title "自动对同目录下的rom.zip签名->上传->刷机->重启"
set batDir=%~dp0
set bat=%0
CD "%batDir%"
set "binDir=%batDir%\bin\"
set "zip=%batDir%\rom.zip"
set batArg0=%1
set batArg1=%2
if "%batArg0%" == "/n" (
goto n_%batArg1%
)
echo.
echo 除了本bat,其它文件可以上网上下载,像签名相关文件,一般放在签名工具一起
echo.
echo 本bat文件所在目录是:%batDir%
echo.
IF NOT EXIST %binDir% (
echo 用于存放必需运行文件目录不存在,请建立:%binDir%
goto stop
)
IF NOT EXIST %zip% (
echo 用于recovery模式下刷入的未签名的rom压缩包不存在,zip格式,固定文件名rom.zip,如果没有请先制作:%zip%
goto stop
)
set lup=%batDir%/bin/update-binary
if not exist %lup% (
echo 找不到执行刷入update.zip的二进制文件:%lup%
goto stop
)
set signJar=%batDir%\bin\sign.jar
if NOT Exist %signJar% (
echo 用于给rom压缩包签名的文件不存在:%signJar%
goto stop
)
set pem=%batDir%\bin\certificate.x509.pem
if NOT Exist %pem% (
echo 用于给rom压缩包签名的证书文件不存在:%pem%
goto stop
)
set key=%batDir%\bin\key.pk8
if NOT Exist %key% (
echo 用于给rom压缩包签名的key文件不存在:%key%
goto stop
)
set adb=%batDir%\bin\adb.exe
if NOT Exist %adb% (
echo 连接手机的文件不存在:%adb%
goto stop
)
set "romSignDir=%batDir%\romSignDir\"
echo 签名rom存放目录是%romSignDir%
echo.
if not exist "%romSignDir%" mkdir "%romSignDir%"
echo 下面检测是否有java使用环境
echo.
echo 如果有就进入签名过程
echo.
echo 如果没有本窗口就会直接关闭了,所以,需要安装java环境才能继续
echo.
pause
cmd /C "java.exe -version && start "签名步骤" /WAIT /B %bat% /n sign"
exit
exit
:n_sign
echo.
title java环境正常,准备签名
set update=%romSignDir%\update.zip
if exist %update% (
echo.
echo 检测到已经存在一个签名过的%update%
echo 签名前文件是%zip%
echo 准备重新签名
echo.
echo 跳过签名输入任意字符回车
echo 中止关闭窗口
echo 重签直接回车
echo.
set /p signNow=
)
if "%signNow%" == "" (
echo 检测到java环境,正在对%zip%签名中...
echo.
title 签名进行中...
java -jar "%signJar%" "%pem%" "%key%" "%zip%" "%update%"
echo.
echo 完成.签名后的文件是%update%.
title 签名完成
)
echo.
echo 在adb连接操作中,有可能会发生服务假死情况,只能到任务管理器中结束它,重新使用bat
echo 本过程将会重置adb与手机的连接服务,所以如果你正在使用adb服务请稍后再继续
echo 如果在过程出错,有可能adb有问题
echo 如果过程无法找到设备,请检查usb线连接
echo.
echo 准备重启到recovery模式
pause
echo.
echo 重置adb服务到usb模式,或防止连接服务假死
%adb% kill-server
%adb% start-server
echo.
echo 下面是已经连接设备,如果列举设备为空,adb连接将会等待直到有设备可以连接,这时可以检查连接,或重新运行本bat
%adb% devices|find "recovery"
echo.
echo %ERRORLEVEL%
echo.
if "%ERRORLEVEL%" == "0" (
echo.
echo 发现已经处于recovery模式,无需重启
echo.
) else (
echo 尝试重启手机到revocery模式
%adb% reboot recovery
echo.
echo 设备已经进入revocery模式且准备好后再按继续
pause
%adb% kill-server
)
set sdZip=/sdcard/update.zip
echo 准备挂载sdcard,本机的是/dev/block/mmcblk0p1,不同机需要修改
%adb% shell mount /dev/block/mmcblk0p1 /sdcard
set pup=/tmp/update-binary
echo 上传用于更新的二进制文件%lup%到手机%pup%,并设置成可运行
%adb% push "%lup%" %pup%
%adb% shell chmod 0777 %pup%
echo.
echo 检查刷机执行文件是否上传好
echo.
%adb% shell ls %pup%
%adb% shell ls %pup%|find /I "No such"
echo.
echo %ERRORLEVEL%
echo.
if not "%ERRORLEVEL%" == "0" (
echo 刷机执行文件上传成功
) else (
echo 刷机执行文件上传失败
goto stop
)
%adb% shell ls %sdZip%|find /I "No such"
echo.
echo %ERRORLEVEL%
echo.
if not "%ERRORLEVEL%" == "0" (
echo 发现手机卡存在%sdZip%
echo 是否重新上传覆盖?
echo. 不传?输入任意字符回车
echo 重传?直接回车
echo.
set /p co=
)
if "%co%" == "" (
title %update%文件上传中...
echo.
echo %update%文件正在上传中...
echo.
%adb% push "%update%" %sdZip%
echo 上传结束.
echo.
title 上传结束
)
echo 下面准备开始刷机
pause
set log=%batDir%\recovery_update_log.txt
if exist "%log%" (
echo.
echo 发现存在刷机日志
echo 是否清空?
echo.
echo 保留?输入其它回车
echo 清空日志?直接回车
echo.
set /p cl=
if "%cl%" == "" (
echo. >%log%
)
)
echo. >>%log%
echo. >>%log%
echo 刷机日志于 %DATE% %TIME%>>%log%
echo. >>%log%
echo 正在刷机中...请稍候...
%adb% shell "%pup%" 2 2 %sdZip% >> %log%
echo 刷机结束
echo 刷机日志文件:%log%
start %log%
echo.
echo 准备重启设备到正常模式,回车立刻重启,否则直接关闭本窗口,注意继续本窗口将关闭
echo.
echo 请选择操作(1重启到正常模式; 其它不操作)
echo.
set /p re=
if "%re%" == "1" (
echo 正在重启中....
%adb% reboot
exit
) else (
exit
)
:stop
title 操作结束
pause
-----------------------------------------