Google原生输入法LatinIME引擎初始化流程分析(二)

LatinIME语言支持对照表 LatinIME语言支持对照表 语言 国家缩写 语言缩写 ID 阿拉伯语 Arabic/arabic ar 1494081088 阿塞拜疆语(阿塞拜疆) Azerbaijani (Azerbaijan)/qwerty az_AZ 1890646388 爱沙尼亚语(爱沙尼亚) Estonian (Estonia)/nordic et_EE -332580523 巴斯克语(西班牙) Basque (Spain)/spanish eu_ES 118381575 白俄罗斯语(白俄罗斯 阅读详情

引擎初始化首先是在Java层调用native的初始化方法,Java层调用如下:

    private void initPinyinEngine() {
        byte usr_dict[];
        usr_dict = new byte[MAX_PATH_FILE_LENGTH];

        // Here is how we open a built-in dictionary for access through
        // a file descriptor...
        AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.dict_pinyin);
        if (Environment.getInstance().needDebug()) {
            Log.i("foo", "Dict: start=" + afd.getStartOffset()
                            + ", length=" + afd.getLength() + ", fd="
                            + afd.getParcelFileDescriptor());
        }
        if (getUsrDictFileName(usr_dict)) {
            inited = nativeImOpenDecoderFd(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength(), usr_dict);
        }
        try {
            afd.close();
        } catch (IOException e) {
        }
    }

根据构建后的二进制文件获取 一个文件描述符,将该文件描述符传入native进行初始化,其实就是load之前build中产生的一些数组、树结构以及一些值,native经过一些列调用,最终是调用用了matrixsearch类的init方法:

bool MatrixSearch::init_fd(int sys_fd, long start_offset, long length,
                           const char *fn_usr_dict) {
  if (NULL == fn_usr_dict)
    return false;

  if (!alloc_resource())
    return false;

  LOGD("init_fd sys_fd == %d , start_offset == %l, and length == %l", sys_fd, start_offset, length);
  if (!dict_trie_->load_dict_fd(sys_fd, start_offset, length, 1, kSysDictIdEnd))
    return false;

  LOGD("fn_usr_dict == %c", *fn_usr_dict);
  if (!user_dict_->load_dict(fn_usr_dict, kUserDictIdStart, kUserDictIdEnd)) {
    delete user_dict_;
    user_dict_ = NULL;
  } else {
    user_dict_->set_total_lemma_count_of_others(NGram::kSysDictTotalFreq);
  }

  LOGD("size of dict_trie == %d", sizeof(dict_trie_));
  reset_search0();

  inited_ = true;
  return true;
}

调用了两个load_dict,一个是dict_trie的,用来加载sys_fd,这个sys_fd就是build后生成的二进制文件dict_pinyin.dat文件,这里使用其文件描述符来进行加载操作,另一个是调用user_dict的load_dict方法,此方法用来加载用户词典,fn_usr_dict变量为:/data/user/0/com.android.inputmethod.latin/files/user_dict.dat文件,这个dat文件是用户在使用输入法过程中产生的用户字典,初次安装应用的话用户字典初始状态为空,因此初始化的过程主要逻辑在加载系统词典:

bool DictTrie::load_dict_fd(int sys_fd, long start_offset,
                            long length, LemmaIdType start_id,
                            LemmaIdType end_id) {
  if (start_offset < 0 || length <= 0 || end_id <= start_id)
    return false;

  FILE *fp = fdopen(sys_fd, "rb");
  if (NULL == fp)
    return false;

  if (-1 == fseek(fp, start_offset, SEEK_SET)) {
    fclose(fp);
    return false;
  }

  free_resource(true);

  dict_list_ = new DictList();
  if (NULL == dict_list_) {
    fclose(fp);
    return false;
  }

  SpellingTrie &spl_trie = SpellingTrie::get_instance();
  NGram &ngram = NGram::get_instance();

  if (!spl_trie.load_spl_trie(fp) || !dict_list_->load_list(fp) ||
      !load_dict(fp) || !ngram.load_ngram(fp) ||
      ftell(fp) < start_offset + length ||
      total_lma_num_ > end_id - start_id + 1) {
    free_resource(true);
    fclose(fp);
    return false;
  }

  fclose(fp);
  return true;
}

主要加载逻辑都在第四个if语句中:

1、spl_trie.load_spl_trie()从stream中读取相关数据结构并组织拼音树结构。

