个人简介

  1. 本人有5年Android开发经验,具有丰富的Android客户端架构经验
  2. 深刻理解并熟练运用常用设计模式,实践中采用过单例模式,工厂模式,模版方法模式,观察者模式,桥接模式,职责链模式,外观模式,访问者模式,命令模式
  3. 深入研究过Java多线程安全,并有较丰富的Java多线程程序设计经验
  4. 深入研究过Android Binder机制,Activity启动流程,Android单元测试
  5. 有较丰富的性能优化经验,包括内存性能优化和启动时间优化
  6. 有非常强的问题定位及解决能力,在ANR,内存泄漏,OOM,逻辑等问题的定位上有丰富的经验
  7. 有团队管理经验,对技术人才有深刻理解

下载本人简历.

工作经历

Android组组长

2014.6 - 现在
腾讯, 深圳

Android高级工程师

2011.11 - 2014.05
瓶子科技, 深圳

瓶子科技有刷机精灵和Root精灵等核心产品,2012年被腾讯全资收购

项目经历

1. 手机版刷机精灵的重构及维护

2015.11 - 现在

手机版刷机精灵是公司的核心产品,有以刷机功能为核心的一系列功能,比如:ROM下载,Root,资料备份及恢复,系统优化,安全加固,耗电管理,手机降温,应用市场,卸载预装,自启管理,应用升级,百宝箱,推荐信息流。众多复杂的功能给技术架构带来很大的挑战

技术要点:

  1. 模块化的架构设计 以功能为单位划分模块,每个功能模块都在一个单独的模块工程里,只选择需要的模块即可快速开发出一个新的产品。每个模块还可以为不同的产品定制不同的逻辑,资源,配置以实现定制。通过这种架构设计,每个产品都只包含它需要的模块,逻辑,配置,资源,可以让每个产品的体积尽量小。另外,每个模块只需维护一套供各产品共用的逻辑,具有更低的维护成本。所有产品共用一个公共基础模块,在公共基础模块里设计了一个模块管理器,产品用到的模块对象都会在模块管理器里注册,每个模块都可通过模块管理器取得其它模块,然后调用其它模块的功能
  2. 提取通用组件,放在局域网的组件仓库,供所有产品使用。每个组件都有版本管理,如果需要使用通用组件,只需在build.gradle里添加依赖即可使用该组件,如果组件依赖了其它组件,也会自动下载依赖的特定版本的组件。通过这种方式解决了以前通用代码散布在各个产品带来的可维护性非常差的问题。另外因为这些组件通常都是aar包,解决了以前使用第三方组件时还需拷贝动态库,资源文件,设置AndroidManifest等多种麻烦问题
  3. 多进程的架构设计 将内存消耗比较大的逻辑放在非主进程,解决主进程因内存回收带来的卡顿问题,将常驻逻辑放在常驻进程,和主进程隔离,解决主进程经常被系统杀掉的问题,还可以通过多进程解决引入外部库导致的主进程卡死问题
  4. 模块内部设计采用MVC,隔离业务逻辑和界面逻辑,应用启动时会初始化每个模块的业务逻辑层, 提前缓存该模块的数据,当用户进入该功能模块时因为数据已经准备好,所以可以无缝使用该功能
  5. 通过并行初始化,延迟非关键组件的初始化等手段保证应用启动速度
  6. Task-Based的多线程设计,将任务进行分类,不同的任务放到到不同类型的线程池里运行,保证任务的高效执行以及多线程逻辑的可调试性,因为在调试器里可以知道执行的任务所在的线程,可以分析线程当前的状态得到当前任务执行的状态,也能明确是否产生死锁
  7. 支持抢断的优化任务调度器,可以高效响应用户的优化操作,解决优化任务非常耗时还不能打断的问题。清理扫描时,用户进入安全扫描后,会立即启动安全扫描,安全扫描后又会继续先前未完成的清理扫描。此种情况下还能保证全局的扫描进度是累加的,而不是从头开始。

项目职责:

搭建框架,实现核心模块的业务逻辑,解决疑难问题,代码Review,任务分配

2. 精灵助手重构

2015.8 - 2015.9

精灵助手是 PC 端刷机精灵的辅助应用,协助 PC 端刷机精灵完成手机信息的获 取,并实现联系人,短信,通话记录,wifi,图片,应用数据等资料的备份和还原

重构时实现了 Jar 包形式的精灵助手,在有 Root 权限的情况下,可以绕过第三 方授权管理组件备份还原用户资料(通话记录,短信,联系人)。Apk 形式的精灵 助手也做了比较大的架构调整,解决了先前通讯,线程管理混乱的问题,提高了 备份,还原的成功率

