apk分析利器:ClassyShark
來自: http://w4lle.github.io/2016/02/15/ClassyShark——分析apk利器/
背景
對于一個感興趣的android非開源項目,通常使用逆向工程查看apk中的內容,俗稱反編譯。工具大概包括dex2jar、JD-GUI、apktool、procyon,這些工具使用起來相對比較麻煩,如果我們只想知道該項目的基本框架、使用到哪些開源項目的話,那么就有些浪費時間。
對于一些大廠的項目,我們還比較關心的是用到了哪些新的框架和技術,對于新技術的流行程度和使用普遍程度有個比較好的把握,指導是否需要進行深度的使用學習。比如最近的比較流行的rxjava,熱更新技術等等。
ClassyShark
ClassyShark是一款可以查看Android可執行文件的瀏覽工具,支持.dex, .aar, .so, .apk, .jar, .class, .xml 等文件格式,分析里面的內容包括classes.dex文件,包、方法數量、類、字符串、使用的NativeLibrary等。
使用方法
- 打開apk文件java -jar ClassyShark.jar -open <YOUR_APK.apk>
- 將生成的所有數據導出到文本文件里java -jar ClassyShark.jar -dump <BINARY_FILE>
- 將指定類生成的文件導出到文本文件里java -jar ClassyShark.jar -dump <BINARY_FILE> <FULLY_QUALIFIED_CLASS_NAME>
- 打開ClassyShark,在GUI界面展示某特定的類
- java -jar ClassyShark.jar -open <BINARY_FILE> <FULLY_QUALIFIED_CLASS_NAME>
- 檢測APKjava -jar ClassyShark.jar -inspect <YOUR_APK.apk>
- 導出所有的字符串 java -jar ClassyShark.jar -stringdump <YOUR_APK.apk>
具體使用
以美團項目為例,讓我們看看能得到什么有用的信息
java -jar ClassyShark.jar -open ~/Downloads/group-351_3-meituan_.apk
美團項目中使用了MultiDex,并且classes.dex文件有3個,說明方法數肯定非常多。
美團的編譯版本非常新, 緊跟時代, 23版本(Android 6.0)。
并且TargetSdkVersion也是23版本,緊跟技術方向。
最低版本是16(Android 4.1), 4.1以下的手機無法運行。
而且有好多的so庫,有美團自己的,也有好多是第三方的庫。
可以看到9萬多個方法,怪不得會有3個classes.dex文件。
項目中應用了大量的第三方庫,并且一般都是主流的比較穩定的開源庫。
我們來看下都用到了哪些庫
- ZXing二維碼識別庫;
amap: 高德地圖; - PullToRefresh使用最廣的下拉刷新組件;
- jackson, json解析庫;
- NineOldAndroids Jake大神的android兼容庫
- fresco,非死book出品的圖片處理庫,圖片加載節省很多內存,避免OOM。
- RxJavajava響應式編程庫,再加上Square的Retrofit庫的支持,可以說未來就是rxjava的天下,目前市面上已經有很多基于rxjava的項目;我們團隊也將基于rxjava來開發項目;
圈內最牛逼的開源公司Square,Jake大神所在的公司,可以毫不夸張的說,Square的開源項目使得Android開發提速了好幾年 - okhttp網絡請求庫,已被官方采用;
- retrofit非常牛逼的網絡請求庫,配合rxjava和lambda使用,代碼量減少90%;
- otto事件總線;
- picasso圖片加載庫;
- dagger依賴注入框架;
- ExpandableTextView可折疊的TextView
- iflytek, 科大訊飛的語音集成;
- ViewPagerIndicator還是Jake大神的項目,viewpager的滾動控件;
- actionbarsherlock依然是Jake大神的項目,Actionbar的適配庫,不過已經過時了;
- 華為推送
- SystemBarTint狀態欄沉浸效果庫
- 百度地圖
- 新浪微博
- 騰訊的QQ和微信
- 大眾點評,已經合并一家,東西也得用;
- umpay, 聯動優勢支付;
- 支付寶;
- andfix阿里出品的android熱更新框架;
- flurry統計庫;
- 小米推送
- http-request網絡請求庫;
- EventBus事件總線庫;
- PhotoView放大縮小的圖片處理庫;
- roboguice依賴注入框架,類似Dagger;
- zip4j處理zip壓縮的庫;
link異步task關聯庫,很像rxjava;
總結
從上面分析我們可見看出,美團是一個技術很開放的公司,對于框架的使用比較多,使用的基本都是主流的開發框架,減少開發成本,增強app的穩定性和體驗,對于我們來說,有很大的借鑒意義。比如,目前都在試水的熱更新框架,美團選擇了阿里的andfix,那么該技術方案肯定是得到了美團團隊的驗證;另外,美團團隊也是比較潮流的,Retrofit+Rxjava的潮流趨勢已經不可阻擋,美團已經開始使用;但是,從項目引用庫中我們也可以看到一些不足之處;比如,同一種框架引用了多種第三方庫,如網絡庫(okhttp,http-request),圖片加載庫(fresco,picasso),事件總線(EventBus, Otto),依賴注入(Dagger,roboguice),推送相關的庫等很多重復的庫,如果去掉重復的庫那么可以節省很多的編譯時間和apk包的大小;還有就是,我們基本可以斷定,美團團隊的內部并不能很好的統一,沒有有效的溝通,代碼開發很混亂,導致項目結構上的臃腫,重復庫的使用等等問題。
通過分析App的項目結構和引用庫的信息,我們大致掌握了該項目的架構,一些開發中的經驗和不足,拓寬下開發視野,發現一些好用的開源庫,增強我們的武器,這些都是我們在開發中可以借鑒的東西。