陸續開發了兩套軟體,碰到了一些問題,記錄一下,以供後人參考。
Note:有新發現會不定期更新。
01. 如果是不需要 GUI 的程式,可以使用 Go 並設定跨平台編譯即可。
02. 如果需要 GUI,一些軟體的做法是先把東西畫到 framebuffer,再一次更新,就不會有閃爍的問題,可以參考 KOReader plugin 或是 application 的作法,另外,寫一個活在 KOReader 裡的軟體,就可以使用 KOReader API 開發 GUI App,開發語言是 Lua。
雖然沒有很懂架構,但寄生在雲端儲存 App 裡面,開啟一個對話盒看起來沒有問題。
03. 如果是透過程式將檔案加到 device,要觸發 device 重新掃瞄檔案系統,有兩種方式:
a. 掛載一個假的 SD,並通知 sd add event to /tmp/nickel-hardware-status。
b. 利用 /tmp/nickel-hardware-status,觸發 usb plug add event,不用真的插線,但使用者需按下連接,接著 sleep 幾秒,再觸發 usb plug remove event。這樣 device 就會重新掃瞄了。
Warning:掛載 SD 方法,之後如果插拔 USB,會讓書出現 2 次,原因是我們把 /mnt/onboard 下的資料夾掛載到 /mnt/sd,但插拔 USB 時,又會去掃 /mnt/onboard,故同樣的檔案才會出現 2 次。我們可以改用 NickelMenu 內建 action 去觸發,查了一下,KoboCloud 也有這種問題,但因為它把檔案下載到 .add 目錄,故用 ExcludeSyncFolders 的方式排除。
04. Kobo 只有在退出 USB 或是使用內建瀏覽器下載檔案時會觸發重新掃瞄檔案系統,也可以直接對 database 動手腳,我還看過有用 database trigger 的,但後者比較難,相容性也不好。
05. 英文網站常會看到 Nickel 這個單字,就是指 Kobo 的系統。
06. 以前的 Kobo 不會對隱藏目錄建立索引,但從版本 4.17 開始會處理隱藏目錄,故有用到 Kobo 支援格式檔案的第三方軟體的檔案就會被顯示在我的書籍中,當利用排除方式處理後,Kobo 會把不再索引的檔案砍掉,這會造成第三方軟體因為缺少檔案而無法啟動,故需要重新安裝軟體。
[FeatureSettings]
ExcludeSyncFolders=(\\.(?!kobo|adobe).+|([^.][^/]*/)+\\..+)
07. Kobo 設定檔在某些不知名情況下會被重設,故偶爾會造成系統異常,如果有看到似乎是重新設置系統的畫面,可以考慮直接關機,重開機後也許就不需重設帳號。
/mnt/onboard/.kobo/Kobo/Kobo eReader.conf
08. Kobo 不支援需要密碼的 PDF 檔案,故重新掃瞄檔案系統看不到檔案是正常的。
09. 下面這套軟體似乎是用 Qt 寫 App,也有提到跨平台編譯?
10. Send to Kobo app,該 app 會自動收信到 device。
11. NickelDBus 是一個使用 Linux D-Bus(軟體訊息匯流排)協定的工具,可以觸發它去做一些事,比如重新掃瞄檔案系統,設定 Wi-Fi 等,以 Qt 和 C++ 開發。
12. NickelMenu 底層的原理,稍微 trace 一下,應該就是透過 NickelHook 去呼叫 libnickel.so 裡面的函數,來達到相關功能。也就是 Linux 的 dlopen and dlsym(使用動態連結函式庫的 c function),其實作可詳 NickelHook / nh.c,故要在 Golang 使用,可能只能走 cgo 模式了。
Warning:沒那麼簡單,libnickel 有用到 Qt Lib,以 import book 來說,還要寫成 QApplication 才能呼叫成功,但我最後還是沒試成功。
Warning:想要在 Kobo 上使用 Qt,要使用 QPA。
13. Cross-Compile C code.
a. git clone https://github.com/koreader/koxtoolchain
b. ./toxtoolchain/gen-tc.sh kobo
c. The tool is in /home/xxx/x-tools/arm-kobo-linux-gnueabihf
d. Before you compile your code, set up your env.
export PATH=/home/xxx/x-tools/arm-kobo-linux-gnueabihf/bin:$PATH
source /home/xxx/koxtoolchain/refs/x-compile.sh kobo env
e. Use arm-kobo-linux-gnueabihf-gcc to build your code.
f. 執行時如果需要外部動態函式庫,可以在編譯時指定路徑給 gcc,"-Wl" 是告知 gcc 後面 "-rpath" 是給 linker 用的,"," 代表空白好讓 linker 知道。
-Wl,-rpath,/usr/local/Kobo -Wl,-rpath,/usr/local/Qt-5.2.1-arm/lib
14. 如果要 compile Qt,可以用 NickelTC,高手已經把環境包好。
15. 判斷機器型號的方式,開啟 /mnt/onboard/.kobo/version,檢查最後 3 碼即可,比如說 387 就是 Elipsa,可以看 plato.sh 裡面的判斷方式。
大概就是這些吧 ...