既然写到后记篇,就代表本系列到此为止,暂时告一段落;其他一些Manager随后有时间再补,就像源码的一些翻译一样,有时间总会补上的,同时也希望大家一如既往的喜欢,直言不讳的提出宝贵意见。

后记将讲述输入模块和编译系统内容,以及对整个系统的总结。

一言不合就来图,且看下图,有关硬件消息传递-以下是消息在硬件中处理后如何传递到Window层的过程

android 多元输入法 android输入法框架_输入法

硬件的消息,由触屏和按键触发,通过驱动处理,形成Up、Down、Move这样的事件,然后再把消息分发到KeyQ类中,

由InputDispatcher读取后发给用户,API层处理消息形成长按、点击、轻触等系统定义事件,到底是Window层先处理还是View层

先处理,这由手机原始设计决定,除特殊配置按键外,均由View层处理,然后到ViewGoup,到Activity,这样传递出来。

有关资源访问:

data/app:apk被复制后的目录,系统应用放在system/app目录下

data/dalvik-cache:class.dex的存放目录或odex

data/data:数据安装的路径

attr用来设置一些视图的属性

资源的访问可以通过context或packageManager的方法实现(id小于0x1000,0000是系统资源,大于0x7000,0000的是应用资源,

而更换系统主题也可以使用这招,判断获取的资源是01开头,则返回07开关的;同样可以替换AssetManager的路径,通过修改

framework-res.apk实现,不建议使用)

String OrginalName=getResourceEntryName(orginalId);

int newId=getIdentifier(OrginalName,……);

String newName=getString(newId);

android 多元输入法 android输入法框架_编辑框_02

程序包管理:包含三块,提供具体组件的intent,进行权限检查,提供安装删除的癌

PMS和其他Manager一样,运行在SystemServer进程中,使用/system/etc/permissions管理系统和应用权限和platform.xml管理应用的pid和uid,使用/data/system/packages.xml保存安装包基本信息:名字、路径、权限等,使用DefaultContainerService将apk复制到data/app目录下,使用Installer服务(localSocket)将文件解压出来、创建数据目录,data/dalvik-cache和data/data

应用程序的权限有四种,默认为普通,危险会提示,签名要一致,系统指系统签名才可以;证书指meta-inf下默认文件,可指定可多个,首个需要key值为2390个16进制值来自证书;签名一个应用只能有一个,可包含多个证书;shared-user指定共享用户id对应的签名和权限

platform包含group标签(应用群组)、permission标签、assign-permission标签(将权限加入系统,用于群组)、library标签(依赖文件)、feature标签(wifi camear location sensor bluetooth touchscreen); 提取dex过程包含,解析platform.xl、验证签名到保存data/dalvik-cache中,最后提取Service、Receiver、Activity、Broadcast等;安装过程包含检查package.xml是否存在,然后读取mSettings.mPackages,决定是否创建package.xml,加入并生成新的package.list,由handlerParams下两个InstallParams和MoveParams完成。

软件的安装和删除,基本上应用层也做不了什么,因此也不再画图和详细介绍,仅仅讲一些知识点。安装使用PackageManger的installPackage方法卸载deletePackage方法,当然后续都是异步执行的,检查权限、删除目录和缓存、发出广播、终止进程,完。packageURI是安装路径,系统安装可以用adb push放置apk到system/app目录下,而一般应用只能用adb install 安装到data/app目录下。

关于如何启动四大组件,应用被安装后,这些组件的intent-filter均被放入ContentResolver,通过intent的query方法找到一一对应的组件。

输入法框架-Input Method Framework

输入法有效贯彻Jni的使用原则,由服务端和客户端两块组成,即保证安全性又保证流畅性,详见:Android高级第十讲之AIDL与JNI

IMF的核心思想类似:使用Service后台进程的方式运行和窗口创建,将监听到的输入内容传递到编辑框。

咱们从以下几个重要组件说起:

IMF:Input Method Framework 输入法框架

IM:Input Method 具体输入法

IMS:Input Method Service 具体输入法服务。记录输入法是否添加、输入区是否显示、当前窗口显示状态等具体事宜

IMM:Input Method Manager 具体输入法管理实例。包含两个Binder,一个将按键消息发给编辑框,一个用于IMMS访问客户

