android输入法02:openwnn源码解析01—输入流程
painn代码运行流程

painn代码运行流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!1. 数据准备收集和整理相关的数据,包括输入数据和目标输出数据。
Android核心分析15)Android输入系统之输入路径详解

Android用户事件输入路径1 输入路径的一般原理按键,鼠标消息从收集到最终将发送到焦点窗口,要经历怎样的路径,是Android GWES设计方案中需要详细考虑的问题。
按键,鼠标等用户消息消息的处理可分为不同的情况进行判定:(1)用户输入根据系统状况是否应该派送。
如在ScreenOff的情况下,在按键属于特殊按键的情况下等(2)是否有拦截Listener(3)对按键事件来讲,是否存在输入法(4)是否是焦点终点(5)是否为焦点切换按相关键这些情况都是设计输入路径需要考虑的基本条件。
一般的输入路径设计该输入路径实际上是指的按键消息(MSG_KEYDOWN,MSG_KEYUP,MSG_LongPress)的输入路径,即从活动主窗口到焦点窗口所经历的路程。
将信息输入路径分为两步:Step 1)窗口管理器将信息发送到活动窗口Step 2)活动窗口通过缺省处理函数将该消息一层层的传递到焦点。
这样应用程序可以在活动View的处理函数中来预先处理用户输入信息,从而增强应用对用户信息的控制力。
传递路径是通过View的缺省处理函数Onxxx来完成。
通过ActiveView ->focus->focus->focus的链条关系,一级一级的将按键消息MSG_KEYDO WN,MSG_KEYUP,MSG_CHAR等传递到focus窗口。
此时用户按键输入先发送到输入法窗口,经过输入法管理器处理,过滤后将输入法产生的结果放置到焦点View。
输入系统整体流程下面示意图是Android输入系统的数据流途径,通过WM的输入系统线程收集消息,分发到Focus Activity消息队列,然后通过消息系统派发。
2 Android输入路径详细描述第一步:用户数据收集及其初步判定KeyInputQ在WindowMangerService中建立一个独立的线程InputDev iceReader,使用Native函数readEvent来读取Linux Driver的数据构建Ra w E v e n t,放入到K e y Q消息队列中。
android输入法02:openwnn源码解析02—Keyboard和KeyboardView

android输入法02:openwnn源码解析02—Keyboard和KeyboardView本文主要介绍openwnn对Keyboard和KeyboardView的处理。
这一部分主要涉及三个类:InputViewManager.java,DefaultSoftKeyboard.java,DefaultSoftKeyboardJAJP.java。
其中InputViewManager是与键盘相关的对外接口,DefaultSoftKeyboard是通用类,DefaultSoftKeyboardJAJP是日文定制类。
1、InputViewManager第一步我们先来看看InputViewManager。
这个接口类代码很简单:[java]view plaincopy1./**2. * The interface of input view manager used by OpenWnn.3. *4. * @author Copyright (C) 2009 OMRON SOFTWARE CO., LTD. All Rights Reserved.5. */6.public interface InputViewManager {7. /**8. * Initialize the input view.9. *10. * @param parent The OpenWnn object11. * @param width The width of the display12. * @param height The height of the display13. *14. * @return The input view created in the initialize process; {@code null} if cannot create a input view.15. */16. public View initView(OpenWnn parent, int width, int height);17.18. /**19. * Get the input view being used currently.20. *21. * @return The input view; {@code null} if no input view is used currently.22. */23. public View getCurrentView();24.25. /**26. * Notification of updating parent's state.27. *28. * @param parent The OpenWnn object using this manager29. */30. public void onUpdateState(OpenWnn parent);31.32. /**33. * Reflect the preferences in the input view.34. *35. * @param pref The preferences36. * @param editor The information about the editor37. */38. public void setPreferences(SharedPreferences pref, EditorInfo editor);39.40. /**41. * Close the input view.42. */43. public void closing();44.}从这个接口文件中,我们可以看出在输入法处理中,对于键盘部分需要涉及的操作并不是很多。
【转】Android编译系统详解(三)——编译流程详解

