v0.3.7 — 支援 Android 9、再瘦一圈
這版做兩件事:把最低系統需求降到 Android 9,以及讓安裝包再瘦一圈 —— release APK 從 767 KB 減到 534 KB(−30%)。
支援 Android 9(minSdk 29 → 28)
原本 Android 9 裝不上去。降 minSdk 後只有三處要處理,功能零損失:
- 主題 —
Theme.DeviceDefault.DayNight是 API 29 才有的,改成自訂@style/AppTheme,values/走淺色、values-night/走深色。-night資源限定詞 Android 9 就支援,Android 10 以上行為完全不變。 - IME 導覽列 insets —
applyNavBarPadding()用的WindowInsetsAPI 是 Android 15 專用路徑,呼叫端本來就有版本守衛,只是 lint 追不進私有方法;加註解即可,零執行期改變。 - 簡繁轉換 —
android.icu.text.Transliterator公開 SDK 自 API 29 起。實測它在 Android 9 上其實可用(那個 API 29 是編譯期門檻,不是類別存在的門檻),但不能假設每家 OEM ROM 都放行,所以加了版本守衛,Android 9 改用 app 已附的s2t.json/t2s.json逐字對照 —— 就是CINTable做候選排序用的同一份表。
Pixel API 28 模擬器實測(全程走軟鍵盤,不用 adb shell input text):設定頁與深色模式、liu.cin on-device 編譯、鍵盤彈出與游標、mn→米 候選送出、聯想詞、,,VS 剪貼簿繁→簡皆正常。
資料表 v2 格式(−233 KB)
解析四個 mmap 資料檔的內容後發現表示法上的浪費,改格式不改資料、不動功能:
| 檔案 | 改法 | 大小 |
|---|---|---|
phrases.bin → PHM2 |
去掉與鍵重複的首字、UTF-32 改 UTF-16 | 251 → 170 KB |
zhuyin_data.bin → ZYM2 |
反向索引不再存第二份字表,改存 u16 音節索引 | 151 → 61 KB |
pinyin_data.bin → PYM2 |
1338 個拼音音節與注音音節字表相同,改存索引別名 | 40 → 8 KB |
char_freq.bin → CFM2 |
頻次只用於排序,改存 dense rank u16 | 54 → 26 KB |
讀取端仍是 mmap 零 heap,查詢時間差異在 ±1–2 µs。正確性由 Python 參考讀取端對 v1/v2 逐鍵比對(全部音節、字、拼音、詞首字、頻次順序,外加整個 CJK 區間的未命中探針)確認一致。
APK 簽章與 v0.3.6 相同,可直接覆蓋更新。