Android中文聯繫人排序及檢索補丁的原理

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

2009年4月26日,更新了源碼和相關文件 php

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

整個補丁的製做分五個步驟。 android

1. 製做支持中文排序和文字轉換拼音的icudt38l.dat文件

先說一下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步)。 測試

2. 打開icu4c的translit功能

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

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

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

大概就是這樣。

3.21版的補丁在這裏下載。

相關文章
相關標籤/搜索