【转】Android编译系统详解(三)——编译流程详解原⽂⽹址:本⽂原创作者: 欢迎转载,请注明出处和1.概述编译Android的第三步是使⽤mka命令进⾏编译,当然我们也可以使⽤make –j4,但是推荐使⽤mka命令。
因为mka将⾃动计算-j选项的数字,让我们不⽤纠结这个数字到底是多少(这个数字其实就是所有cpu的核⼼数)。
在编译时我们可以带上我们需要编译的⽬标,假设你想⽣成recovery,那么使⽤mka recoveryimage,如果想⽣成ota包,那么需要使⽤mka otapackage,后续会介绍所有可以使⽤的⽬标。
另外注意有⼀些⽬标只是起到修饰的作⽤,也就是说需要和其它⽬标⼀起使⽤,共有4个⽤于修饰的伪⽬标:1) showcommands 显⽰编译过程中使⽤的命令2) incrementaljavac⽤于增量编译java代码3) checkbuild⽤于检验那些需要检验的模块4) all如果使⽤all修饰编译⽬标,会编译所有模块研究Android编译系统时最头疼的可能是变量,成百个变量我们⽆法记住其含义,也不知道这些变量会是什么值,为此我专门做了⼀个编译变量的参考⽹站,你可以在该⽹站查找变量,它能告诉你变量的含义,也会给出你该变量的⽰例值,另外也详细解释了编译系统⾥每个Makefile的作⽤,这样你在看编译系统的代码时不⾄于⼀头雾⽔。
编译的核⼼⽂件是和,main.mk主要作⽤是检查编译环境是否符合要求,确定产品配置,决定产品需要使⽤的模块,并定义了许多⽬标供开发者使⽤,⽐如droid,sdk等⽬标,但是⽣成这些⽬标的规则主要在Makefile⾥定义,⽽内核的编译规则放在build/core/task/kernel.mk我们将先整体介绍main.mk的执⾏流程,然后再针对在Linux上编译默认⽬标时使⽤的关键代码进⾏分析。
Makefile主要定义了各个⽬标的⽣成规则,因此不再详细介绍它的执⾏流程,若有兴趣看每个⽬标的⽣成规则,可查看2. main.mk执⾏流程2.1 检验编译环境并建⽴产品配置1) 设置Shell变量为bash,不能使⽤其它shell2) 关闭make的suffix规则,rcs/sccs规则,并设置⼀个规则: 当某个规则失败了,就删除所有⽬标3) 检验make的版本,cygwin可使⽤任意版本make,但是linux或者mac只能使⽤3.81版本或者3.82版本4) 设置PWD,TOP,TOPDIR,BUILD_SYSTEM等变量,定义了默认⽬标变量,但是暂时并未定义默认⽬标的⽣成规则5) 包含,该makefile定义了两个⽬标help和out, help⽤于显⽰帮助,out⽤于检验编译系统是否正确6) 包含,config.mk作了很多配置,包括产品配置,包含该makefile后,会建⽴输出⽬录系列的变量,还会建⽴PRODUCT系列变量,后续介绍产品配置时,对此会有更多详细介绍7) 包含,该makefile会包含所有⼯程的CleanSpec.mk,写了CleanSpec.mk的⼯程会定义每次编译前的特殊清理步骤,cleanbuild.mk会执⾏这些清除步骤8) 检验编译环境,先检测上次编译结果,如果上次检验的版本和此次检验的版本⼀致,则不再检测,然后进⾏检测并将此次编译结果写⼊2.2 包含其它makefile及编译⽬标检测1) 如果⽬标⾥含有incrementaljavac,那么编译⽬标时将⽤incremental javac进⾏增量编译2) 设置EMMA_INSTRUMENT变量的值,emma是⽤于测试代码覆盖率的库3) 包含,该makefile定义了许多辅助函数4) 包含,该makefile定义了⾼通板⼦的⼀些辅助函数及宏5) 包含,该makefile定义了优化dex代码的⼀些宏6) 检测编译⽬标⾥是否有user,userdebug,eng,如果有则告诉⽤户放置在buildspec.mk或者使⽤lunch设置,检测TARGET_BUILD_VARIANT变量,看是否有效7) 包含, PDK主要是能提⾼现有设备升级能⼒,帮助设备制造商能更快的适配新版本的android2.3 根据TARGET_BUILD_VARIANT建⽴配置1) 如果编译⽬标⾥有sdk,win_sdk或者sdk_addon,那么设置is_sdk_build为true2) 如果定义了HAVE_SELINUX,那么编译时为build prop添加属性ro.build.selinux=13) 如果TARGET_BUILD_VARIANT是user或者userdebug,那么tags_to_install += debug 如果⽤户未定义DISABLE_DEXPREOPT为true,并且是user模式,那么将设置WITH_DEXPREOPT := true,该选项将开启apk的预优化,即将apk分成odex代码⽂件和apk资源⽂件4) 判断enable_target_debugging变量,默认是true,当build_variant是user时,则它是false。
Android平台输入法开发解析

