这应该是全网第一篇“折腾”关于“数拓V8”盒子的文章了,这里记录下。折腾的过程很曲折,主要是在armbian 设备树上面。不知道为啥就喜欢Linux。
数拓V8使用的是RK3288平台,ACT8846PMIC。常见的老乡鸡、海底捞的广告机就是用的它,2+8G经典组合,体现了开发者高超的技术水平。好吧说人话就是这垃圾配置,如果不是玩玩,还真不想入(某鱼均价80-160之间,有账户绑定还不提供技术!)。
这个盒子下面就叫shutuo吧,为什么折腾他呢,来源于两年前的某一天闲着无聊,想挑战(麻烦)自己。就在某鱼上逛,记得当时搜的关键词为“广告机”,终于找了个随缘的卖家,也随缘买了。
盒子照片
网上的图片:
失误
刚拿到机器是兴奋的,虽然外观85成色。第一步就是酒精对机身消毒,然后开机。 开机进入的是Android 5.1的系统,但是有广告launcher,外接鼠标还不能跳出。
幸好开了adb服务,自然是连上reboot maskrom进入Maskrom模式,找公版firefly的ubuntu进行刷入了。 这一系列的操作都是晚上进行的,因为忘记备份原镜像(对自己太自信了,还有晚上不能刷机、做决定。好几次了清空了40引脚的flash rom包括uboot。还不能刷机!!!),结果就是发现有线网口不能用了,USB接口没反应了。只有wifi还能使用,忍着使用了一段时间。后来实在是看dmesg里一堆的错误看不下去了,尝试自己编译linux固件。因为网络墙、版本等问题,总是失败。也放弃了,转而看看armbian下有什么好办法。
Armbian
到了折腾Armbian阶段,知道了需要给内核正确的Device Tree设备树信息。虽然RK3288平台方案就那几种,鬼知道厂商做了什么大胆的方案。
刷了网上的适配RK3288的Armbian 21的固件还有LibreELEC固件,因为不适配,导致有线网口用不了、USB口无电压(但是OTG口电压正常,可能是OTG口直接生成的5V电压没经过PMIC。这里想到个骚操作,OTG直连任意USB口,其他USB口共享电压,这时键盘就能用了。)和重启异常问题。
而设备树信息又需要和原始固件进行比较,原始固件没备份。GG
寻找原始固件
全网都没有这个原始固件,再买一台?现在买的太贵,而且这垃圾没必要再买一个。这里还是在某鱼,我买这个设备的卖家介绍图中看到了一个设备信息图。
这里可以提取到信息,型号为
instwall-jk3288-e 2.3.15版本。这里的搜索过程不表,反正就是很艰辛。终于,通过
instwall-jk3288这个关键词搜到了其他产品的固件升级包页面(感谢bing.com)。
页面为 https://www.shutuo.tv/i/did/pub/instwall-jk3288-a/release/1.2.4/index.html
发现,目录名是
instwall-jk3288-a这个型号,那我换instwall-jk3288-e这个型号存不存在呢?访问:403 !好耶,存在这个目录就好办了。release目录后跟着版本号,使用python去暴力访问这些目录,看看哪些链接返回字节不一致(这个网站不存在时不会返回404,而是返回一个js加载错误的页面)。最终,发现了
instwall-jk3288-a、instwall-jk3288-c、instwall-jk3288-e这三种型号。我想要的2.3.15版本居然神奇的404了,但是其他版本都能下载(Fuck)。最终下载了2.3.13、2.3.17、2.3.19这三个版本,提取到了原始的
dtb文件。通过反编译,和armbian中的
rk3288-firefly-reload.dtb反编译进行对比。
折磨人的又一难
因为原始固件是安卓5.1 内核是3.10的,而armbian的内核又是5.10.x的,跨度太大,设备树的信息改变太多。
起先是通过反编译,让ai进行对比差异。试了gemini、cc、chatgpt、codex等,居然没有一个可以正确的回答出来,正确答案里加载着错误的答案,真真假假、好像在逗我玩。
最终,通过人力对比、多轮提问细节的方法。找到了修改dts的方案。
有线网口:armbian适配的是千兆网口,人家没有想到会存在百兆网口的方案。改也是很简单,即RGMII改成RMII。
USB口:使用的GPIO口非常规,应该使用0x50 0x0c 0x00。
到这里有线网口、USB都能正常使用了,但是电源管理还存在问题,重启不会reset。执行到关机后就不能启动了,需要拔插电源才能启动。而关机就正常(无语)。到这里我服了,在研究时在armbian社区提了这个需求,为了后来者方便搜索到这个解决办法,我又在原帖中贴上了修改后的dts、dtb文件和修改点。
https://forum.armbian.com/topic/58403-request-to-adapt-the-compilation-of-shutuo-v8-rk3288-version-armbian/
回归Android
玩了几天armbian,总感觉卡卡的(毕竟芯片性能在那),想要刷回android了。
又来一难
想着要刷个最新版的,就刷了2.3.19这个版本。谁想到这个版本坑货。
刷入后adb可以连接,存在su文件,执行需要密码。于是adb pull这个su文件,使用ghidra进行分析。这里简简单单,对输入的密码进行对比,通过就继续执行后面的代码。
密码也很简单,st123数拓123嘛,简简单单。到这里本以为一切顺利,执行su输入密码st123回车一按,等着吐出心心念的#,等等,什么情况,输出了Permission denied。还以为输错了密码,输了几次都是一样,这种给了希望又失望的感觉,唉。
使用解包工具看了下固件包,气吐血了。su文件作为承载普通用户执行特权命令的工具,理应有s权限位。可这?s去哪了?哪个坑爹的程序员打包忘记了? 是忘记了还是故意的?
好吧,那我换低版本2.3.17。刷之前先看看
su的权限对不对。
这次总算是对了,那就刷他吧。
不是,还来?
刷入后,开机还是广告launcher,无法跳过。这里adb进入su都不需要密码。使用am start -a android.settings.SETTINGS打开设置。
8G存储变成了4G,这里是因为分给了安卓的其他分区。
退出设置,又启动了广告launcher。不惯它,dumpsys activity top | grep ACTIVITY 看看是谁在作怪,发现是ACTIVITY com.instwall.launch/com.instwall.stepbysteplibrary.activity.BindScreenActivity 还不能停止、冻结。还会再启动,应该是有保活服务在作妖。
使用pm hide com.instwall.launch隐藏这个后,暂时不启动了。没想到重启后另一个广告launcher又在作怪。重复上面的步骤,定位到相关app,给他一个雪藏套餐pm hide com.instwall.player。 再次重启就没了广告了,因为没有默认的launch,导致看到的是黑屏。那就安装个当贝桌面吧。
有完没完?
下载安装包后,pm install <package>却一直卡住,apk图形界面也卡住。等了一杯水的功夫,还卡在那。终于明白,不是性能弱,而是故意刁难不给安装。
看看pm命令该不会是脚本吧,看了不是。暂时没头绪了。
记得安卓有个神奇的工具叫做logcat,程序员会把log、print等各种屎塞到这里面。或许可以从这里找到线索?
在输出了一堆26个字母,10个数字和一些符号后,趁着输出少,执行pm安装命令,同时观察logcat日志, 终于发现了蛛丝马迹。
D/AndroidRuntime( 6669): Calling main entry com.android.commands.pm.Pm I/servicemanager( 156): type=1400 audit(0.0:204): avc: denied { search } for name="6669" dev="proc" ino=52185 scontext=u:r:servicemanager:s0 tcontext=u:r:init_shell:s0 tclass=dir permissive=1 I/servicemanager( 156): type=1400 audit(0.0:205): avc: denied { read } for name="current" dev="proc" ino=53070 scontext=u:r:servicemanager:s0 tcontext=u:r:init_shell:s0 tclass=file permissive=1 I/servicemanager( 156): type=1400 audit(0.0:206): avc: denied { open } for path="/proc/6669/attr/current" dev="proc" ino=53070 scontext=u:r:servicemanager:s0 tcontext=u:r:init_shell:s0 tclass=file permissive=1 I/servicemanager( 156): type=1400 audit(0.0:207): avc: denied { getattr } for scontext=u:r:servicemanager:s0 tcontext=u:r:init_shell:s0 tclass=process permissive=1 D/test_pm ( 479): [PackageManagerService][handleStartCopy] packagename: com.dangbei.tvlauncher is not allowed
没想到都root了还不给允许!顺着这个日志,判断应该是PackageManagerService.java中存在问题,handleStartCopy进行了判断。而这个PackageManagerService.java在/system/framework/services.jar中。那就pull下来文件,放到jadx-gui中,查找handleStartCopy。
发现了白名单列表
ALLOW_PKG_NAME = new String[]{"com.instwall.sdk", "org.opencv.engine", "com.instwall.unstable_hk_camera", "com.instwall.face", "com.instwall.launch", "com.settings.stepbystep", "com.shutuo.floating.window", "ashy.earl.magicshell", "com.instwall.shell", "com.instwall.player", "com.instwall.autodebug", "com.instwall.server", "com.instwall.dressingmirror", "com.instwall.roulettegame", "com.instwall.browse", "com.instwall.videodemo", "com.instwall.settings", "com.shutuo.beacon", "com.shutuo.store", "com.instwall.menu", "com.instwall.eduboard", "com.shutuo.recommend", "shutuo.printdemo", "com.instwall.hardware"};
存在私有函数isAllowPackage判断包名
判断了
"eng".equals(SystemProperties.get("ro.build.type"))或者1 == SystemProperties.getInt("persist.sys.debug", 0)那么就简单了,root权限下,直接执行
setprop persist.sys.debug 1就可以正常安装软件了。安装的投屏软件:
维护模式
厂商自己的维护软件,没啥大用。可以玩玩
am start -n com.instwall.settings/.SigninActivity 维护登录 账号密码:1111/1111
刷机资料
遇到的坑,所涉及的固件、脚本都已分享。
链接: https://yun.139.com/shareweb/#/w/i/2tZvRRfj47Whf
提取码:kn53 复制内容打开中国移动云盘手机APP,操作更方便哦