2009年4月26日,更新了源碼和相關文件 php
好久之前作了這個補丁,有幸的是朋友們都還算喜好它,沒白費功夫。很多朋友來信問它的原理,如今就講一下。不過裏面不少地方要靠回憶,未必很精確。若是你不能重現我所寫的,歡迎提醒。另外要說明的是,下面全部的一切都是針對android 1.0的。 java
整個補丁的製做分五個步驟。 android
先說一下icu4c。這是一個很是強大的開源軟件,基本上把全部多語言要處理的問題都解決了。android對語言的處理主要就是調用它,但並無包括中文相關的數據。因此先要把中文數據加進去。 sql
android編譯過程當中直接將external/icu4c/stubdata/icudt38l.dat作爲數據文件編譯到目標代碼中。因此只要向此文件添加中文的東西就好了。 數據庫
我用的方法是直接下載icu4c的源代碼,而後修改source/data/coll/root.txt,把data/coll/zh.txt的內容「合理地」替換進去。爲了減小體積,只替換pinyin相關的東西。編譯。 函數
參考external/icu4c/stubdata/helper.sh,用新作好的coll/root.res替換icudt38l.dat裏的coll/root.res,並將icu4c目標文件裏的translit/Han_Latin.restranslit/root.res添加進去。 工具
製做好的icudt38l.dat文件能夠從這裏下 載。放到external/icu4c/stubdata/目錄下,用「make libicudata」編譯android,應該很快就能獲得新生成的libicudata.so。用它替換ROM的同名文件,就已經能中文排序了(只對 新增或修改過的聯繫人有效,詳見第4步)。 測試
打開這個功能才能實現中文到拼音的轉換,也才能實現快速檢索。 ui
打開的方法應該是修改external/icu4c下的某個編譯配置文件。但具體改哪一個,改爲什麼我記不清了。源代碼也沒在隨時能夠查看的機器上。等查到了,再來補寫吧。 spa
icu4c.diff裏能夠看到打開的方法,涉及到數個文件的簡單修改。
在聯繫人數據庫中有一個peopleLookup表。它只有兩個字段,第一個是token,第二個是聯繫人id。只要從鍵盤輸入的字符和token能對應上,就會將改id的聯繫人顯示在檢索結果中。因此,只要把聯繫人的拼音寫到token,就能實現用硬鍵盤快速檢索。
全部的修改都集中於external/sqlite/android/sqlite3_android.cpp。這個文件爲sqlite增長了一些 android須要的功能,其中就有一個_TOKENIZE()函數。它的功能就是在指定的表中創建對給定id和字符串的索引。它還能對字符串進行分割, 好比sunner sun,會創建三個索引「sunner」,「sun」和「sunner sun」。這就是android聯繫人功能的初始形態。
_TOKENIZE()的實現是tokenize()函數。我在這裏面調用了icu4c的功能,把中文轉換成拼音字串,而後再建索引,因而就能拼音檢索了。就這麼簡單,代碼也不長,在sqlite3_android.diff中。不過如今不在手邊,之後再放上來。
將上述修改編譯後,替換到ROM中,並不能立刻使用這些功能。由於現存聯繫人的各類索引信息都是舊的,必須更新一下它們。更新的方法很簡單,就是把每一個聯繫人的名字都寫回一遍,而後把聯繫人數據庫中的索引都更新一下。細節都在ROM升級文件的updatedb.sh中。
替換system分區中的文件最好是在系統啓動前,不然極可能會形成空間丟失。因此最終把這個補丁作成了一個update.zip,能夠用刷機的方式刷上。
作它主要用到的工具是JF’s Build Environments(http://forum.xda-developers.com/showthread.php?t=475381)裏的testsign.jar。
分析已有的update.zip文件,就能知道它的基本結構,很簡單。按這個結構放好幾個要替換的文件,寫好update-script腳本(關於這個腳本的語法,只能從android源碼得到,在recovery/commands.c裏),打成zip包,而後
java -jar testsign.jar src.zip dst.zip
這裏的src.zip是前面作好的壓縮包,dst.zip就是最終產品。
大概就是這樣。
3.21版的補丁在這裏下載。