[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点
- hook就是单例,或者 找hook点,然后去代理它
通过反射动态代理
- 分析hook点, 动态代理,还是静态代理
反射做什么呢
获取到getDefault 的原始对象
使用动态代理
通过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 阿斯顿发