推荐研究下Doug Lea主写和设计的java concurrent包,理解CountDownLatch、CyclicBarrier、Semaphore、FutureTask等对象。
具体开上,我使用自己写的SmartExecutor,直接继承ExecutorService,封装了一个公共线程池,全App保证只有一个线程池
在一个 App 中 SmartExecutor 可以有多
《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享
个实例,每个实例都有独立核心和等待线程数指标,每个实例都有独立的调度和满载处理策略,但它们共享一个线程池。这种机制既满足不同木块对线程控制和任务调度的独立需求,又共享一个池资源。独立又共享,最大程度上节省资源,提升性能。
控制核心并发数,尽量和CPU核数保持一致(或者多两个)我认为吞吐量是最佳的,线程过多则调度线程消耗CPU和时间,过少则不能充分利用多核的能力。
控制排队策略和排队数量,是否考虑新任务先处理,过度超载丢掉最老的任务。
###3.热修复
Github上读一下AndFix这个项目的源码,还有xposed、dexposed。
大致原理就是将java方法通过c/c++修改属性变为public native方法,上下文携带到native层,然后根据上下文指向另一个java方法,从而“偷梁换柱”,如果是支持ART的手机,那么策略不一样,将bug method的关键信息(classloader、theadid等)保留,将修复过的方法的各种信息赋给bug method,完成“移花接木”。
另外,其实有挺多的策略改变运行时行为的,比如:
- JavaSisst:字节码修改类库,依赖字节码修改和DX类库,可以完成动态替换和切面编程。
- AspectJ:依赖字节码编织器,需要按照其语法来编写,需要一点“编织”时间。
- Xposed方案,简直是一个Bug,神器,没准以后会被Android修复呢,不仅可以改变自己的类行为还可以hook系统的方法,root过的机器还可以hook其他App和系统进程。
###4.整体性能上如何保证探测以及流畅
性能可以根据帧率、内存、CPU、GPU等指标的数据和表现辅助判断,可以从/proc文件夹下读取文件获取cpu、内存等信息,也可以用dumpsys命令获取帧率等信息,也可以通过android API获取相关信息。
还有很多性能相关的分析工具,Heap Tool、Memory Monitor、Lint、HierarchyView、WireShark、TraceView等。
保证流畅有很多点可以去研究,比如布局、代码、缓存、网络、数据库、异步并发等方面的优化,涉及很多的知识点,可以google下,先简单说下。
- 布局充分利用include、viewstub、merge等标签,控制层级,避免过度渲染(绘制)。
- 代码上尽量使用final、局部变量、系统函数如arraycopy等、位移操作是否可以代替乘除、for循环是否可以避免size计算和new对象等等。
- 缓存方面,线程、位图、视图、网络数据是否可以客户缓存或者IO用缓冲流,充分的重复利用。
- 网络方面,如尽量避免轮询,控制节奏和频率,IP直连,采用SPDY方案(或HTTP2.0)来实现压缩header、多路复用、双向通信等,API数据压缩,多个请求是否可以合并,数据压缩和尝试protocol buffer相关序列化方案。
- 数据库方面,尝用SQLiteStatement代替SQLiteDatabase完成操作,索引和事务的充分理解和使用,注意SQL语句语法和拼接,采用部分查询和延迟加载。
- 异步并发方面,全App只有一个线程池,控制核心并发数量,控制超载时排队数量和策略,合理调度任务,优化业务逻辑。
- 最后关于帧率,你看到的视觉卡顿,直接原因基本是“掉帧”。关于帧率,尽量保证主线程里做的事情,不会超过16毫秒(其实这挺难的),16毫秒大法好,具体可以去理解下CPU、GPU、屏幕三者如何配合完成渲染的。
###5.良好的架构设计
根据经验,一个良好的架构设计可大致分三层- 上层是Activity、Fragment、Views&Widget等视图渲染和业务调用。
- 中层是针对业务的三方库,以及主要逻辑实现,业务流程在这完成,此层还可以细分,不再多表。
- 底层是业务无关的框架库,用之四海而皆准,各类库内高内聚,不同库间低耦合。
这样一个结构,使得你的代码快速在phone和pad以及tv之间迁移,便于业务的统一编写与调用,且让各模块更为清晰。
项目结构有区别,但基本要遵循MVC、逻辑视图分离等设计思想。以上为结构级别,再细粒度一些,推荐反复理解实践设计模式的六大原则与23种设计模式,让项目整体更优雅可控。自动化,智能化,约定优于配置等思想,恰当使用合需、轻量、可扩展的框架库可以帮助项目更稳定简单。
借用 Google 大神的总结就是,框架设计需要满足如下几点:
简单易学;
易于使用,即使没有文档;
很难误用;
易于阅读,代码易于维护;
足够强大,可以满足需求;
易于扩展;
适合用户。