本文来自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,格式非固定,叫做刷机过程。

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

  1. Android源码剖析之Framwork层消息传递(Wms到View)

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 前面讲过Wms.Ams与Activity的一系列交互,包括创建过程.消息传递.窗口展示等,紧接上篇介 ...

  2. Android源码剖析之Framework层进阶版(Wms窗口管理)

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 上一篇我们主要讲了Ams,篇幅有限,本篇再讲讲Wms,即WindowManagerService,管 ...

  3. Android源码剖析之Framework层升级版(窗口、系统启动)

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 看本篇文章之前,建议先查看: Android源码剖析之Framework层基础版 前面讲了frame ...

  4. Android源码剖析之Framework层基础版(窗口、linux、token、Binder)

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 关于Framework,就是应用层底下的控制层,离应用层最近,总想找个机会,写写WindowMang ...

  5. Android源码剖析之Framework层实战版(Ams管理Activity启动)

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 讲到实战,就不得不拿两个例子来说明,本篇想拿的是应用最广泛的两个:Ams和Wms,一个管理activ ...

  6. 04 flask源码剖析之LocalStack和Local对象实现栈的管理

    04 LocalStack和Local对象实现栈的管理 目录 04 LocalStack和Local对象实现栈的管理 1.源码入口 1. flask源码关于local的实现 2. flask源码关于l ...

  7. Redis源码剖析

    Redis源码剖析和注释(一)---链表结构 Redis源码剖析和注释(二)--- 简单动态字符串 Redis源码剖析和注释(三)--- Redis 字典结构 Redis源码剖析和注释(四)--- 跳 ...

  8. Android源码树中C代码的编译

    侯 Sir说:“源码之下,了无秘密.” 但有些秘密还是要搞起来了看得更真切,仅从静态代码的体位很难体会到运动时的妙处.因此环境搭好了,下一步就是调试.gdbserver搭配gdb的调试环境走得很顺利, ...

  9. flask源码剖析系列(系列目录)

    flask源码剖析系列(系列目录) 01 flask源码剖析之werkzurg 了解wsgi 02 flask源码剖析之flask快速使用 03 flask源码剖析之threading.local和高 ...

随机推荐

  1. jQuery对象和DOM对象之间的相互转换

    DOM对象:DOM(Document Object Model,文档对象模型),每一份DOM都可以表示成为一棵树,DOM对象可以使用javascript中的方法. jQuery对象:jQuery对象就 ...

  2. POJ1780 Code(欧拉路径)

    n位密码,要用尽可能短的序列将n位密码的10n种状态的子串都包括,那么要尽量地重合. 题目已经说最短的是10n + n - 1,即每一个状态的后n-1位都和序列中后一个状态的前n-1位重合. 这题是经 ...

  3. 初识API函数

    我之前是一个只会编写数值计算的程序的OIer,但我并不甘于这种现状,于是我编写了我的第一个使用API函数的C++程序,开发平台是VS2012: // ConsoleApplication.cpp : ...

  4. BZOJ3829 : [Poi2014]FarmCraft

    d[x]表示走完x的子树并回到x所需的时间 f[x]表示从走到x开始计时,x子树中最晚的点安装完的最早时间 d[x]=sum(d[i]+2),i是x的孩子 f[x]的计算比较复杂: 考虑将x的各棵子树 ...

  5. 【wikioi】1018 单词接龙

    题目链接 算法:DFS+考你阅题 题目描述: 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中 ...

  6. WebRTC手记Channel概念

    转载请注明出处:http://www.cnblogs.com/fangkm/p/4401075.html 前面两篇博文完整地介绍了WebRTC音视频的采集模块,接下来应该开始介绍关键的音视频编码模块. ...

  7. BJOI2015 Day2

    轮到罗剑桥出题了 这是什么风格,中文名称与英文名称分明对不上吗233 T1: 似乎只会做这道题23333 A....BE ........ C....DF 据题意数学变形得A-C<=B-D,B- ...

  8. RN组件之ListView

    /** * Created by DaGuo on 2016/4/7. */ 'use strict' import React,{ Component, View, Text, ListView, ...

  9. asp.net 微信企业号办公系统-流程设计--流程步骤设置-按钮设置

    按钮设置是配置当前步骤的处理者可以执行哪些操作,每个按钮都有对应的执行脚本(javascript脚本). 从左边的按钮列表中选择当前步骤需要的按钮. 注意:如果是流程最后一步则要配置完成按钮而不是发送 ...

  10. Git 的使用感受

    Git 的使用感受 从开始工作到现在,在公司里面一直用 svn 来做版本管理.大约半年前听说了 Git,因为 Git 的光辉相当耀眼,作者是 Linus Torvalds,被大量的开源软件采用,如 j ...