2、dict_list_->load_list(fp)从fp中读取单汉字列表scis以及buf_413个合法音节数组等,load_list的过程和save_list的流程相同,按照save的顺序去读取对应的数组:scis_num_、start_pos_、start_id_、scis_hz_、scis_splid_和buf_。

3、load_dict(fp)从fp中恢复lma_node_num_le0_、lma_node_num_ge1_、lma_idx_buf_len_、top_lmas_num_、lma_idx_buf_、nodes_ge1_和root_。

4、ngram.load_ngram(fp)从fp中加载build的时候save的数组和数值:idx_num_、freq_codes_、lma_freq_idx_,关于ngram信息构建流程可以参考前面的Google原生输入法LatinIME词库构建流程分析(三)--N-gram信息构建

综上,load_dict的流程其实就是把build过程中的一些数组和数值从二进制文件流中按照保存次序一次读取出来,在search或者predict的过程中,综合这些数据结构实现输入文字的查找、预测过程。

LatinIME模块化改造揭秘:如何为Android系统注入遥控器操作能力 本文揭秘了在RK3576平台上运行Android14系统时,对LatinIME输入法引擎进行模块化改造的全过程。通过深度解析LatinIME架构、设计遥控器按键事件处理链路、实现焦点管理与视觉反馈协同,成功为Android系统注入完整的遥控器操作能力,显著提升了智能电视和机顶盒的输入体验。 阅读详情

相关推荐

Android 原生 GoogleLatinIME 修改

Android 原生 GoogleLatinIME 修改

m0_53255684的博客 801

【亲测免费】 探索开源输入法:GitCode上的LatinIME项目

探索开源输入法:GitCode上的LatinIME项目 如果您正在寻找一个可靠的、开源的输入法以供个人或商业使用,那么您可能已经发现了拉丁IME(LatinIME)项目。这个项目是Android系统的一部分,并且可以在GitCode上获得源代码。本文将为您介绍一下这个项目的背景、功能及特性,让您更好地了解它。 LatinIME是什么? LatinIME是一个用于Android设备的开源输入法引擎,...

gitblog_00008的博客 1225

QT下谷歌拼音输入法

这是安卓底层的谷歌拼音输入法源码,基于Qt5.4.2

android latinime分析,Android AOSP输入法(LatinIME)大写判断分析

LatinIME源码地址:https://android.googlesource.com/platform/packages/inputmethods/LatinIME/+/android-5.1.1_r6一、大写模式:Android中字母大写有三种模式:textCapCharacters、textCapWords、textCapSentences,分别对应全大写、单词首字母大写、句子首字母大写...

weixin_29416781的博客 1767

LatinIME:这是从Android 4.4源代码中单独分离出来的输入法代码

拉丁IME 这是从Android 4.4源代码中单独分离出来的输入法代码

ROS2实战:打造智能巡检机器人的关键技术与实现

本文详细介绍了基于ROS2和Navigation2构建智能巡检机器人的完整实战流程。通过设计主从协作的事件驱动架构,实现了机器人在已知地图中的自动导航、定点语音播报和环境图像采集功能。文章涵盖了从环境搭建、仿真配置到核心控制节点、语音服务与图像记录模块的代码实现,为开发者打造实用的自动巡检机器人提供了清晰的技术指南。

weixin_29031057的博客 222

Android IMF (Input Method Framework) 输入法简介

IMF包含3个主要部分: 1、input method manager (IMM) 相当于客户端的API,协调其它部分的互动,负责跟系统服务(IMMS) 通讯。 2、input method editor (IME) 界面和输入法引擎, 处理用户的输入。 3、client applications

Edai9508的专栏 2282

Python学习24:中国古代数学问题——物不知数(Python123)