技术要点:

  1. 实现Jar包形式的精灵助手参考了content命令的实现,通过ActvityManager调用getContentProviderExternal函数可得到ContentProviderHolder,然后通过该对象指定要操作的uri即可查询联系人,短信,通话记录等资
  2. Task-Based的多线程设计以前PC端每发送一个命令过来,都会创建一个新的线程,执行该命令,这样可能造成多个线程的同步问题,比如出现两个线程同时还原资料,造成资料重复。另外因为多线程的原因,增加了分析问题的复杂性。现在采用了Task-based的多线程设计,将所有PC端的命令分成了4种类型,SIMPLE类型的命令放在单线程的线程池里执行,PIM类型的命令放在另一个单线程的线程池里执行,并且有看门狗线程负责观察命令是否执行超时,FILE类型的命令放在固定数目线程的线程池里执行,MEDIA_TIME类型的命令放在cache类的线程池里执行。如果某个命令执行出问题,可以在调试窗口迅速找到执行命令的线程,然后查看线程执行的状态,相比Actor-based的多线程设计,有更好的可分析性
  3. 我们在和PC端通信时,最初设计便采用了NIO的通信方式,但是虽然采用了该方式,我们还是设计了3个线程用于管理和PC端的通信,一个监听PC端请求的线程,一个读取PC端发送过来的数据的线程,一个发送数据至PC端的线程,这样的设计非常复杂,不便于分析。重构后,我们取消了读取数据和发送数据的线程,只保留了一个监听PC客户端请求的线程,在该线程里检测到PC端发送数据过来后,就调用ClientSession的receiveData接收数据,如果执行的命令准备好发送给PC端的数据了,则通过SelectKey的interestOps将该通道设置有数据需要发送,则在服务线程里即可知道,然后在服务线程里将数据真正地发送给PC端

项目职责:

搭建框架,实现核心的业务逻辑(任务调度,和PC端通信的逻辑,命令执行框架,部分命令逻辑),任务分配

3. 预研进程注入

2015.5 - 2015.8

通过将我们自己编写的动态库注入至system_server进程,这个动态库就获得了system_server进程的权限,并且可以管理各种binder service对象,拦截各种binder service提供的服务,比如ActiivtyManagerService,PackageManagerService,这样就可以为手机版刷机精灵提供一些普通进程无法获得的功能: 卸载手刷时提醒用户确认是否卸载手刷,这样可以挽留用户;清除通知栏所有其他应用的通知,在做系统优化时可以用到;禁止第三方软件开启自启动

技术要点:

  1. 通过ptrace实现动态库的注入
  2. 修改system_server使用的libandroid_runtime.so的GOT表,将GOT表中填写的BBinder:transact地址改成注入的动态库的入口地址,并保存BBinder:transact函数地址,需要时再通过这个地址调用BBinder:transact函数

4. 手刷和PC刷机精灵的云端刷机方案

2014.4 - 2015.5

刷机精灵的核心功能是刷机,刷机最核心的技术是刷机方案,最核心的指标是刷机成功率和刷机效率。刷机方案放在云端这种架构使得刷机方案更新非常灵活,可随时更新刷机方案,带来了刷机成功率的迅速提升并且能快速满足运营需求

技术要点:

  1. 刷机方案内部采用了模板方法,桥接模式,职责链模式来保证刷机流程,刷Recovery的方案的可扩展性,使得各个机型的刷机流程,刷Recovery的流程可灵活定制
  2. 快速提升成功率的方法论: 上报错误信息,分析各个错误占比,针对主要错误分析错误原因,然后制定解决方案,针对不明原因的错误则收集错误发生时的更多环境信息,发布版本后再进行分析
  3. 提升开发效率的诀窍: 测试流程一键化,可迅速验证修改的代码,智能代码提示,无须查阅文档,分级日志和分色显示日志工具快速定位错误原因

项目职责:

主导云端方案的设计和实现

5. 底层Recovery定制及底层技术研究

2013.8 - 2014.3

在CM Recovery源码基础上定制刷机精灵的Recovery,定制刷机,系统备份,系统还原,清除数据,清除缓存等界面。优化并精简CM recovery的功能,定制刷机精灵需要的功能。改造了Android编译系统,支持多分辨率适配,可直接编译生成MTK机型的Recovery

