转:国内Top500Android应用分析报告
转自:https://mp.weixin.qq.com/s?__biz=MzA5OTMxMjQzMw==&mid=2648112527&idx=1&sn=b23c1b5f3e32e343ad96d705bd4d63ff&scene=1&srcid=0711SVtLTxYXurfDvMqW2LJi&key=77421cf58af4a6539e507304f3ba7258db54cc7d09d0da0d4d384e54aa5536776c95d86cfb4e18a26e41586ef17e83bd&ascene=0&uin=Mjc3OTU3Nzk1&devicetype=iMac+MacBookPro10%2C1+OSX+OSX+10.10.5+build%2814F1808%29&version=11020201&pass_ticket=ITDgY8jmrXUfwFXFF5dIXjjUGT%2Bjosrkf8JctrkEiM3n%2F5PmuQjtbzHuMvPqa8Qq
国内Top500Android应用分析报告
背景
笔者目前在开发的应用在线上有不少OOM的问题,经过一番优化后,OOM降了一个量级,但由于产品中Gif是一特色,内存占用优化空间比较有限,想要减少OOM最简单的办法可能就是开启largeHeap。Google官方是不推荐使用largeheap的,更大的内存意味着更长的垃圾回收时间,所以我就想看看国内的这些应用是否有打开largeheap。用AS的APK Analyzer看了下微信和QQ空间,发现大家都打开了,然后我就安心了。
后来,我们打算把Jackson库换掉,太占用方法数了,可选择的有Gson和Fastjson。同样去看看国内的App都在用什么吧,本以为Fastjson号称速度最快,国内又是主场,应该用的人更多一些,但在手动分析了几个APP后,发现大家都在用Gson,Fastjson反而没见到几个。
再后来,有一天晚上,好像看了篇TK教主的文章就来了灵感,觉得可以批量分析一下国内主流的APP,看看大家都在用什么库,教父整天说据我所知,国内用哪些团队在用rxjava,我可以来个更全面准确的分析,顺便可以看看我的Nuwa是否有人在用?
分析
豌豆荚正好那几天被收购了,那就拿他开刀吧,脚本下载了排行榜(周下载量)Top500的应用,使用Android SDK自带的appt和dexdump,分析Manifest文件和dex文件,拿到一些APK基本信息和dex中的Class Descriptor。
有些有插件化能力的或者没有用MultiDex的应用,可能dex不在常规位置,比如淘宝把dex伪装成.so文件,所以需要查看文件的magic number来找到dex文件。
涉及到数据的排序和整理,所以使用了mysql数据库,Class Descriptor通过package分段聚合,package最多保留四段,比如Lcom/jiajixin/nuwa/utils/dex/,会有com/*
、com/jiajixin/
、com/jiajixin/nuwa/
、com/jiajixin/nuwa/utils/
入库,然后group by后根据count倒序输出,人工匹配对应库名。
数据
废话不多说,直接展示数据。
APK基本信息
开源项目
Network:
Okttp | Volley | android-async-http |
---|---|---|
135 | 105 | 58 |
ImagecLoader:
Universal Image Loader | Fresco | Glide | Picasso |
---|---|---|---|
130 | 88 | 54 | 38 |
Dependency Injection:
ButterKnife | Dagger | Android Annotations | Roboguice |
---|---|---|---|
63 | 16 | 11 | 5 |
Json:
Gson | Fastjson | Jackson |
---|---|---|
227 | 87 | 26 |
Protocol Buffers:
Wire | Protobuf |
---|---|
72 | 67 |
DataBase:
GreenDao | OrmLite |
---|---|
41 | 27 |
Event:
EventBus | Otto |
---|---|
132 | 12 |
HotFix:
Andfix | Dexposed | Nuwa |
---|---|---|
34 | 24 | 7 |
Plugin:
Droidplugin | Dynamic-Load-Apk | DynamicAPK | Pluginmgr |
---|---|---|---|
8 | 5 | 7 | 1 |
PullToRefresh:
Android-PullToRefresh | android-Ultra-Pull-To-Refresh |
---|---|
92 | 27 |
Name | Users |
---|---|
NineOldAndroids | 150 |
zxing | 121 |
okio | 119 |
thrift | 97 |
bolts | 76 |
android-gif-drawable | 72 |
spdy | 63 |
photoview | 62 |
iflytek | 61 |
rxjava | 50 |
pinyin4j | 46 |
viewpagerindicator | 46 |
jsr305 | 42 |
ijkplayer | 41 |
DanmakuFlameMaster | 36 |
retrofit | 26 |
DragSortListView | 23 |
exoplayer | 23 |
MPAndroidChart | 23 |
rebound | 22 |
jsoup | 21 |
leakcanary | 21 |
android-gpuimage | 20 |
daimajia | 20 |
xutils | 19 |
Android-wheel | 18 |
roundedimageview | 18 |
PagerSlidingTabStrip | 16 |
SmoothProgressBar | 16 |
stetho | 16 |
aspectj | 15 |
bouncycastle | 14 |
soloader | 14 |
tagsoup | 14 |
vitamio | 14 |
dom4j | 13 |
afinal | 12 |
cropper | 12 |
Android-Easing | 11 |
react-native | 11 |
slidingmenu | 11 |
zip4j | 11 |
disklrucache | 10 |
swipebacklayout | 10 |
java_websocket | 9 |
realm | 4 |
这些产品在使用rxjava:
这些产品在使用react-native:
上面这两张图献给教父。