Android 开源项目源码解析

jopen 9年前

从 Android 开始建了了协作项目,从简介、总体设计、流程图、详细设计全方面分析开源库源码。目前第一期完成,包括10个开源库及5个公共技术点的全面介绍。

Volley 源码解析

Volley 是 Google 在 2013 I/O 大会上推出的 Android 异步网络请求框架和图片加载框架。特别适合数据量小,通信频繁的网络操作。Volley 主要是通过两种 Diapatch Thread 不断从 RequestQueue 中取出请求,根据是否已缓存调用 Cache 或 Network 这两类数据获取接口之一,从内存缓存或是服务器取得请求的数据,然后交由 ResponseDelivery 去做结果分发及回调处理。


Android Universal Image Loader 源码分析

Universal Image Loader 是一个强大的、可高度定制的图片缓存。整个库分为 ImageLoaderEngine,Cache及 ImageDownloader,ImageDecoder,BitmapDisplayer,BitmapProcessor 五大模块,其中 Cache 分为 MemoryCache 和 DiskCache 两部分。简单的讲就是 ImageLoader 收到加载及显示图片的任务,并将它交给 ImageLoaderEngine,ImageLoaderEngine 分发任务到具体线程池去执行,任务通过 Cache 及 ImageDownloader 获取图片,中间可能经过 BitmapProcessor 和 ImageDecoder 处理,最终转换为 Bitmap 交给 BitmapDisplayer 在 ImageAware 中显示。


Dagger 源码解析

Dagger 是一款 Java 平台的依赖注入库。Java 的依赖注入库中,最有名的应该属 Google 的 Guice,Spring 也很有名,不过是专注于 J2EE 开发。Guice 的功能非常强大,但它是通过在运行时读取注解来实现依赖注入的,依赖的生成和注入需要依靠 Java 的反射机制,这对于对性能非常敏感的 Android 来说是一个硬伤。基于此,Dagger 应运而生。Dagger 同样使用注解来实现依赖注入,但它利用 APT(Annotation Process Tool) 在编译时生成辅助类,这些类继承特定父类或实现特定接口,程序在运行时 Dagger 加载这些辅助类,调用相应接口完成依赖生成和注入。Dagger 对于程序的性能影响非常小,因此更加适用于 Android 应用的开发。


EventBus 源码解析

EventBus 是一个 Android 事件发布/订阅框架,通过解耦发布者和订阅者简化 Android 事件传递,这里的事件可以理解为消息,本文中统一称为事件。事件传递既可用于 Android 四大组件间通讯,也可以用户异步线程和主线程间通讯等等。传统的事件传递方式包括:Handler、BroadCastReceiver、 Interface 回调,相比之下 EventBus 的优点是代码简洁,使用简单,并将事件发布和订阅充分解耦。


xUtils 源码解析

xUtils 一个 Android 公共库,主要包括 View,DB, Http, Bitmap 四个模块。View 模块主要的功能是通过注解绑定 UI,资源,事件。DB 模块是一个数据库 ORM 框架, 简单的语句就能进行数据的操作。Http 模块主要访问网络,支持同步,异步方式的请求,支持文件的下载。Bitmap 模块是加载图片以及图片的处理, 支持加载本地,网络图片,而且支持图片的内存和本地缓存。


ViewPagerindicator 源码解析

ViewPagerIndicator 常用语 ViewPager 的界面导航。主要特点:使用简单、样式全、易扩展。该项目总体设计非常简单,一个 PageIndicator 接口类,具体样式的导航类实现该接口,然后根据具体样式去实现相应的逻辑。 IcsLinearLayout:LinearLayout 的扩展,支持了 4.0 以上的 divider 特性。 CirclePageIndicator、LinePageIndicator、UnderlinePageIndicator、 TitlePagerIndicator 继承自 View。TabPageIndicator、IconPageIndicator 继承自 HorizontalScrollView。


HoloGraphLibrary 源码解析

HoloGraphLibrary 是一个可用于绘制图表的项目,支持绘制线状图、柱状图、饼状图。图形设计友好,使用方便。不过库本身代码一般,建议吸收原理重构而不要直接用。


CircularFloatingActionMenu 源码解析

CircularFloatingActionMenu 是一个与著名应用 Path 菜单类似的(非完整)圆形弹出菜单。可方便的定制菜单以及动画。支持自定义动画、菜单、角度范围、半径等。源码主要分成两部分,一部分是构成菜单的 View 部分,另一部分是动画的操作类。


PhotoView 源码解析

PhotoView 是支持双击或双指缩放的 ImageView。支持 Pinch 手势自由缩放,支持双击放大/还原,支持平滑滚动,在滑动父控件下能够运行良好,支持基于 Matrix 变化(放大/缩小/移动)的事件监听。PhotoView 这个库实际上比较简单,关键点其实就是 Touch 事件处理和 Matrix 图形变换的应用。


Android Lock Pattern 源码解析

Lock Pattern 是 Android 的图案密码解锁库,通过手势连接 3 * 3 的点矩阵绘制图案表示解锁密码。支持 ACTION_CREATE_PATTERN、ACTION_COMPARE_PATTERN、ACTION_VERIFY_CAPTCHA 三种 Action 操作模式。


公共技术点之Java 动态代理

在某些情况下,我们不希望或是不能直接访问对象 A,而是通过访问一个中介对象 B,由 B 去访问 A 达成目的,这种方式我们就称为代理。这里对象 A 所属类我们称为委托类,也称为被代理类,对象 B 所属类称为代理类。根据程序运行前代理类是否已经存在,可以将代理分为静态代理和动态代理。


公共技术点之Java 注解 Annotation

注解指能够添加到 Java 源代码的语法元数据。类、方法、变量、参数、包都可以被注解,可用来将信息元数据与程序元素进行关联。Annotation 中文常译为“注解”,注解的主要作用包括 a. 标记,用于告诉编译器一些信息。b. 编译时动态处理,如动态生成代码。c. 运行时动态处理,如得到注解信息。


公共技术点之View 绘制流程

当 Activity 接收到焦点的时候,它会被请求绘制布局,该请求由 Android framework 处理.绘制是从根节点开始,对布局树进行 measure 和 draw 。整个 View 树的绘图流程在 ViewRoot.java类的performTraversals() 函数展开,该函数所做的工作可简单概况为是否需要重新计算视图大小(measure)、是否需要重新安置视图的位置(layout)、以及是否需要重绘 (draw)。


公共技术点之依赖注入

如果在 Class A 中,有 Class B 的实例,则称 Class A 对 Class B 有一个依赖。非自己主动初始化依赖,而通过外部来传入依赖的方式,我们就称为依赖注入。简单的说依赖注入主要有两个好处:(1). 解耦,将依赖之间解耦。(2). 因为已经解耦,所以方便做单元测试,尤其是 Mock 测试。


公共技术点之View 事件传递

所有 Touch 事件都被封装成了 MotionEvent 对象,包括 Touch 的位置、时间、历史记录以及第几个手指(多指触摸)等。事件类型分为 ACTION_DOWN, ACTION_UP, ACTION_MOVE, ACTION_POINTER_DOWN, ACTION_POINTER_UP, ACTION_CANCEL,每个事件都是以 ACTION_DOWN 开始,ACTION_UP 结束。对事件的处理包括三类,分别为传递——dispatchTouchEvent() 函数、拦截——onInterceptTouchEvent() 函数、消费——onTouchEvent() 函数和 OnTouchListener。


项目主页:http://www.open-open.com/lib/view/home/1422952985045