Android Framework 相关

Android Framework 相关

1、Android 系统架构

1.应用程序层
这一层一般我们最为熟悉了,我们平常开发安卓用java编写的app都属于这一层,当然系统自带的程序比如时钟、email等都是属于这一层
2.应用程序框架层(Framework)
这一层是核心应用程序所使用的API框架,为应用层提供各种接口API,包括各种组件和服务来支持我们的安卓开发,包括ActivityManager,WindowManager,ViewSystem等我们讲到AndroidFramework时很经常要提到的东西。
3.系统运行库层1)原生 C/C++ 库

许多核心 Android 系统组件和服务(例如 ART 和 HAL)构建自原生代码,需要以 C 和 C++ 编写的原生库。Android 平台提供 Java 框架 API 以向应用显示其中部分原生库的功能。例如,您可以通过Android 框架的 Java OpenGL API 访问 OpenGL ES,以支持在应用中绘制和操作 2D 和 3D图形。如果开发的是需要 C 或 C++ 代码的应用,可以使用 Android NDK 直接从原生代码访问某些原生平台库。

2)Android Runtime

对于运行 Android 5.0(API 级别 21)或更高版本的设备,每个应用都在其自己的进程中运行,并且有

其自己的 Android Runtime (ART) 实例。ART 编写为通过执行 DEX 文件在低内存设备上运行多个虚拟

机,DEX 文件是一种专为 Android 设计的字节码格式,经过优化,使用的内存很少。编译工具链(例

如 Jack)将 Java 源代码编译为 DEX 字节码,使其可在 Android 平台上运行。

ART 的部分主要功能包括:

预先 (AOT) 和即时 (JIT) 编译

优化的垃圾回收 (GC)

更好的调试支持,包括专用采样分析器、详细的诊断异常和崩溃报告,并且能够设置监视点以监控特定字段

4.Linux内核层
安卓系统基于Linux内核这个我们都知道,Android 的核心系统服务依赖于 Linux 2.6 内核,如安全性,内存管理,进程管理, 网络协议栈和驱动模型。 Linux 内核也同时作为硬件和软件栈之间的抽象层。

2View 的事件分发机制?滑动冲突怎么解决?

Activity 的构成

一个 Activity 包含了一个 Window 对象,这个对象是由 PhoneWindow 来实现的。PhoneWindow 将DecorView 作为整个应用窗口的根 View,而这个 DecorView 又将屏幕划分为两个区域:一个是 TitleView,另一个是 ContentView,而我们平时所写的就是展示在 ContentView 中的。

被分发的对象

被分发的对象是那些?被分发的对象是用户触摸屏幕而产生的点击事件,事件主要包括:按下、滑动、抬起与取消。这些事件被封装成MotionEvent对象。该对象中的主要事件如下表所示:

事件触发场景单次事件流中触发的次数
MotionEvent.ACTION_DOWN在屏幕按下时1次
MotionEvent.ACTION_MOVE在屏幕上滑动时0次或多次
MotionEvent.ACTION_UP在屏幕抬起时0次或1次
MotionEvent.ACTION_CANCLE滑动超出控件边界时0次或1次

按下、滑动、抬起、取消这几种事件组成了一个事件流。事件流以按下为开始,中间可能有若干次滑动,以抬起或取消作为结束。

分发事件的组件

分发事件的组件,也称为分发事件者,包括Activity、View和ViewGroup。它们三者的一般结构为:

事件分发者结构

从上图中可以看出,Activity包括了ViewGroup,ViewGroup又可以包含多个View。

组件特点举例
Activity安卓视图类如MainActivity
ViewGroupView的容器,可以包含若干View各种布局类
ViewUI类组件的基类如按钮、文本框
事件分发机制
Android事件处理的三个重要函数

Android事件分发机制主要由“事件分发”—>“事件拦截”—>“事件响应”这三步来进行逻辑控制的。本文也将从这三步对应的函数来分析。

(1) 事件分发:public boolean dispatchTouchEvent(MotionEvent ev)

当监听到有触发事件时,首先由Activity进行捕获,然后事件就进入事件分发的流程。Activity本身没有事件拦截,从而将事件传递给最外层的View的dispatchTouchEvent(MotionEvent ev)方法,该方法将对事件进行分发。

  • return true : View消费所有事件。
  • return false :停止分发,交由上层控件的onTouchEvent方法进行消费,如果本层控件是Activity,那么事件将被系统消费、处理。
  • super.dispatchTouchEvent(ev): 将事件交由本层的事件拦截onInterceptTouchEvent方法处理。