进程、管理IM的显示和隐藏。记录输入法的名字、是否已经启动、当前服务窗口

IMMS:Input Method Manager Service 具体输入法管理服务:记录IMM对象、焦点窗口、连接两者的Binder

IME:Input Method Engine 具体输入法引擎(泛指以上内容)

Binder对象对应的类如下:

InputConnection:接口,定义编辑框需提供的函数,被IM通过Binder调用

IInputMethodClient:aidl,Binder本地代理,指向IMMS接口,以便向客户端传递与输入法相关的信息

InputMethodSession:接口,定义IMM直接访问IM的接口

InputMethod:输入法提供的API接口 如何交互、传递参数、解析数据

输入法操作分三块:启动、显示和切换,启动指IMS(两个服务Binder,一个IMS创建,一个客户端创建,分别用于和对方

交互),显示指与客户端交互(将焦点从Wms那里拿过来、调用IMM的showSoftInput、调用IMM的windowGainedFocus-位置

固定显示在编辑框下面),切换不言而喻(不同输入法即apk,通过setting设置)

如何自定义输入法?-厂商可自定义的三个Binder

IInputContext:编辑框的Binder对象,不能自定义但可以重写onCreateInputConnection来返回自定义的InputConnection窗口,

用于读取、插入和替换字符,以及添加和删除字符

IInputMethod:IMS的Service启动后返回的Binder,被IMMS调用,用于直接与输入法交互

IInputMethodSession:IMMS请求IMS创建的Binder,用于客户端调用

KeyBoard.java用于将按键位置转换成键值,再由IMS转化成相应的提示字符,输入法是一个新窗口或者叫系统窗口,区别于

Activity的应用窗口。

Rom编译知识:

.mk文件和各种shell脚本共同定义编译框架,基于make概念;几年前用cygwin做完一些so库的编译,非常麻烦,可能没做过C

开发的原因,写一些“.h”、“.c”文件,定义c与java交互原则,最终被放弃了。

源文件包括:资源、aidl源、java源、java静态库、Java共享库,通过dx工具通过aapt命令将jar打成dex文件;关于签名,

是用来认证的,而且可被多次签名;zipalign优化Apk内部存储,对内部数据进行边界对齐。

Framework包含的重要文件

framework.jar:.java变.class,最终变dex的文件-系统apk,可以不用;包含android.jar

core.jar:Java库文件

ext.jar:扩展类库

framework-res.apk:需要使用的各种资源

上面有讲资源01开头的是Framework资源,07是应用资源,而02指 非应用资源。01-attr资源,02-drawable资源,

03-layout资源,04-string资源,使用public.xml记录id与资源对应关系

Rom有两种,linux内核和Android所需的;Cpu包含地址总线和数据总线,前者用于输出CPU访问的地址信息,后者用于传输

CPU要读写的数据;CPU采用ARM内核,地址总线32位,支持最大存储空间4G:

SRam:最早期异步存储器,512kb、1M的映射存储

Nand Flash:U盘,SD卡,一般仅需4个地址就能支持16G数据映射,因为它有二次引导内存

SDRam:同步RAM,访问速度快,仅比SRAM好一点

外设地址:显示器、键盘等,PC分南桥(低速器件)和北桥(高速器件)、中内存这样三组总线,而嵌入式仅使用一组总线,这是由

CPU运行速度和特别支持决定,CPU上会有一小段引导程序无法改变

一般NAND支持的二次引导内存在2M以内,存储在NAND设备中,不能格式为FAT32(否则失效),可以识别以太网口,具备

USB接口驱动,使用fastboot,读取Ext分区中的update.zip,这也是通过USB连接PC完成的,也是为什么系统更新包只能放在SD卡

中而不能放入内存卡中的原因,其中的内存卡映射路径:

boot:linux内核,空间为8M

recovery:保存boot原始数据,也是8M,相当于boot原始复制品

Radio:无线通讯模块,程序处理器提供给用户界面,基带处理器提供底层无线通讯;多媒体处理器完成音视频解码

system:内核,各种所需驱动库、应用程序,大小约500M

data:应用程序所需或解压出的文件,约1G

sdcard:外置内存卡

一般将boot.img、system.img写入Rom,格式非固定,叫做刷机过程。