Android平台输入法开发解析Android平台自1.5版本之后开放了输入法框架(Input Method Framework,IMF),IMF 是Android平台的特色设计。
它的出现,为诞生不带实体键盘的设备提供了可能。
同时,IMF 开放了Android平台输入法的开发接口,为Android平台的输入法提供了可扩展性。
本文首先介绍Android平台IMF的构成、工作机制和流程,以便广大开发者能够更好的理解Android平台是如何实现文字输入。
接下来,将以一个简单的例子,介绍如何进行简单的输入法开发,开发者应该可以对Android平台的输入法开发形成一个初步的认识。
1.Android平台IMF简介Android平台的IMF按照功能分为三个主要模块,分别为:客户端控件,输入法服务(IMMS),以及输入法应用(IME)。
如果要深刻的理解和掌握Android平台的输入法开发技巧,那么必须要了解Android平台IMF内部各个模块之间的工作机制。
客户端控件,是指具有文字编辑功能的系统控件(如EditText),是平台内部输入法应用人机交互的起点。
输入法服务,是Android平台的底层基础服务之一,负责管理输入法,包括输入法的安装、注册、激活等。
输入法应用,则是指平台内预置,或者后续安装的输入法程序。
三个模块间的交互关系如下:下面我们将分别介绍以上三个模块,并简要介绍各模块内主要使用的对象和服务。
1.1客户端控件Android平台的客户端控件主要是TextView及其子类。
客户端控件是输入法人机交互的起点。
客户端控件与输入法服务和输入法应用都有交互操作。
以EditText为例,当客户端控件接受到焦点时,控件启动输入法应用并显示键盘;而失去焦点时,则隐藏键盘。
另外,EditText控件收到长按事件时,弹出输入法选择菜单。
这类操作属于客户端控件与输入法服务间的交互。
此外,客户端控件还可以向输入法应用传递文本状态,包括光标位置、文本选择等;接受并显示输入法应用反馈的输入文字。
Android核心分析(14)------ Android GWES之输入系统

Android输入系统依照惯例,在研究Android输入系统之前给出输入系统的本质描述:从哲学的观点来看,输入系统就是解决从哪里来又将到哪里去问题。
输入的本质上的工作就是收集用户输入信息并放置到目标位置。
Android在源代码分类上,并没有输入系统分类。
本章的输入系统研究是一个综合的分析,前面的GWES的分析,特别是View的Focus Path以及Window Manager Proxy是本章分析的基础,如果没有理解,请参阅前面的窗口管理的相关章节。
Android输入系统的组成输入系统由如下几部分组成:1)后台窗口管理服务2)Focus Activity3)Focus Window4)Focus View:用来接收键盘消息从输入系统这个角度去看Android的Window Manager服务解决了用户信息输入收集,而FocusActvitiy,Focus Window、Focus View这些概念的设计是为了解决用户输入应该放到哪里去这个问题。
在整个Android系统中,同时只有一个一个Focus Window,而属于该Window的Focus View才是真正的Focus View。
在Android系统中,在设计上要求多个Actvitiy同时存在运行。
在实现中,每次把Actvitiy 变成Focused Actvitiy时(setFocusedActivity@ActivityManagerService.java)激活程序的时候,就把该Activity的主窗口设置成前景窗口,即系统中的顶层窗口,AppToken概念的引进就是为了解决窗口对象的归属问题。
在这个过程中,在逻辑上看,我们挑选了一个Activity作为了Focus Activity来接收系统的消息,实质上这个Focus Activity的Focus窗口就是前景窗口。
Focus窗口的改变将改变焦点View,前景窗口的改变也将引起焦点View的变化。
手机输入代码

