file和stream

[TOC]

File和Stream

Java io, okio, apk加固 okio封装socket

并发的 io

学习

整体设计要有自己的理解,

i/o的发展历史,

文件-》 FileOutputStream-》BufferedOutputStream -》

DataOutputStream可以具体获取字节类型

传递上下文,

view相关的用activity的context其他用getApplication(),

代理模式-》 对方法增强 代理模式对外部增强

装饰者设计模式-》 继承并进行扩展

包含 菱形的那个标志,是包含的意思

装饰设计模式,分析context

如何去学习,

为了装饰,所以把read抽象了起来, FileDescript —> 是newIO出来的

FilterOuputStream:就是为了持有OutputStream的装饰类 Decorator

FileOutputStream

BufferOutputStream-》 flush 进入才进入文件,当buffer满了也进行了一次flush,flush就是一次性把剩下的刷入到文件中。

flush写入文件, 在close的时候会自动flush进去

实现了closeable,重写close方法,可以自动释放

字符流和字符流,有个readLine() 这是核心区别

readNewLine

FilterWriter 是 SinglePerson类,跟FilterOuputStream不一样

字符有编码格式的,所以字符尽量读的时候用UTF-8来进行读写

FileWrite FileReader 只是转换用的

pipedWriter

非流操作

File

RandomAccessFile 指哪打哪

setLength 设置文件的长度,设置一个空文件长度

Seek 只是移动到10000,文件的长度还是0

协变, out-》 只读的

逆变: in是只写的

api processor anntation

类名获取,

对象去拿

ClassName

getDeclareMethod -> 获取当前类的所有方法

公开方法,静态方法,单例进行找hook点

  1. hook就是单例,或者 找hook点,然后去代理它

通过反射动态代理

  1. 分析hook点, 动态代理,还是静态代理

反射做什么呢

  1. 获取到getDefault 的原始对象

  2. 使用动态代理

    通过activity,最骚的是当前线程

    classloader, 获取当前线程的

    融入到framework里面

驱动装载可能会报找不到类异常???

欺骗ams,的检测,然后替换

Window 是什么

Window 和 activity 是什么关系

Window windowManager windowManagerService

如何通过WM 添加WIndow

Dialog 传入context ,如果你传入的是appcontext 会报错。

悬浮窗口:

window分为两个部分, 在应用进程内,wm处理后,然后再交给 wms处理

window是个抽象的概念,

window所有的view管理,怎么把view添加上去呢,怎么删除viewn呢

windowManager来管理这些。

PhoneWindow—>是具体window的实现类

PhoneWindow由windowManager,进行管理的
ViewManager接口 有 -> 添加view, 更新view, 删除view

windowManager,继承了ViewManager,具体实现类 WindowManagerImpl

最终 通过 WindowManagerGlobal来进行跟WMS通信

DecrView

布局参数: type,窗口类型:三种类型的窗口, 应用窗口的,子窗口,系统窗口

1-99, activity, 视图的最下层

子窗口, dialog, 1000-1999

系统window,如:toast和系统状态栏, 2000-2999 需要权限声明相关的,最上层

window的flags,事件穿透

window的softInputMode, 控制键盘弹出,其实

是系统窗口发生变化了

设置window的type,

悬浮窗口:

1.系统级别的 type, toast,状态栏什么的,用的时候会需要权限

校验,android N 系统窗口,权限验证

2.应用级别的

addwindow的时候需要权限验证

wms是其他服务初始化的 wms是管理窗口的

所有的view显示,需要在 DisplayThread.getHandler 进行处理

PhoneWindowManager里面进行权限控制

类似于相应码

设置成type_application 为2的type

达到目的,代价最小就好了。

显示在activity上面用type_application就可以了

system_alert_window 权限写入

还要设置flags

时间传递有关系

FlagNotfocusable, nottouachable

gravity 属性

添加,更新,移除

WM.添加view的过程

ActivityStackSupervisor
RealStartActivityLocked

ClientTransaction,

看代码,查找关键点

PhoneWindow

换肤公开课,有讲到。

子view都准备好了,没有显示

LounchActivityItem

ResumeActivityItem - > hanlde ResumeActivity

global添加,

ViewRootImpl view树的根,
测量,布局

, 子线程不能更新ui在ViewRootImpl中判断的

ViewRootImpl 跟WMS通信, IWindowSession addtoDisplay

-> Session.java里面去了

一个应用只有一个WindowManagerGlobal,

子窗口一定要有个token,然后显示

最终给 Surface 的服务


问老师个问题 三星开放出来的系统权限api 也有静默安装的 那些sdk怎么实现的 是不是也和这个技术有关系

CGlib,如果方法是final类型,就没办法代理了

