对于 Kindle 越狱玩家来说,搜索栏快捷代码绝对不是什么陌生的东西.最近,我注意到 USBNetwork 这个越狱插件在安装后会为 Kindle 添加两个自定义的快捷代码: ;un 和 ;usbnetwork ,这似乎意味着此类代码并非是写死在系统中的,而是可以通过某种手段新增或修改的.
如何做到对快捷代码的自定义呢?或者说,快捷代码被调用的实际过程是怎样的?一个自然的思路是,每个快捷代码都对应 $PATH 中的一个可执行文件.为了验证这一猜想,执行 find / -name "*711*" 命令,发现存在 /usr/bin/711.sh 文件.进一步发现 /usr/bin 目录下存在大量与某一快捷代码对应的 Shell 脚本,如 311.sh 411.sh 611.sh debugOn.sh 等.这一猜想似乎是正确的.
我研究搜索栏快捷代码的原因其实是想找到一条快速启动 KOReader 阅读器的途径.(默认是通过 KUAL 这个应用启动器来启动 KOReader 的,但操作十分繁琐.)于是我新建了 /usr/bin/ko.sh 文件,内容为:
#!/bin/sh /mnt/us/koreader/koreader.sh
然后回到主屏幕,在搜索栏中输入 ;ko 并回车,发现并没有成功启动 KOReader.看来并没有找对方法.
当然,这些快捷代码也有可能是以 LIPC 方式储存的 (Kindle 系统一大特色
).于是尝试 lipc-probe -av | grep 711 命令,但没有发现与 ;711 这个快捷代码的定义有关的内容.(不过意外地发现执行 ;711 后返回的内容是存在 LIPC 里的)
查阅 MobileRead Wiki 后发现,所有的快捷代码实际上都定义在 /usr/share/webkit-1.0/pillow/debug_cmds.json 这个文件内.这个文件的内容是:
{
";dm" : "/usr/bin/dm.sh",
";dmcc" : "/usr/bin/dmcc.sh",
";dh" : "/usr/bin/dh.sh",
";dt" : "/usr/bin/dt.sh",
";wifipopup" : "/usr/local/bin/wifipopup.sh",
";sandbox" : "/usr/local/bin/sandbox.sh",
";sbx" : "/usr/local/bin/sandbox.sh",
";shpm" : "/usr/sbin/shipping_mode",
";lzzl" : "/usr/sbin/shipping_mode",
";urst" : "/usr/sbin/userstore_reset",
";usbnetwork" : "/usr/local/bin/usbnetwork.sh start",
";un" : "/usr/local/bin/usbnetwork.sh start",
";uns" : "/usr/local/bin/usbnetwork.sh stop",
";di" : "/usr/local/bin/indexerdisable.sh",
"`stopIndexing" : "/usr/local/bin/indexerstop.sh",
"`startIndexing" : "/usr/local/bin/indexerenable.sh",
"`disableIndexing" : "/usr/local/bin/indexerdisable.sh",
"`indexStatus" : "/usr/local/bin/indexstatus.sh",
";ddc" : "/usr/local/bin/dynconfig.sh",
";resetConfig" : "/usr/local/bin/resetConfig.sh",
";rc" : "/usr/local/bin/resetConfig.sh",
";twoFingerChromeOn" : "/usr/local/bin/altChrome.sh 1",
";homeKeyChromeOn" : "/usr/local/bin/altChrome.sh 2",
";normalChrome" : "/usr/local/bin/altChrome 0",
";debugOn" : "/usr/bin/debugOn.sh",
";debugPaint" : "/usr/bin/debugPaint.sh",
";debugOff" : "/usr/bin/debugOff.sh",
";debugPerf" : "/usr/bin/debugPerf.sh",
";dP" : "/usr/bin/debugPerf.sh",
";311" : "/usr/bin/311.sh",
";411" : "/usr/bin/411.sh",
";611" : "/usr/bin/611.sh",
";711" : "/usr/bin/711.sh",
";setTime" : "/usr/bin/dateTime.sh",
";st" : "/usr/bin/dateTime.sh",
"~ds" : "/usr/bin/ds.sh",
";hv" : "/usr/local/bin/htmlViewer.sh",
";installHtml" : "/usr/local/bin/installHtmlViewer.sh",
";merchant" : "/usr/local/bin/merchant.sh",
";updateCamp" : "/usr/bin/updateCamp.sh",
";cll" : "/usr/bin/configureloglevel.sh",
";rll" : "/usr/bin/resetLogInfo.sh",
";reagloff" : "/usr/local/bin/reaglMode.sh 0",
";reaglswitch" : "/usr/local/bin/reaglMode.sh 1",
";reaglfull" : "/usr/local/bin/reaglMode.sh 2",
";reagldfull" : "/usr/local/bin/reaglMode.sh 3",
";reagldpart" : "/usr/local/bin/reaglMode.sh 6",
";reaglpart" : "/usr/local/bin/reaglMode.sh 7",
";reaglswitch2" : "/usr/local/bin/reaglMode.sh 8",
";dsc" : "/usr/local/bin/discovery.sh",
";debugScripts" : "/usr/bin/confirmDebugScriptsEnabled.sh",
";pcap" : "/usr/local/bin/pcap.sh",
";fw" : "/usr/local/bin/firewall.sh",
";dgsmden" : "/usr/local/bin/enableDiags.sh",
";reaglConfig" : "/usr/bin/reaglConfig.sh",
";gsdebug" : "/usr/local/bin/gsdebug.sh",
";mangaGcFlash" : "/usr/bin/mangaGcFlash.sh",
";report" : "/usr/bin/reportBug.sh",
";recoverUserType" : "/usr/bin/recoverUserType.sh",
";mkjira" : "/usr/bin/createJira.sh",
";ghp" : "/usr/bin/generateHprof.sh",
";log" : "/usr/bin/logThis.sh",
";ooms" : "/usr/local/bin/oomWatch.sh",
";gs" : "/usr/bin/configureGripSuppression.sh",
";dshot" : "/usr/bin/delayShot.sh",
";csc" : "/usr/bin/clearStoreCache.sh",
";uzb" : "/usr/bin/enableUSBInDemo.sh",
";duzb" : "/usr/bin/disableUSBInDemo.sh",
";dsts" : "/usr/bin/startSettingsInDemo.sh",
";enter_demo" : "/usr/bin/createDemoModeFlagFile.sh",
";exit_demo" : "/usr/bin/deleteDemoModeFlagFile.sh",
";demo" : "/usr/bin/demoConfig.sh",
";vfd" : "/usr/bin/verifyDemo.sh",
";wwftux" : "/usr/local/bin/wwResetFtux.sh",
";wwreset" : "/usr/bin/wwReset.sh",
";chkup" : "/usr/bin/checkUpdate.sh",
";wwresetoverride" : "/usr/bin/wwResetOverride.sh",
";wwresetknown" : "/usr/bin/wwResetKnown.sh",
";att" : "/usr/bin/play.sh" ,
";astop" : "/usr/bin/stopPlay.sh",
";accelstop" : "/usr/bin/accel_log_stop.sh",
";accel" : "/usr/bin/accel_log.sh",
";invertedPage" : "/usr/bin/pageTurnConfig.sh",
";qb" : "/usr/bin/quickboot.sh",
";jit" : "/usr/bin/resetTutorial.sh",
";kb1" : "/usr/bin/cspUpdate.sh",
";kb2" : "/usr/bin/enableKeyboards.sh",
";temp" : "/usr/local/bin/showTemperature.sh",
";bsalogOn" : "/usr/bin/bsaLogOn.sh",
";bsalogOff" : "/usr/bin/bsaLogOff.sh",
";pinyinreset" : "/usr/bin/pinyinReset.sh"
}
一目了然,快捷代码与可执行文件的对应关系以 JSON 格式储存,可以自行添加.同时也注意到,快捷代码并非必须以 ; 开头.考虑到我添加快捷代码是为了方便启动 KOReader, 而分号在 Kindle 的虚拟键盘里并非那么容易找到,我添加了这么一行:
".ko" : "/usr/bin/ko.sh"
然后重启.以后,就可以通过在搜索栏里输入 .ko 来启动 KOReader 了,非常方便.使用类似的方法,也可以为其它 Kindle 功能或越狱插件设置快捷代码.
有两点需要注意:
- 修改
/usr/share/webkit-1.0/pillow/debug_cmds.json前,似乎需要把 Kindle 的根文件系统挂载为读写,方法是执行mntroot rw.出于安全考虑,修改完成后应该执行mntroot ro挂载只读. - 在为
/usr/share/webkit-1.0/pillow/debug_cmds.json新增内容时,记得要给上一行的末尾加上逗号,这毕竟是 JSON.
以上.
Hello,Nota.I'm Otto .
你好啊.
嗯,你是那个中学的?
welcome to ottostudio.space.
请教一个问题,怎么在kindle 的search bar 上增加icon ,比如增加一个icon 来打开KUAL
我不知道,但可以给你提供一个思路: Kindle 的操作系统的 UI 部分用的全是 web 那套技术,或许搜索栏的图标和布局是定义在系统目录的某个 HTML 文件里的.或者,你也可以在 Kindle 的开放源代码里找找(虽说 UI 部分的代码很大可能是私有的闭源代码)