在保证手机有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

-----------------------------------------

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