Android中文联系人排序及检索补丁的原理(090819更新)

2023-11-23 18:08

本文主要是介绍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就是最终产品。

大概就是这样。

这篇关于Android中文联系人排序及检索补丁的原理(090819更新)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/419761

相关文章

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

鸿蒙中@State的原理使用详解(HarmonyOS 5)

《鸿蒙中@State的原理使用详解(HarmonyOS5)》@State是HarmonyOSArkTS框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动UI的响应式编程模式,本文给大家介绍... 目录一、@State在鸿蒙中是做什么的?二、@Spythontate的基本原理1. 依赖关系的收集2.

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me