MTK平台手机指令大全设置指令:*#66*#中文语言:*#0086# + send查看版本:*#8375#软件版本:*#8882#测试:*#87#调试:*#8899# (?)默认语言:*#0000#+通话键设置英文:*#0044#+通话键繁体中文:*#0886#+通话键简体中文:*#0086#+通话键串号查询:*#06#原厂设置:*#66*#查看版本:*#8375#工厂指令:*#3646633#自动测试:*#87#软件版本:*#8882#*#035670766*001#*#035670766*002#有一些机器开机输入*#66*#不进测试的。
可以在开机瞬间,在按键灯亮和开机音乐响的时候快速按*#*#............*#就可进入测试科达Q191(MT6228平台)有些好象不支持,可惜啊..........诺基亚是国际知名手机品牌,它在中国市场上一直占据着很大一部分销售份额。
诺基亚手机拥有着时尚的外观和强大的功能,尤其是它出色的性能,经久耐用。
是赢得很多消费者喜爱的主要原因。
不少消费者在购买诺基亚手机之后,都会拿着说明书仔细阅读使用说明。
然而,不管是什么牌子的手机除了说明书上的那些说明文字之外,都还有很多用户并不知晓的操作命令!而这些使用命令却能够给我们的使用上提供很大的帮助。
1 输入*#06#:显示IMEI码2 输入*#0000#:显示软件版本 (部分型号如果不起作用,可按*#型号代码#,如*#6110#)第一行--软件版本;第二行--软件发布日期;第三行--手机型号3 输入*#92702689#查询更多的手机信息。
有五个选项(可用上下方向键选择):①Serial No.:手机的IMEI码。
②Made:手机的制造日期. (本人用的是诺基亚6108, 上面写的是092003, 即为2003年09月生产的 )③Purchasing Date:购买日期,此日期一经设定不可更改,新机子应该是mmyyyy④Repaired:维修次数的记录。
麦子学院Android开发教程输入事件流程

