zoukankan      html  css  js  c++  java
  • 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,格式非固定,叫做刷机过程。


  • 相关阅读:
    Vasya and Endless Credits CodeForces
    Dreamoon and Strings CodeForces
    Online Meeting CodeForces
    数塔取数 基础dp
    1001 数组中和等于K的数对 1090 3个数和为0
    1091 线段的重叠
    51nod 最小周长
    走格子 51nod
    1289 大鱼吃小鱼
    POJ 1979 Red and Black
  • 原文地址:https://www.cnblogs.com/fengju/p/6174386.html
Copyright © 2011-2022 走看看