• Android源码剖析之Framwork层后记篇(硬件消息传递、apk管理、输入法框架、编译过程)



     本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!


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

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

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


    硬件的消息,由触屏和按键触发,通过驱动处理,形成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);


    程序包管理:包含三块,提供具体组件的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,格式非固定,叫做刷机过程。


  • 相关阅读:
    数据库路由中间件MyCat
    MyCat
    网页动画师与技术开发,如何精准高效的协作完成动效。
    JAVA异常的最佳工程学实践探索
    MySQL导入.sql文件及常用命令
    如何申请新浪SAE,发布自己的网站
    新手教程: 如何在新浪云计算SAE里部署代码
    微信公众平台开发(一) 配置接口
    SQL数据库面试题以及答案
    Sql Server之旅——终点站 nolock引发的三级事件的一些思考
  • 原文地址:https://www.cnblogs.com/fengju/p/6174386.html
Copyright © 2020-2023  润新知