國內 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:

上面這兩張圖獻給教父。
第三方服務