技术要点:

  1. 使用nx连接服务器,在服务器上开发,使用secure crt连接到开发服务器,进行编译,本地电脑安装虚拟机, 手机连接到本地电脑的虚拟机,每次修改Recovery源码后,可一键编译并测试新修改的逻辑是否有问题
  2. 改造CM的编译系统,使其支持Recovery的多分辨率适配,支持生成MTK机型的Recovery,支持小米手机的双系统切换,还添加了华为和Htc的充电模式检测。另外还编写了用于提取Device配置文件的Shell脚本,从手机里提取Device后,只需对配置文件做少量修改即可生成Recovery,提高了适配Recovery的效率
  3. 还实现了在Recovery模式下不重启就能直接刷机,还能汇报刷机状态给PC刷机精灵
  4. 深入研究了Recovery源码,init源码,adb源码,SELinux机制

项目职责:

编译系统改造,Recovery开发,底层源码研究

6. 手机版刷机精灵

2012.11 - 2013.4

刷机精灵手机端的第1个版本,可查看ROM列表,ROM详情及评论,用户还可以下载ROM并刷机,但该项目并未上线

技术要点:

  1. 软件架构采用MVC模式,将作为activity的controller放在同一个包,自定义view放在同一个包。业务逻辑按功能分类放在不同的包,所有请求服务器的json消息放在同一个包。图片缓存相关类放在同一个包,网络请求放在同一个包,刷机方案放在同一个包,下载引擎放在同一个包。
  2. tab内容Activity采用模版方法模式设计,这些Activity继承自同一个父Activity,父Activity固定了如何生成整个tab页内容的算法,也就是说将标题栏和内容组合起来,子Activity类生成标题栏时,只需告知父Activity要显示的文字即可。这种设计减少了代码的重复,具有更好的可维护性
  3. 刷机方案的设计采用了模版方法模式和观察者模式,因为刷机步骤是固定的,只是某些具体的刷机步骤的实现会所有不同,所以采用模版方法。另外还设计了一个简单工厂,根据服务器下发的刷机方案,选择不同的刷机方案实现进行刷机。刷机方案执行时通过观察者模式通知界面层
  4. 图片缓存采用二级缓存,有文件缓存和内存缓存。先从网络把图片下载到本地,再将图片从本地加载到内存,内存对加载的图片所占用的总大小有限制,如果图片大小超过限制会使用LRU算法将图片从内存中移除。实现图片的内存缓存采用Map,并将图片名字,尺寸等参数作为key,而Bitmap作为value,从Map里移除某个Bitmap后,垃圾回收机制会自动回收Bitmap所使用的内存,并不需要调用system.gc(),如果担心不能及时回收的话,可用bitmap的recycle方法
  5. 可局部更新下载列表界面。更新ListView时,如果调用notifydatasetchanged会使得整个界面重绘,看起来像是滑动了界面一样。局部更新只需要在getview方法里使用map缓存位置即可,再用AdapterView的getFirstVisiblePosition得到位置,再计算出最终位置,再用viewGroup的getChildAt(position)即可得到任务所在的view,然后操作view的数据进行局部更新

项目职责:

独立完成软件设计,并编写核心代码

7. 刷机精灵助手

2011.12 - 2013.5

刷机精灵助手是PC端刷机精灵的辅助软件,运行在手机端,协助PC端刷机精灵完成联系人,短信,通话记录,应用数据备份以及还原功能,调用手机管家实现手机体检功能,提供ftp服务和检测系统更新等功能。

技术要点:

  1. 采用MVC架构,只有一个简单的界面作为View,还有一个Activity作为控制层,业务模型比较复杂,既要实现和PC端刷机精灵通信,还要实现支持的PC端的命令逻辑。如果和PC端刷机精灵连接上了,将会让界面显示已连接,如果正在执行PC端刷机精灵的命令,则让界面显示正在执行命令
  2. 采用TCP和PC客户端通信,TCP Server在某个端口监听,PC端刷机精灵通过adb转发端口然后连接该端口,从而建立连接。精灵助手为每个连接建立一个命令队列,每个命令都在不同的线程执行,并有看门狗线程确保命令执行不超时
  3. 资料获取辅助类采用单例模式,针对2.2以下版本和2.2以上版本有不同的子类实现,通过反射实现单例
  4. 实现各种命令采用模版方法模式,设计了抽象类ClientCommand,在该类里固定了命令执行的算法,先调用执行时间统计的初始化操作,启动看门狗线程,最后统计命令执行时间。
  5. 添加新的命令,不需要修改现有代码。在解析通信协议生成命令对象时,采用反射机制,生成需要执行的命令的对象,所以不需要修改现有代码。真正实现了对修改封闭,对扩展开放

项目职责:

项目初期独立完成软件设计及实现,上线后也负责维护并添加新功能。另外为了绕过授权管理软件,我还写实现了一个su程序,协助精灵助手获取Root权限

技术 & 熟练度

设计模式

Java & Android

C++ & Ndk