声明!本教程不适用于普通手机用户。本教程谢绝任何关于android的2B的刷机论坛的转载! 本人对各种刷机论坛保持随时鄙视权利!
2012年7月买了台手机:联通到定制机渴望V (T328W)
合约机啊。里面垃圾软件太多了!作为一个在Android界混了3年到程序猿。。。我怎能忍受这般折磨?
所以几天后就开始root
网上教程真他妈的多啊。随便找了一个试试,是什么掌酷首发。。。
首发个毛啊。。球用都没有。
后来又在网上试试别到。都他妈的垃圾,忽悠哥。还刷recovery?刷毛啊。这帮骗子,给你在网上写个教程,然后你照着他到步骤一步步做下去,结果必然变砖。然后这帮骗子给你留个QQ,下来你就会找这帮所谓到专家,然后这帮狗日到就给你个帐号,你先汇款。。。
幸亏哥老早就知道可能有这么回事。
作为一个玩android怎么会不能root自己到手机?
所以从这以后,哥就自己琢磨琢磨。功夫不负有心的哥啊。今天中午,终于tmd搞定了HTC T328W
从此哥再也无视HTC了!
以下为root过程,本过程针对android开发人员,普通用户可能会存在障碍。
原理:让adbd运行在root状态下。这样用adb登录到手机到时候就无所不能了。要让adbd能运行在root状态下,只要让/default.prop的ro.debuggable=1即可,所以是对rootfs做修改。(顺便说下:这个default.prop文件是在系统编译过程当中根据编译选项自动生成的。参考:build/tools/post_process_props.py)
0. 先解锁hboot。去www.htcdev.com.这里有官方的操作步骤。(警告!解锁后会回复出厂设置!你所有到东西和设置包括通讯录什么到都会丢掉!所以,解锁前务必备份你的东西!哥今天就犯了这个错误!悔恨啊。这大过年的,别人给我发的祝福短信都丢了。。我还没来得及回复呢。。。朋友们,如果你今年没收到我的回复,就是因为这个原因。。。)
1. 获取boot.img (因为boot.img是由kernel和rootfs构成)
2. 从boot.img中解压出rootfs。修改其中到default.prop文件即可。如果你愿意,你也可以修改init.rc中到内容,来做你期望到事情。其实有了adb root。你完全没必要在对init.rc耿耿于怀。
3. 重新打包boot.img 。然后用fastboot烧进去就完事。
好了,就这么些步骤。
首先来看第一步,如何获取一个靠谱到boot.img
这个当让不能在那些2B论坛来下载了。最简单到方法就是等待htc的自动系统更新。当手机更新时,会从htc到网站下载一个xxxxxxx.zip文件,比如:OTA_PRIMO_DS_ICS_40A_HTCCN_CHS_CU_1.74.1402.3-1.74.1402.2_release_306254pieh7ifxq1og6geo.zip
从这个文件你可以解压出:firmware.zip 。然后从这个文件,你可以解压出boot.img等。
你可以慢慢等待这个系统更新到时机。当系统更新时,首先会下载这个zip包,当下载完毕后就开始更新,更新完后系统会将这个包删掉,所以你要抓住机会把这个文件copy出来!很简单,当系统更新时,他会提示你确认更新系统。这时候,你先不要确认更新!连接usb线,或者用其他方式从手机到/android/目录下把这个zip文件考出来,然后你在点击确定开始更新系统。
当然,并不是每次更新都会更新firmware。有时候一些小更新可能只是针对应用程序到更新。所以,得到这个zip包以后,你先看看里面是不是有firmware。
好了,现在你有了一个绝对可靠到boot.img 。接下来看看第二步,获取boot.img 中到roofs并修改之。
htc到boot.img中会有一个256字节到header,我估计是用来在release版本做文件校验到。但是值得庆幸的,htc还没有把事情做的太绝。因为经过验证,他允许boot.img没有这个header,当然没有这个header的时候在启动kernel到htc会在屏幕上打印出一些警告信息,当然这仅仅是一个log而已。所以,很显然,要解压boot.img你必须首先把这个header去掉!用牛逼到dd命令吧。(多年前我就这么评价dd)
dd if=boot.img of=boot-no-header.img bs=256 skip=1
好了,现在有了一个通用到img了。现在就可以解压缩这个img了,这个解包到方法你可以在网上找到很多,当然,你知道都是抄的。
用这个经典到脚本来做吧:
./split.pl boot-no-header.img
解包完成后你会得到:
boot-no-header.img-kernel
boot-no-header.img-ramdisk.gz
两个文件,后者就是rootfs (ramdisk)。用命令行或者点击鼠标邮件把它解压缩了。你会看到文件:boot-no-header.img-ramdisk 这是个用gpio打包到文件,继续点击邮件解压缩了。或者用cpio命令来解压缩。
解压缩后你会看到boot-no-header.img-ramdisk_FILES目录。这就是rootfs。现在把default.prop的ro.debuggable=0改为ro.debuggable=1保存即可。完毕。
接下来重新打包,重新生成boot.img就大功告成。
打包第一步,把rootfs重新变成ramdisk 和ramdisk.gz
可以用cpio命令(去搜,一大堆)。也可一用android的工具:mkbootfs命令。
我用后者:
mkbootfs boot-no-header.img-ramdisk_FILES > new.img
new.img就是新到ramdisk,接下来用minigzip把这个new.img压缩一下:
minigzip new.img
好了,现在你可以看到生成了new.img.gz
接下来生成boot.img :
mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel boot-no-header.img-kernel --ramdisk new.img.gz -o mynewimage.img
好了这个mynewimage.img就是我们修改过到img了!!!!!
但是,还差一点点。可能是mkbootimg的版本问题,我生成的这个mynewimage.img的header和原始到header不太一样。这里就是一个结构体而已。所以我还需要把这个文件到header改变一下!方法就是用boot-no-header.img的前64Byte替换这个mynewimage.img的前64Byte。
先删掉mynewimage.img的前64字节:
dd if=mynewimage.img of=mynewimage-no-64.img bs=64 skip=1
拿到boot-no-header.img的前64字节:
dd if=../boot-no-header.img of=64.img bs=64 count=1
将mynewimage-no-64.img追加到64.img之后:
dd if=mynewimage-no-64.img of=64.img bs=64 seek=1
完毕!这个新的64.img就是我们最终到img。现在把它烧进去就好了!
用adb重启到bootloader。
adb reboot bootloader
或者你也可以按住音量键- 然后再按电源键开机,来切换到bootloader模式
烧写kernel:
fastboot flash boot 64.img
重启(当然你也可以拔下电源重启):
fastboot reboot
现在试试adb root:
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ adb root
restarting adbd as root
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ adb shell
如果这时候执行adb shell 不管用到话可以先kill掉server:
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ adb kill-server
然后重新执行adb shell:
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ adb shell
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
root@android:/ #
root@android:/ #
root@android:/ #
多可爱到#号!
现在可以为所欲为了!
如果要写入文件记着先
adb root
然后
adb remount system rw
然后再:
adb shell
就可以修改文件了。当然你也可以在/bin目录中放个su命令什么的。
顺便说下关于充电时还显示那个没用的充电图标的解决,一直没想明白为什么充电到时候不关LCD呢?已经有一个LED的指示灯了,还让背光耗着电,我觉得有点儿脑残。。
解决方案:把这个文件弄死就可以了:/system/bin/zchgd
改个名字,或者删掉init.primods.rc的下面几行
service zchgd_offmode /system/bin/zchgd -pseudooffmode
user root
group root graphics
disabled
service zchgd_onmode /system/bin/zchgd -onmode
user root
group root graphics
oneshot
附上android工具(linux版的)下载链接:http://download.csdn.net/detail/coder_jack/5060722
包括:adb fastboot minigzip mkbootfs mkbootimg split.pl
附上我的操作记录:仅供参考
//================================================================================================================
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
#
modified: boot-no-header.img-ramdisk_FILES/default.prop
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
#
boot-no-header.img-kernel
#
boot-no-header.img-ramdisk
#
boot-no-header.img-ramdisk.gz
no changes added to commit (use "git add" and/or "git commit -a")
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ git diff
diff --git a/boot-no-header.img-ramdisk_FILES/default.prop b/boot-no-header.img-ramdisk_FILES/default.prop
index 8b898cb..4bd9b38 100644
--- a/boot-no-header.img-ramdisk_FILES/default.prop
+++ b/boot-no-header.img-ramdisk_FILES/default.prop
@@ -3,5 +3,5 @@
#
ro.secure=1
ro.allow.mock.location=0
-ro.debuggable=0
+ro.debuggable=1
persist.service.adb.enable=0
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ ls
boot-no-header.img-kernel boot-no-header.img-ramdisk boot-no-header.img-ramdisk_FILES boot-no-header.img-ramdisk.gz
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ mkbootfs boot-no-header.img-ramdisk_FILES > new.img
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ ls -al
total 3620
drwxrwxr-x 4 cpp cpp 4096 Feb 10 16:13 .
drwxrwxr-x 3 cpp cpp 4096 Feb 10 14:27 ..
-rw-rw-r-- 1 cpp cpp 2857752 Feb 10 14:27 boot-no-header.img-kernel
-rw-rw-r-- 1 cpp cpp 322048 Feb 10 15:42 boot-no-header.img-ramdisk
drwxrwxr-x 8 cpp cpp 4096 Feb 10 16:10 boot-no-header.img-ramdisk_FILES
-rw-rw-r-- 1 cpp cpp 182640 Feb 10 14:27 boot-no-header.img-ramdisk.gz
drwxrwxr-x 8 cpp cpp 4096 Feb 10 16:13 .git
-rw-rw-r-- 1 cpp cpp 322048 Feb 10 16:13 new.img
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ minigzip new.img
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ ls -al
total 3484
drwxrwxr-x 4 cpp cpp 4096 Feb 10 16:14 .
drwxrwxr-x 3 cpp cpp 4096 Feb 10 14:27 ..
-rw-rw-r-- 1 cpp cpp 2857752 Feb 10 14:27 boot-no-header.img-kernel
-rw-rw-r-- 1 cpp cpp 322048 Feb 10 15:42 boot-no-header.img-ramdisk
drwxrwxr-x 8 cpp cpp 4096 Feb 10 16:10 boot-no-header.img-ramdisk_FILES
-rw-rw-r-- 1 cpp cpp 182640 Feb 10 14:27 boot-no-header.img-ramdisk.gz
drwxrwxr-x 8 cpp cpp 4096 Feb 10 16:13 .git
-rw-rw-r-- 1 cpp cpp 182641 Feb 10 16:14 new.img.gz
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel boot-no-header.img-kernel --ramdisk new.img.gz -o mynewimage.img
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ dd if=mynewimage.img of=mynewimage-no-64.img bs=64 skip=1
47583+0 records in
47583+0 records out
3045312 bytes (3.0 MB) copied, 0.117426 s, 25.9 MB/s
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ ls -al
total 9436
drwxrwxr-x 4 cpp cpp 4096 Feb 10 16:16 .
drwxrwxr-x 3 cpp cpp 4096 Feb 10 14:27 ..
-rw-rw-r-- 1 cpp cpp 2857752 Feb 10 14:27 boot-no-header.img-kernel
-rw-rw-r-- 1 cpp cpp 322048 Feb 10 15:42 boot-no-header.img-ramdisk
drwxrwxr-x 8 cpp cpp 4096 Feb 10 16:10 boot-no-header.img-ramdisk_FILES
-rw-rw-r-- 1 cpp cpp 182640 Feb 10 14:27 boot-no-header.img-ramdisk.gz
drwxrwxr-x 8 cpp cpp 4096 Feb 10 16:13 .git
-rw-r--r-- 1 cpp cpp 3045376 Feb 10 16:14 mynewimage.img
-rw-rw-r-- 1 cpp cpp 3045312 Feb 10 16:16 mynewimage-no-64.img
-rw-rw-r-- 1 cpp cpp 182641 Feb 10 16:14 new.img.gz
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ dd if=../
boot.img
boot-no-header.img
boot+ramdisk/
OTA_PRIMO_DS_ICS_40A_HTCCN_CHS_CU_1.74.1402.3-1.74.1402.2_release_306254pieh7ifxq1og6geo.zip
split.pl
Unlock_code.bin
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ dd if=../boot-no-header.img of=64.img bs=64 count=1
1+0 records in
1+0 records out
64 bytes (64 B) copied, 5.4361e-05 s, 1.2 MB/s
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ ls
64.img boot-no-header.img-ramdisk boot-no-header.img-ramdisk.gz mynewimage-no-64.img
boot-no-header.img-kernel boot-no-header.img-ramdisk_FILES mynewimage.img new.img.gz
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ ls -al
total 9440
drwxrwxr-x 4 cpp cpp 4096 Feb 10 16:17 .
drwxrwxr-x 3 cpp cpp 4096 Feb 10 14:27 ..
-rw-rw-r-- 1 cpp cpp 64 Feb 10 16:17 64.img
-rw-rw-r-- 1 cpp cpp 2857752 Feb 10 14:27 boot-no-header.img-kernel
-rw-rw-r-- 1 cpp cpp 322048 Feb 10 15:42 boot-no-header.img-ramdisk
drwxrwxr-x 8 cpp cpp 4096 Feb 10 16:10 boot-no-header.img-ramdisk_FILES
-rw-rw-r-- 1 cpp cpp 182640 Feb 10 14:27 boot-no-header.img-ramdisk.gz
drwxrwxr-x 8 cpp cpp 4096 Feb 10 16:13 .git
-rw-r--r-- 1 cpp cpp 3045376 Feb 10 16:14 mynewimage.img
-rw-rw-r-- 1 cpp cpp 3045312 Feb 10 16:16 mynewimage-no-64.img
-rw-rw-r-- 1 cpp cpp 182641 Feb 10 16:14 new.img.gz
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ dd if=mynewimage-no-64.img of=64.img bs=64 seek=1
47583+0 records in
47583+0 records out
3045312 bytes (3.0 MB) copied, 0.113646 s, 26.8 MB/s
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ ls -al
total 12412
drwxrwxr-x 4 cpp cpp 4096 Feb 10 16:17 .
drwxrwxr-x 3 cpp cpp 4096 Feb 10 14:27 ..
-rw-rw-r-- 1 cpp cpp 3045376 Feb 10 16:18 64.img
-rw-rw-r-- 1 cpp cpp 2857752 Feb 10 14:27 boot-no-header.img-kernel
-rw-rw-r-- 1 cpp cpp 322048 Feb 10 15:42 boot-no-header.img-ramdisk
drwxrwxr-x 8 cpp cpp 4096 Feb 10 16:10 boot-no-header.img-ramdisk_FILES
-rw-rw-r-- 1 cpp cpp 182640 Feb 10 14:27 boot-no-header.img-ramdisk.gz
drwxrwxr-x 8 cpp cpp 4096 Feb 10 16:13 .git
-rw-r--r-- 1 cpp cpp 3045376 Feb 10 16:14 mynewimage.img
-rw-rw-r-- 1 cpp cpp 3045312 Feb 10 16:16 mynewimage-no-64.img
-rw-rw-r-- 1 cpp cpp 182641 Feb 10 16:14 new.img.gz
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ adb reboot bootloader
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ fastboot flash boot 64.img
sending 'boot' (2974 KB)...
OKAY [ 0.622s]
writing 'boot'...
OKAY [ 0.674s]
finished. total time: 1.297s
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ fastboot reboot
rebooting...
finished. total time: 0.163s
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ adb root
restarting adbd as root
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ adb shell
^C
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ adb kill-server
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ adb shell
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
root@android:/ #
root@android:/ #
root@android:/ #
root@android:/ # ls
acct
cache
config
cwkeys
d
data
default.prop
dev
devlog
etc
init
init.goldfish.rc
init.primods.rc
init.rc
init.usb.rc
logo.rle
mnt
proc
root
sbin
sdcard
sys
system
ueventd.goldfish.rc
ueventd.primods.rc
ueventd.rc
vendor
root@android:/ # cd system
root@android:/system # ls
app
bin
build.prop
customize
etc
fonts
framework
lib
media
tts
usr
vendor
xbin
root@android:/system #
root@android:/system #
root@android:/system #
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ ls
64.img boot-no-header.img-kernel boot-no-header.img-ramdisk boot-no-header.img-ramdisk_FILES boot-no-header.img-ramdisk.gz mynewimage.img mynewimage-no-64.img new.img.gz
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
#
modified: boot-no-header.img-ramdisk_FILES/default.prop
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
#
64.img
#
boot-no-header.img-kernel
#
boot-no-header.img-ramdisk
#
boot-no-header.img-ramdisk.gz
#
mynewimage-no-64.img
#
mynewimage.img
#
new.img.gz
no changes added to commit (use "git add" and/or "git commit -a")
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$ git diff
diff --git a/boot-no-header.img-ramdisk_FILES/default.prop b/boot-no-header.img-ramdisk_FILES/default.prop
index 8b898cb..4bd9b38 100644
--- a/boot-no-header.img-ramdisk_FILES/default.prop
+++ b/boot-no-header.img-ramdisk_FILES/default.prop
@@ -3,5 +3,5 @@
#
ro.secure=1
ro.allow.mock.location=0
-ro.debuggable=0
+ro.debuggable=1
persist.service.adb.enable=0
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$
cpp@cpp:~/Desktop/test20130210/boot+ramdisk$