QQ阅读器技术框架解析之一《代码预览和分析》
据说,腾讯的产品的三字名言是:抄、糙、超。即,先抄袭、在模仿、最终实现超越。互联网软件天下一大抄,彼此抄袭是常事,关键使我们如何超越他人,实现自我。下面我们采用最新的QQ阅读器反编译代码,并恢复源代码,学习QQ阅读器的架构和具体实现。
1. 首先我们需要2个工具来反编译QQ阅读器Android端的源代码:apktool和dex2jar
2. 最新QQ阅读器安装文件(qqreader_2.1.1.0150_android.apk)
3. 反编译文件,导入eclipse中
apktool.bat d qqreader.apk qqreader
dex2jar.bat classes.dex
使用jd-gui.exe代开src.zip文件,并保存到本地所有src源文件,至此QQReader的源代码和资源文件全部反编译完成,新建android2.1工程,并导入工程后,发现无数的错误,没关系,翻遍编译后是源代码那就真奇怪了。源代码见附件,注意工程是UTF-8格式的。
4. 首先启动的是ReaderApplication,关键代码
@Overridepublic void onCreate() {super.onCreate();new d(this.getApplicationContext());new c();}
1. 是否要下载更新软件版本, msg.what = 310,提示:网络错误、更新失败、更新成功、已是最新版本 msg.what=104,提示:是否退出阅读器2. 设置默认对话框的样式3. 获取底层的一些常用的对象4. 重载父类的onPause和onDestory方法,记录日志打点信息5. onCreate:获取屏幕的宽高 屏幕高大于1280,设置字体的初始大小18、15 960:8、15 800:8、15 320:默认 否则:-4(减去)6. onResume: 这个是QQ阅读器的亮点,每个activity重新恢复展示时,都会调用这个函数,其中QQ设置了全局变量,如果全局变量是否退出应用程序,那么,调用finish()函数,一次循环递归,知道所有的acitivity都执行了finish()函数,应用退出。
SplashActivity.a(this.a).sendEmptyMessage(1);是否继续下载更新文件SplashActivity.a(this.a).sendEmptyMessage(3);距离安装时间超过7天后,每次启动检查是否有新版本,有的话,就要提示SplashActivity.a(this.a).sendEmptyMessage(2);检查是否是第一次运行,根据这个展示操作指南,并拷贝默认的图书到书架。SplashActivity.a(this.a).sendEmptyMessage(4);下载一些东西,代码反编译失败SplashActivity.a(this.a).sendEmptyMessageDelayed(0, 800L);延迟0.8s启动书架