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