意思是说有一些物品,不知道有多少个,3个3个数的话,还多出2个;5个5个数则多出3个;7个7个数也会多出2个。题目为‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬:今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?现假设物品总数不超过n (n

weixin_60530224的博客 2万+

Android IMF学习笔记一

  IMF是input method framework的简称, 它是Android 1.5新添加进去的一个重要功能,用来支持软键盘、各种的输入法。 到目前位置(2009-04-03),Android 1.5还没有正式发布,但IMF的功能已经很稳定,其上已经存在有3种输入法。分别是LatinIME(软键盘)、 OpenWnn(CJK输入法)、PinyinIME(GOOGLE 拼音),还缺少中文的手

随心翱翔 1万+

ATAC-seq数据分析流程

Outline0. ATAC-seq原理0.1 染色体结构0.2 原理0.3 结果0.4 意义1. ATAC-seq数据分析流程1.1 上游分析(1)序列质控和比对(2)序列筛选1.2 下游分析1.3 进阶分析 0. ATAC-seq原理 0.1 染色体结构 0.2 原理 0.3 结果 0.4 意义 1. ATAC-seq数据分析流程 1.1 上游分析 (1)序列质控和比对 fastqc trim_golare bowtie2 mapping时要加上参数 --very-sensitive -X 2000

weixin_57830892的博客 1万+

pycharm添加Anaconda解释器显示不出来

因为我之前下载的是pycharm最新版本2024.1的,所以我抱着试一试的心态卸载重装了2021.3.3的,创建新文件的时候立刻就自己识别好了conda环境。就是图中画圈的地方,之前一直显示为python的图标,但是再Python Interpreter后面跟的路径确实是我下载anaconda的地方。另外一种方法就是使用Virtualenv Environment方式配置,但是我的pycharm还是没有识别出conda的图标。首先是这位的方法,先添加系统解释器,再重启,但是我的图标还是python。

2202_75803271的博客 4006

Android IMF输入法总结

<br />IMF是input method framework的简称, 它是Android 1.5新添加进去的一个重要功能,用来支持软键盘、各种的输入法。<br /> 到目前位置(2009-04-03),Android 1.5还没有正式发布,但IMF的功能已经很稳定,其上已经存在有3种输入法。分别是<br /> LatinIME(软键盘)、 OpenWnn(CJK输入法)、PinyinIME(GOOGLE 拼音),还缺少中文的手写、五笔。<br /> 虽说按照已有的输入法模块, 也能写出自己想要的输

1108

Open3D 读取、保存、显示点云【2025最新版】

paint_uniform_color给所有的点上一个统一的颜色。博客长期更新,本文最近更新时间为:2025年1月1日。

点云侠的博客 37万+

Android IMF学习笔记(转载)

IMF是input method framework的简称, 它是Android 1.5新添加进去的一个重要功能,用来支持软键盘、各种的输入法。到目前位置(2009-04-03),Android 1.5还没有正式发布,但IMF的功能已经很稳定,其上已经存在有3种输入法。分别是LatinIME(软键盘)、 OpenWnn(CJK输入法)、PinyinIME(GOOGLE 拼音),还缺少中文...

weixin_30487317的博客 184

get_ccopt系列命令介绍

get_ccopt_property:用来获取cts阶段,clock tree上所有的参数信息,可以通过get_ccopt_property –help *获取所有参数。get_ccopt_skew_group_delay:用来获取skew group的相关信息,可以通过筛选出特定条件下skew_group的参数,如skew_group下latency最长是多少;get_ccopt_clock_tree_source_groups:获取clock tree的source group名字;

芯冰乐 280

注意力机制模块:二次创新:CBAM 与 ECA 融合形成 CECA 模块,参数量减少 40%

文章摘要: 本文提出一种轻量化注意力模块CECA,通过融合CBAM和ECA的优势解决模型部署中的精度与速度矛盾。CBAM虽具备通道和空间双重注意力,但参数量大;ECA轻量但缺乏空间注意力。CECA采用ECA的一维卷积替换CBAM的通道注意力部分,保留其空间注意力模块,在保持双注意力能力的同时减少40%参数量。实验表明该方案在边缘设备部署中能维持精度并提升推理速度,特别适用于YOLO等目标检测模型的轻量化改进。文章详细拆解了架构设计、代码实现及参数量优化原理,为算法工程师和嵌入式开发者提供了实用解决方案。

ZXSXJ的博客 236

输入法浅谈

输入法浅谈

mart!nhu的博客 1940

基于YOLOv8的农作物病虫害检测系统设计与实现

国内如中国农业大学的科研团队采用改进的Faster R-CNN模型对小麦病害进行检测,取得了较好的效果。农作物病虫害是影响农业生产的重要因素之一,每年因病虫害导致的农作物减产高达20%-40%。YOLO(You Only Look Once)系列算法作为目标检测领域的代表性模型,以其高效、准确的特点在众多领域得到广泛应用。YOLOv8作为该系列的最新版本,在精度和速度上都有显著提升,非常适合农作物病虫害检测这类需要实时处理的应用场景。然而,现有研究仍存在一些不足:一是模型复杂度高,难以部署到移动设备;

YOLO 794

LatinIME 设置默认语言

在settinglibs中找到InputMethodAndSubtypeEnablerManager.java 可以查看控制 默认打开语言选项的类 不同方案可能不成功 方法一: -: 命令进入原生setting中语言选择界面, 或命令直接打开:am start -ncom.android.inputmethod.latin/.settings.SettingsActivity ...

qq_19447521的博客 1295

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

LatinIME默认打开各国语言

android/packages/inputmethods/LatinIME/java/res/xml/method.xml中有定义的。中packages\inputmethods\LatinIME\java\res\xml\method.xml可以看到对应的值。英文(en_US) 0xc9194f98 -921088104。阿拉伯文(ar) 0x590dde40 1494081088。

zhaoyufei133的博客 1447

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

快速搭建一款输入法(封装输入法引擎)

输入法最核心的是输入法引擎,输入法引擎负责加载和管理输入法配置和输入法的词库,输入法引擎对用户输入的拼音字符串进行处理并返回对应的候选列表。通过引入输入法引擎我们就可以将我们输入法的拼音串转换成对应的中文候选了。 这里我不建议用户自己开发输入法引擎,这个难度还是很大的,涉及到了音节拆分和智能组词等等。如果是简单的使用的话,采用开源的输入法引擎库就行,这里我采用的是谷歌的开源输入法引擎,引擎项目的地址如下: GitHub - lelelongwang/GooglePinyinIME: Google 拼音输

yang1fei2的博客 4207

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

LatinIME输入法分析

<br /><br />输入法的设置在res/xml/method.xml的<input-method>标签中,主要设置两个属性:<br />android:settingsActivity,输入法的设置程序入口。<br />android:isDefault,这个输入法是不是系统的默认输入法。<br /> <br />另外,如果输入法的apk直接push到/system/app/下面的话,算是系统输入法,如果是以第三方程序的方式安装到/data/app/下面的话,算是第三方输入法,两个输入法目前来看,最大

农场老马的专栏 2万+

qt平台集成google拼音中文输入法

qt自5.7.0版本后自带了qtvirtualkeyboard模块,在示例程序里面用过输入法demo,确实很赞,支持各国语言的输入法,中文输入法集成的google智能拼音,支持模糊拼音输入。很遗憾的是它只能在基于QML的应用平台上使用,在传统的Qt widgets应用上无法使用。 在Qt安装目录下qtvirtualkeyboard模块里面,可以找到google拼音源码,通过它来实现基于googl...

清心永恒的博客 6624

Android源码配置默认输入法

声明 Android源码修改默认输入法 关于配置默认输入法的包名和类名声明**郑重声明:博文为原创内容,可以转载或引用,但必须在明显位置标明原文作者和出处,未经同意不得擅自修改本文内容!博客地址:http://blog.youkuaiyun.com/luzhenrong45**Android源码修改默认输入法Android原生源码编译出来的系统,一般预置的是是Android原生的输入法LatinIME,如果要在

一路到黑 1万+

android输入法问题

1 谷歌输入法     包名:com.google.android.inputmethod.latin   属于第三方输入法   LatinIME软键盘 OpenWnn CJK输入法 PinyinIME GOOGLE输入法   2 修改系统默认输入法 打开输入法,点击默认的输入法:例如谷歌输入法。然后adb remount,打开eclipse,查看相应的数据库,导出数据库,查

格物的专栏 4914

Google原生输入法LatinIME词库扩容(Windows10环境)

去年在Linux(ubuntu)环境下针对LatinIME进行词库扩容处理,针对LatinIME的词库构建进行了一些列分析,大家可以查阅历史文章。词库扩容最近试了一下是可以的,具体流程大致如下(windows10环境): 1、安装MinGw以及gcc、g++、gdb等,下载地址:e795, 安装完成配置环境变量到path(..\mingw\bin) 2、进入到..\cpp\command目录进行make windows下没有make命令的,需要到MinGw\bin目录下重命名mingw32-mak

camel@Y blog 2385
上一篇: Google原生输入法LatinIME词库构建流程分析(二)
下一篇: LKD-Linux系统进程管理
杨鑫校
博客等级 码龄11年 24粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值