EventHub对输入设备进行了封装。
输入设备驱动程序对用户空间应用程序提供一些设备文件,这些设备文件放在/dev/input里面。
EventHub扫描/dev/input下所有设备文件,并打开它们。
1.bool EventHub::openPlatformInput(void)2.{3....4.mFDCount = 1;5.mFDs = (pollfd *)calloc(1, sizeof(mFDs[0]));6.mDevices = (device_t **)calloc(1, sizeof(mDevices[0]));7.mFDs[0].events = POLLIN;8.mDevices[0] = NULL;9.10.res = scan_dir(device_path);11....12.return true;13.}14.EventHub对外提供了一个函数用于从输入设备文件中读取数据。
1.bool EventHub::getEvent(int32_t* outDeviceId, int32_t* outType,2.int32_t* outScancode, int32_t* outKeycode, uint32_t *outFlags,3.int32_t* outValue, nsecs_t* outWhen)4.{5....6.while(1) {7.8.// First, report any devices that had last been added/removed.9.if (mClosingDevices != NULL) {10.device_t* device = mClosingDevices;11.LOGV("Reporting device closed: id=0x%x, name=%s\n",12.device->id, device->path.string());13.mClosingDevices = device->next;14.*outDeviceId = device->id;15.if (*outDeviceId == mFirstKeyboardId) *outDeviceId = 0;16.*outType = DEVICE_REMOVED;17.delete device;18.return true;19.}20.if (mOpeningDevices != NULL) {21.device_t* device = mOpeningDevices;22.LOGV("Reporting device opened: id=0x%x, name=%s\n",23.device->id, device->path.string());24.mOpeningDevices = device->next;25.*outDeviceId = device->id;26.if (*outDeviceId == mFirstKeyboardId) *outDeviceId = 0;27.*outType = DEVICE_ADDED;28.return true;29.}30.31.release_wake_lock(WAKE_LOCK_ID);32.33.pollres = poll(mFDs, mFDCount, -1);34.35.acquire_wake_lock(PARTIAL_WAKE_LOCK, WAKE_LOCK_ID);36.37.if (pollres <= 0) {38.if (errno != EINTR) {39.LOGW("select failed (errno=%d)\n", errno);leep(100000);41.}42.continue;43.}44.45.for(i = 1; i < mFDCount; i++) {46.if(mFDs[i].revents) {47.LOGV("revents for %d = 0x%08x", i, mFDs[i].revents);48.if(mFDs[i].revents & POLLIN) {49.res = read(mFDs[i].fd, &iev, sizeof(iev));50.if (res == sizeof(iev)) {51.LOGV("%s got: t0=%d, t1=%d, type=%d, code=%d, v=%d",52.mDevices[i]->path.string(),53.(int) _sec, (int) _usec,54.iev.type, iev.code, iev.value);55.*outDeviceId = mDevices[i]->id;56.if (*outDeviceId == mFirstKeyboardId) *outDeviceId = 0;57.*outType = iev.type;58.*outScancode = iev.code;59.if (iev.type == EV_KEY) {60.err = mDevices[i]->layoutMap->map(iev.code, outKeycode, outFlags);61.LOGV("iev.code=%d outKeycode=%d outFlags=0x%08x err=%d\n",62.iev.code, *outKeycode, *outFlags, err);63.if (err != 0) {64.*outKeycode = 0;65.*outFlags = 0;66.}67.} else {68.*outKeycode = iev.code;69.}70.*outValue = iev.value;71.*outWhen = s2ns(_sec) + us2ns(_usec);72.return true;73.} else {74.if (res<0) {75.LOGW("could not get event (errno=%d)", errno);76.} else {77.LOGE("could not get event (wrong size: %d)", res);78.}79.continue;80.}81.}82.}83.}84....85.}对于按键事件,调用mDevices->layoutMap->map进行映射。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
android输入法02:openwnn源码解析01—输入流程
之后要开始android日文输入法的测试,因此现在开始研究android输入法。
之前两篇文章已经对android自带的输入法实例softkeyboard的源码进行了解析。
这一系
列将开始学openwnn的源码。
openwnn是一家日本公司开发的开源输入法框架,涉及中文、日文、韩文。
目
前已经加入到了android源码之中。
因此你打开一个模拟器时,会发现其中有一个japanese ime的输入法,其服务名为openwnn,这个就是openwnn的日文输入法。
1、日文输入
本文章主要以日文输入法为主。
为了方便大家阅读,先对日文输入法做一个简
单的介绍:
•日文输入法分为罗马音输入法(类似中文拼音)和假名输入法(类似中文五笔)。
比如,你要输入”可愛“,则用罗马音输入,需要输入”kawai“,然后
在候选词中选择”可愛“;若使用假名输入,则需要输入”かわい“,在候选中
选择”可愛“。
•日文由平假名、片假名(分全角片假名和半角片甲名)和汉字组成。
通常学日语的人会说到50音图,就是日语50个平假名(与之对应有50个片假名)的读音。
其中平假名是由汉字演化而来的,类似于日文的拼音,比如”可愛
“的日文读音就是”かわい“。
片假名是由于外来语的入侵,原来平假名无法表
达所有的外文内容而设计的。
这里,如果你读到ComposingText.java这个类时,其中会涉及到三个输入层:
第一层为原始输入,比如输入的按键;第二层为假名层;第三层为最终显示结果,
一般为汉字与假名的混合体。
以前面那个例子,在罗马音输入法模式下,第一层
为”kawai“,第二层为”かわい“,第三层为”可愛“。
若你不懂日文的一些基本特点,这
一个地方有可能看不懂。
2、输入流程
2.1 android输入法输入流程
现在我们开始介绍输入流程。
从前面的文章对softkeyboard的分析(若你对输
入法不了解,请看前两篇介绍softkeyboard的文章,否则后面的内容很难看懂),
我们可以知道,输入法包括四个部分:Keyboard,KeyboardView,CandidateView,InputMethodService。
其中InputMethodService是前面三者的使用者,同时也设定
了输入流程。
android输入法的调用流程如下:
输入法在Android中的本质就是一个Service,假设用户刚刚启动Android,用
户移动焦点首次进入文本编辑框时,Android便会通知Service开始进行初始化工作。
于是便有了如图中的一系列动作。
追根溯源,onCreate方法继承至Service类,其意义和其他Service的是一样的。
Sample在这里,做了一些非UI方面的初始化,即字符串变量词汇分隔符的初
始化。
接下来执行onInitializeInterface,这里是进行UI初始化的地方,创建以后和配置修
改以后,都会调用这个方法。
Sample在这里对Keyboard进行了初始化,从XML
文件中读取软键盘信息,封装进Keyboard对象。
第三个执行的就是onStartInput方法,在这里,我们被绑定到了客户端,接收
所有关于编辑对象的详细信息。
第四个执行的方法是onCreateInputView,在用户输入的区域要显示时,这个
方法由框架调用,输入法首次显示时,或者配置信息改变时,该方法就会被执行。
在该方法中,对inputview进行初始化:读取布局文件信息,设置onKeyboardActionListener,并初始设置 keyboard。
第五个方法是onCreateCandidatesView,在要显示候选词汇的视图时,由框架
调用。
和onCreateInputView类似。
在这个方式中,对candidateview 进行初始化。
第六个方法,也是最后一个方法,即onStartInputView,正是在这个方法中,
将inputview和当前keyboard重新关联起来。
在上面的六个方法中,onCreateInputView和onCreateCandidatesView两个方
法只有在初始化时才会执行一次,除非有配置信息发生改变。
那么究竟什么是配置
信息发生改变呢?在看InputMethodService的API文档时,可以看到有一个方法onConfigurationChanged,根据文档解释,这个方法主要负责配置更改的情况。
2.2 相关类分析
openwnn中对上面这些流程的控制来自于两个类OpenWnn.java和OpenWnnJAJP.java,其中前者是通用接口,后者是对日文输入法的定制版。
我们
看一下第一个类OpenWnn.java。
其中的变量包括如下部分:
[java]view plaincopy
1./** Candidate view */
2.protected CandidatesViewManager mCandidatesViewManager = null;
3./** Input view (software keyboard) */
4.protected InputViewManager mInputViewManager = null;
5./** Conversion engine */
6.protected WnnEngine mConverter = null;
7./** Pre‐converter (for Romaji‐to‐Kana input, Hangul input, etc.) */
8.protected LetterConverter mPreConverter = null;
9./** The inputing/editing string */
10.protected ComposingText mComposingText = null;
11./** The input connection */
12.protected InputConnection mInputConnection = null;
13./** Auto hide candidate view */
14.protected boolean mAutoHideMode = true;
15./** Direct input mode */
16.protected boolean mDirectInputMode = true;
17.
18./** Flag for checking if the previous down key event is consumed by Ope
nWnn */
19.private boolean mConsumeDownEvent;
这些变量的作用如文字说明。
其中跟我们需要介绍相关的是InputViewManager和CandidatesViewManager,前者负责维护Keyboard和KeyboardView,后者负责维护CandidateView。
从这个类的方法中我们可以到其中主要是输入法生命周期方法以及输入法处理。
下面我们来看看OpenWnnJAJP.java,其中的公用方法为:
从这些方法中我们可以看到,这些方法主要也是应用输入法的处理流程中。
有需要的同学可以按照第一张输入法流程图对应的类来看看相关的
函数代码,就可以对其输入法流程有比较深刻的认识。