(2)事件拦截:public boolean onInterceptTouchEvent(MotionEvent ev)
  • return true: 对事件拦截,交由本层的onTouchEvent进行处理。
  • return false: 不拦截,分发到子View,由子View的dispatchTouchEvent方法处理。
  • super.onInterceptTouchEvent(ev):默认表示事件拦截,交由本层的onTouchEvent进行处理。
(3)事件响应:public boolean onTouchEvent(MotionEvent ev)
  • return true: 表示onTouchEvent处理完事件后消费了此次事件。
  • return false: 不响应事件,不断的传递给上层的onTouchEvent方法处理,直到某个View的onTouchEvent返回true,则认为该事件被消费。如果到最顶层View还是返回false,那么该事件不消费,将交由Activity的onTouchEvent进行处理。
  • return: super.onTouchEvent,不响应事件,结果与return返回false一样。

在这里插入图片描述

事件传到Activity,首先调用其dispatchTouchEvent方法,其会传递给子View处理,该子View(在图中是ViewGroup)会调用其dispatchTouchEvent方法,如果该方法被覆写直接返回TRUE,则立即返回Activity,表示已经消费事件。如果该方法没有被覆写或调用了super的同名方法,则会调用onInterceptTouchEvent方法,如果该方法返回TRUE拦截事件,则交给自身的onTouchEvent处理,如果该方法返回FALSE不拦截,则继续传给子子View(图中是View)的dispatchTouchEvent方法处理。此时,再看看这个U型图,该递归调用已经到底了,若在该方法中的onTouchListener方法不处理,则调用自身的onTouchEvent处理。若还是处理不了,则从递归底部向上返回,依次调用ViewGroup的、Activity的onTouchEvent方法。

https://www.cnblogs.com/chengxuyinli/p/9979826.html

如何解决 View 的事件冲突?

常见开发中事件冲突的有 ScrollView 与 RecyclerView 的滑动冲突、RecyclerView 内嵌同时滑动同一方向。

滑动冲突的处理规则:对于由于外部滑动和内部滑动方向不一致导致的滑动冲突,可以根据滑动的方向判断谁来拦截事件。对于由于外部滑动方向和内部滑动方向一致导致的滑动冲突,可以根据业务需求,规定何时让外部 View 拦截事件,何时由内部 View 拦截事件。对于上面两种情况的嵌套,相对复杂,可同样根据需求在业务上找到突破点。

滑动冲突的实现方法:

外部拦截法:指点击事件都先经过父容器的拦截处理,如果父容器需要此事件就拦截,否则就不拦截。具体方法:需要重写父容器的 onInterceptTouchEvent 方法,在内部做出相应的拦截。

内部拦截法:指父容器不拦截任何事件,而将所有的事件都传递给子容器,如果子容器需要此事件就直接消耗,否则就交由父容器进行处理。具体方法:需要配合 requestDisallowInterceptTouchEvent 方法。

3、Android View的绘制流程

View 绘制中主要流程分为measure,layout, draw 三个阶段。

measure :根据父 view 传递的 MeasureSpec 进行计算大小。

layout :根据 measure 子 View 所得到的布局大小和布局参数,将子View放在合适的位置上。

draw :把 View 对象绘制到屏幕上。

https://blog.csdn.net/sinat_27154507/article/details/79748010

4、Android V1及V2签名原理

V1签名:
来自JDK(jarsigner), 对zip压缩包的每个文件进行验证, 不对zip本身校验,所以签名后还能对压缩包修改(移动/重新压缩文件) 对V1签名的apk/jar解压,在META-INF存放签名文件(MANIFEST.MF, CERT.SF, CERT.RSA),其中MANIFEST.MF文件保存所有文件的SHA1指纹(除了META-INF文件), 由此可知: V1签名是对压缩包中单个文件签名验证

V2签名:
来自Google(apksigner), 对zip压缩包的整个文件验证, 签名后不能修改压缩包(包括zipalign), 对V2签名的apk解压,没有发现签名文件,重新压缩后V2签名就失效, 由此可知: V2签名是对整个APK签名验证

V2签名优点很明显: 签名更安全(不能修改压缩包) 签名验证时间更短(不需要解压验证),因而安装速度加快

https://www.jianshu.com/p/5397ccbd2850

缩后V2签名就失效, 由此可知: V2签名是对整个APK签名验证

V2签名优点很明显: 签名更安全(不能修改压缩包) 签名验证时间更短(不需要解压验证),因而安装速度加快

https://www.jianshu.com/p/5397ccbd2850

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值