在寻找高版本Android固件的过程中遇到一个Android6.0的固件, 刷上去之后发现没有Root. 因为原发布者设置了收费的QQ群, 固件开机图上就是QQ群号, 满以为交了钱之后应该能有Root教程, 结果完全没有, 还被原发布者踢出群.
于是只能自己Root, 顺便将碍眼的开机图片换掉.
Root需要准备的材料
TTL引线
首先要将TTL连线引出, 这会涉及到焊板子
TTL转USB线
我用的是PL2302芯片的TTL转USB线, 这个在win7和ubuntu下都自带有驱动. 对应的软件Win7下建议用xshell或secureCRT, Ubuntu下建议使用GTKTerm
软件
su和daemonsu: 这个要从同一类型(芯片组), 同一内核版本的已经Root的电视盒子固件上复制. 因为现在R3300L盒子的不同安卓版本其内核都是3.14.29, 所以这两个文件是通用的.
SuperSu 和 RootExplorer: 前者是必须的, 后者可选
Root的过程
Root其实就是要将不带uid限制的su和daemonsu(其实也是su)放到/system/xbin/ 下, 将其权限设为0755, 再运行 /system/xbin/daemonsu --auto-daemon & 命令让daemon运行在后台, 然后在Android界面上运行SuperSU, 让SuperSU完成最后的Root工作, 等SuperSU更新完文件提示重启, Root就完成了.
实际的步骤要复杂一些
- 首先要通过TTL访问命令行, 这个固件在TTL启动后, 直接是root shell, 所以这一步没什么问题
- 然后将/system分区挂载为可写, 通过 mount -o rw,remount /system 命令实现
- 将软件都复制到U盘, 连上盒子之后, 在TTL Shell命令行将su, daemonsu复制到 /system/xbin/ 下, 并修改权限 chmod 0755 su daemonsu
- 在安卓界面上安装SuperSU, RootExplorer
- 在TTL Shell命令行运行/system/xbin/daemonsu --auto-daemon & 然后ps检查是否有daemon的进程
- 在安卓界面运行SuperSU开始Root, 如果前面步骤正确, 这一步SuperSU会提示是否更新文件, 按普通更新即可, 等十几秒后SuperSU会提示完成要重启
- 重启后就不需要再运行daemonsu了, 直接运行SuperSU检查Root结果
制作自带Root的固件
制作已经Root的固件相对而言就更麻烦一点, 因为要把上面提到的要素都准备好, 并且固件当中可以改的只是 /system 下面的内容, 因为这些在 system分区下, 其他地方的内容是不方便修改的. 这边涉及到的工具主要有linux下的工具 https://github.com/natinusala/linux-amlogic-toolkit 和windows下的解包和打包工具 Amlogic CustomizationTool. 前者的打包存在bug, 所以只用于对system.img进行修改, 后者用于制作最外层的解包打包.
用 linux-amlogic-toolkit 解开的 system 分区会挂载在 output/system/ 目录下, 因为里面都是owner为root的文件, 所以要用sudo进行修改, 将su和daemonsu复制进 xbin目录, 并修改权限为 0755, chown 为 root:2000 (这个根据目录里其他文件的属性进行修改), 然后将前一步中安装好的SuperSU, RootExplorer 的安装目录(在 /data/app) 复制过来, 放到这里的app目录下, 检查并确认权限和owner是否和其他的app一样. 这样文件都准备好了. 还缺一个随开机启动的 daemonsu.
这时候要检查一下运行中的盒子, 看看根目录下的 init.rc 这个文件, 查找service 关键词, 能看到一系列开机启动的服务, 看看其中有没有这条 service ... /system/bin/install-recovery.sh , 如果有那就最好不过, 直接在 bin 下修改(或创建) install-recovery.sh 文件, 写入以下内容
#!/system/bin/sh # Run SuperSU deamon /system/xbin/daemonsu --auto-daemon &
.再chmod 0755 将文件属性改为可执行, 这样就都准备好了.
接下来就是再通过 linux-amlogic-toolkit 的recreate 将system分区打包为 system.PARTITION, 然后通过 CustomizationTool 将固件解包(只需要解level1), 将system.PARTITION 替换成新的, 再打包, 一个自带Root的固件就完成了.
在固件刷机完启动后, 在界面上运行SuperSU按提示更新文件, 待更新完文件重启后, 新系统就已经Root了.
TWRP 3.0.2.0 Recovery
可以使用S905X的TWRP作为S905L的recovery, 文件在 https://github.com/botfap/A95X-Linux-BuildEnv/tree/master/recovery
相比系统自带的recovery, TWRP的命令行各种命令是相当完整的, 几乎等价于一个小linux系统. TWRP的使用方式有两种:
- 格式化一个U盘或TF卡, 我使用的是一张2G的TF卡, 格式化为FAT, 将 twrp-s905x.img-v3.0.2 文件重命名为 recovery.img, 放到TF卡根目录下, 连上盒子, 用reboot update启动
- 将 twrp-s905x.img-v3.0.2 重命名为 recovery.PARTITION, 直接打包在固件里, 这样系统进入recovery时, 就是TWRP recovery了.
修改Logo和Bootanimation
修改Logo, 直接在linux-amlogic-toolkit 解开的 /output/logo/ 目录中替换 bootup 文件就可以了. 图像文件必须是BMP格式的16bit或者24bit, 不支持8bit(这个试过, 肯定不行), 再recreate 后, 用生成的 logo.PARTITION去打包.
修改bootanimiation, 在 /system/media 下, 替换 bootanimation.zip, 根据Google的格式说明 , 里面分两部分, 一部分是desc.txt, 一部分是包含顺序文件名的png文件的目录.
desc.txt文件格式
# Line1 WIDTH HEIGHT FPS WIDTH: animation width (pixels) HEIGHT: animation height (pixels) FPS: frames per second, e.g. 60 # Line 2 ~ N: TYPE COUNT PAUSE PATH [#RGBHEX [CLOCK1 [CLOCK2]]] TYPE: a single char indicating what type of animation segment this is: p -- this part will play unless interrupted by the end of the boot c -- this part will play to completion, no matter what COUNT: how many times to play the animation, or 0 to loop forever until boot is complete PAUSE: number of FRAMES to delay after this part ends PATH: directory in which to find the frames for this part (e.g. part0)
注意目录里的图片不能太多, 最好控制在50张以内, FPS也不能太高, 最好在20以内, WIDTH和HEIGHT设置得不对会导致动画不显示. 另外bootanimation.zip的权限也要设置为0644, 否则系统无法读取, 就会显示默认的ANDROID动画字符.
在Ubuntu下打zip包的命令如下, 用winrar这类工具打包的似乎系统不认.
zip -0qry -i \*.txt \*.png \*.wav @ ../bootanimation.zip *.txt part*
Preinstallapps
在/system/media 目录下还有一个 preinstallapps.tar 文件, 这个是用来在第一次启动时预装app的, 调用在/system/bin/preinstallapps.sh, 由某处 init.*触发. 如果要清理的话最好在rm之后touch一个同名空文件在那里, 避免启动时错误.