Hal层会讲不 不知道这个是什么东西。 hal层,就是硬件抽象层

PKms也是跑在System_server进程中的

负责android系统中的安装 升级 卸载

对外提供统一的信息查询工呢,其中包含匹配某个intent的 activity,broadcast,service

pkms,在 引导服务中启动的, 继承IPackageManager.Stub

ServiceManager,里面去了

SystemServiceRegistry, 所有的service,其他binder,都用注册到ServiceManager中

所有binder, 所有的binder都能拿到它,地址为0的地址

getIServiceManager()就是获取了binder大管家

installPackagerManagerAsUser()

SystemServer是系统服务进程,里面启动很多系统service。通过BInder跨进程通信的方式来让app使用这些服务。ServiceManager是sdk提供的各种服务的大管家,通过get方式来拿service

SystemServiceManager里面一大把的服务

ServiceManager.addService()

PowerManagerService
一种继承SystemService

添加到ServiceManager.addService() ,相当于window上的注册表

真正的是在C++层的。

到ServiceManager里面进行注册

stub接收器

kerner那一块

serviceManager大管家

​ PackageManagerService : 构造方法真1000行代码。

​ 系统启动 会 apk安装的过程,所以手机应用多,速度越慢。

​ shareUserId (uid) 打电话的apk,

​ 系统默认安装,设置为android.uid.system, 要求要有系统签名,然后可以静默安装

​ PKMS.scanPackageLI() -> manifest文件扫描,存起来

​ installPackage 静默安装

​ aapt,资源映射表。

​ MergedManifest

​ 要签名才能进行安装

​ v1 v2 v3签名的区别

​ 需要android.uid.system

​ 静默安装: rom定制的,需要系统的厂商,可以进行静默安装。

​ 智能安装:就是不用自己点安装,vivo,oppo需要密码

​ apk打包过程,系统服务注册流程

​ Dropbox 日志系统。

​ handler:

​ 跟web开发的ajax有异曲同工之妙

​ 大大降低了开发难度
​ 几乎看不到多线程死锁问题

内存共享:

都是内存共享:
handler:核心思想,就是内存共享

mmap

final

static

一个线程 -》 另一个线程的数据, 线程间最终的通信是内存共享

Message /messageQueue /message/looper/ThreadLocal

内存管理设计思想优秀。 为什么没有wait和notify变量 线程通信

handler包揽所有的线程通信

最小知识原则:handler,

最后入队到了messageQueue

messageQueue.next

Looper.loop() 是thread调用的。

Looper.prepare()

装饰的话,就要装饰共有的接口,叫装饰者设计模式
线程里面的单例
如何实现线程数据的隔离, 线程的上下文独一无二

ThreadLocal

java容器,

剑指off的java面试题讲解真的不错,bat的面试官讲解

ThreadLocal 里面用数组来替换了map

就是 hash[index] hash[index + 1]

​ key value

​ hash[index] hash[index + 1]

通过静态来进行,确定单一的hash值。整个系统都只有一个hash值

AtomicInteger

一一对应的,就可以用ThreadLocal

gc的时候会有标记整理算法,但是gc得时候会短暂停顿,甚至new的多了,内存扩大,会有内存抖动现象,而且从代码角度,我们一般减少不必要的内存开销

getParent().requestDisallowInterceptTouchEvent(true);
就可以

dispatchTouchEvent进行事件分发的

viewGroup里面没有事件消费 onTouchEvent 事件消费

如果onTouch返回值为true,点击事件就不在执行了

aessablity是一个虚拟点击,虚拟点击可以使用

dispatchTouchEvent

onTouchEvent.

playSoundEffet()是个发声音的,这个可以进行自己进行修改

1.安全点击,什么叫不安全点击

2.

onTouchEvent

onClickListener在up里面的点击事件

onTouch 拦截了,就不会有onClick了,

ViewPager ->

onInterceptTouchEvent拦截方法

Activity# dispatchTouchEvent->PhoneWindow#

superDispatchTouchEvent
Super.DispatchTouchEvent
ViewGroup#DispatchTouchEvent

在android中,是activity的dispatchTouchEvent方法

PhoneWindow中进行查找

VIew#dispatchTouchEvent,指的是处理事件的的dispatch的view去调取

down事件 :
move:
up事件:

buildTouchDispatchChildList()—>对子view排序

buildTouchDispatchChildList使用了什么排序???

点击的位置的判断

1.人脸识别算法,举手识别率,前三排

智慧罗庄:事件,权限,

安迪网格化-> H5(商城,共享单车)

硬件测试 需要长时间测试。

new 方向,

升降式的摄像头。UV光,个性化。解决问题。

人脸采集
webview封装

down move 阿斯顿发