Android中文聯繫人排序及檢索補丁的原理(090819更新)

原文轉自孫志崗老師Sunner的博客:http://blog.sunner.cn/2009/04/android_pinyin_sorting/

文章寫的是針對Android1.0, 1.1及1.5(Cupcake)版本的。新版本亦基本相同,只要稍微解決一下編譯問題就可以了。

在這裏感謝一下Sunner老師,你真強大!



======================= Sunner 原文 =============================



很久以前做了這個補丁,有幸的是朋友們都還算喜愛它,沒白費功夫。不少朋友來信問它的原理,現在就講一下。不過裏面很多地方要靠回憶,未必很精確。如果你不能重現我所寫的,歡迎提醒。另外要說明的是,下面所有的一切都是針對android 1.0的。

整個補丁的製作分五個步驟。
1. 製作支持中文排序和文字轉換拼音的icudt38l.dat文件

先說一下icu4c。這是一個非常強大的開源軟件,基本上把所有多語言要處理的問題都解決了。android對語言的處理主要就是調用它,但並沒有包括中文相關的數據。所以先要把中文數據加進去。

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.res translit/root.res添加進去。

製作好的icudt38l.dat文件可以從這裏 下載。放到external/icu4c/stubdata/目錄下,用“make libicudata”編譯android,應該很快就能得到新生成的libicudata.so。用它替換ROM的同名文件,就已經能中文排序了(只對新增或修改過的聯繫人有效,詳見第4步)。
2. 打開icu4c的translit功能

打開這個功能才能實現中文到拼音的轉換,也才能實現快速檢索。

打開的方法應該是修改external/icu4c下的某個編譯配置文件。但具體改哪個,改成什麼我記不清了。源代碼也沒在隨時可以查看的機器上。等查到了,再來補寫吧。

icu4c.diff 裏可以看到打開的方法,涉及到數個文件的簡單修改。
3. 改變android爲聯繫人建索引的方式

在聯繫人數據庫中有一個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 中。不過現在不在手邊,以後再放上來。
4. 製作數據庫刷新腳本

將上述修改編譯後,替換到ROM中,並不能馬上使用這些功能。因爲現存聯繫人的各種索引信息都是舊的,必須更新一下它們。更新的方法很簡單,就是把每個聯繫人的名字都寫回一遍,然後把聯繫人數據庫中的索引都更新一下。細節都在ROM升級文件的updatedb.sh中。
5. 製作ROM升級文件

替換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就是最終產品。

大概就是這樣。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章