天天看點

那些值得你試試的Android競品分析工具

作者簡介: 紀喜才(@D_clock愛吃蔥花),創業小團隊的Android開發攻城獅,Diycode 技術社群管理者,熱愛開源并學習開源,熱衷于技術分享,目标是成為一名T型開發者。個人部落格:http://www.jianshu.com/users/ec95b5891948,Github位址:https://github.com/D-clock

審校: 唐小引(@唐門教主),歡迎技術投稿、約稿、給文章糾錯,請發送郵件至[email protected]。

感謝作者的辛苦撰文分享。

前言

本文整理了一些自己在開發過程中經常會用到的競品分析工具,這些工具可以幫助分析競品。讓我們得以了解競品相應的一些技術資訊,例如:代碼品質、某種業務的實作方式、用了什麼第三方庫等。除此之外,也有一些高端玩家會玩起 HOOK ,更有甚者是通過修改代碼然後進行二次打包。當然這些損害開發者利益的事情,是不值得提倡的。但如果隻是出于學習的目的,我是十分建議多折騰的。

提前聲明:

  • 本文隻對工具做簡要功能介紹,要求面面俱到講解每個工具使用,本人表示能力有限啊;
  • 下文所介紹的工具,都會附上這些工具的官方位址以及相應的使用教程連結(如果有);
  • 有童鞋對下文提到的工具已經用得出神入化,歡迎寫成文章,可以的話,也歡迎給個連結讓我補充進本文,順帶學習一下;
  • 本文所有提到的工具隻做分析學習使用,請不要拿去做損害他人利益的事情;

Apk 内部結構

為了友善介紹工具,需要先簡單科普一下 Apk 的内部結構,已經很熟悉的童鞋可以忽略此章節。需要注意的是,這裡介紹的 Apk 結構并不包含加強的情況,雖然很多廠家推出了加強服務用于對抗反編譯,但是加強也有諸多的問題存在,另外基本上分析的大廠應用都沒有發現有加強的,可能也是考慮到加強後安裝包存在的諸多問題吧。

直接使用 Android Studio 建立一個 HelloWorld 的 Moudle,然後打個 release 的 Apk 安裝包,并修改字尾 apk 為 zip 後進行解壓,可以看到下面一個标準的結構:

那些值得你試試的Android競品分析工具
  • META-INF: 存放簽名檔案簽名資訊的目錄,用于系統簽名校驗;
  • res: 存放資源檔案的目錄,包含項目中的 xml 和 圖檔資源等;
  • AndroidManifest.xml: Android項目中的配置檔案;
  • classes.dex: 由Java産生的位元組碼檔案打包生成為虛拟機可以解讀的位元組碼檔案,所有的源碼都在其中;
  • resources.arsc: 資源檔案的ID索引表,如:layout、drawable、mipmap都會在R檔案生成相應的ID資源;
  • 其他目錄:開發者自行添加的目錄,如:存放資源的 asserts 、存放依賴包的 lib 目錄等。

上面介紹完了一個最基本的 Apk 解壓後的目錄結構,下面直接拿微信作為示例,看看大廠應用的結構是怎樣的:

那些值得你試試的Android競品分析工具

我們可以看到微信除包含了上面提到的,還有 asserts、lib、r 這三個自行添加的目錄,至于前兩個目錄是幹嘛的上面已經提到,r 目錄裡面主要存放了一些 svg 和 xml 檔案,有興趣可以自行試試。如果要問為什麼微信有3個dex檔案的話,隻能說它超了 Android 系統設定 65k 方法的限制,是以有多個dex包。

OK,關于 Apk 的目錄結構介紹基本到此,這有助于我們去了解下面即将要介紹的工具!

Apktool

那些值得你試試的Android競品分析工具

工具名: Apktool

官網: http://ibotpeaches.github.io/Apktool/

源碼:

  • Github位址:https://github.com/iBotPeaches/Apktool
  • Bitbucket位址:https://bitbucket.org/iBotPeaches/apktool/downloads

配置文檔: http://ibotpeaches.github.io/Apktool/install/, 教你如何配置 Apktool 的使用環境。

使用文檔: http://ibotpeaches.github.io/Apktool/documentation/, 教你各種基本的指令的使用。

功能:

  • 還原 Apk 中所包含的 resources.arsc, classes.dex, 9.png 和 xml 等檔案;
  • 對 Apk 進行重新(二次)打包;
  • 反編譯依賴于 Framework 的 apk 檔案;
  • 運作調試 Smali 檔案;

下面以微信的Apk為例簡要介紹每個功能。

1. 還原 Apk 中所包含的 resources.arsc, classes.dex, 9.png 和 xml 等檔案。通過DOS視窗去到Apktool目錄下,執行如下指令:

那些值得你試試的Android競品分析工具

可以看到上圖的反編譯過程中列印資訊日志,以及反編譯成功後得到的微信目錄。反編譯成功後,進入微信目錄可以看到如下的目錄結構:

那些值得你試試的Android競品分析工具

2. 對 Apk 進行重新(二次)打包。通過DOS視窗去到Apktool目錄下,執行如下指令:

apktool b 目錄名
           

本想對微信做重新打包,結果發現微信果然做了處理了,打包不成功,大廠考慮得好周到。于是「狡猾地」拿了另一個對象試手,果然一下子搞定了。

那些值得你試試的Android競品分析工具

可以去到反編譯生成目錄下的dist目錄看到我們重新打包好後的 Apk :

那些值得你試試的Android競品分析工具
那些值得你試試的Android競品分析工具

這個功能主要有兩個應用場景,一個是對應用進行本地化處理,例如反編譯後對應用進行漢化。另一個是無恥地對應用進行廣告植入,重新打包發放市場并以此牟利(非常強烈的不贊同大家去這麼做)。

3. 反編譯依賴于 Framework 的 apk 檔案。這個功能我并沒有用過,但是也做了大緻的了解。舉個例子(摘自網絡的栗子):一般來說,你在使用 Apktool 進行反編譯前不需要做其他的事情,然而由于有的廠商,如HTC、三星等,他們定制了 Framework 檔案并且在他們的系統應用中使用了這些檔案,這時,為了能正常的反編譯這些Apk檔案,你就必須從你的裝置中拷貝出framework檔案并且安裝到apktool中。對這個功能感興趣的童鞋,可以直接檢視這篇文章:http://bbs.gfan.com/android-2657915-1-1.html

4. 運作調試 Smali 檔案。首先需要解釋一下什麼是Smali,它是 Android 虛拟機所使用的一種機器語言,差不多可以了解成彙編語言那樣子。利用 Apktool 反編譯後,classes.dex 會被翻譯成 Smali 源代碼。

那些值得你試試的Android競品分析工具

去到下面随便找個目錄打開,可以看到都是字尾為 smali 的檔案:

那些值得你試試的Android競品分析工具

随便找個檔案打開你會發現, smali 的文法還是比較好了解的。

那些值得你試試的Android競品分析工具

有興趣想要了解 smali 文法的,可以看看這位作者寫的文章:http://blog.isming.me/2015/01/14/android-decompile-smali/。看到這裡你可能會想問,了解 smali 的文法有什麼用呢?哈,非常簡單粗暴,如果懂文法,就能讀懂人家的應用裡面的業務邏輯,還可以加以修改等。 再加上 Apktool 提供的調試 Smali 功能,可以玩得很爽。但是在 2.0.3 的版本上,作者已經宣布廢棄此功能,到了 2.1 時此功能已經完全移除掉了。這也并不意味這我們無法玩轉 smali 檔案。感興趣的童鞋可以直接玩耍下面這個 smali 調試插件:

SmaliIdea: https://github.com/JesusFreke/smali/wiki/smalidea

反正我一看到 SmaliIdea 是震驚了。目前 SmaliIdea 最新的版本是 0.03,喜歡玩耍的童鞋可以到下面的下載下傳位址中:

https://bitbucket.org/JesusFreke/smali/downloads

找到最新版的 SmaliIdea 進行安裝使用:

那些值得你試試的Android競品分析工具

對了,這個插件是基于 IntelliJ IDEA / Android Studio 的,還在 Eclipse 下撸碼的童鞋可以忽略。

使用 Apktool 需要注意還需要注意以下幾點:

1. 下載下傳完 Apktool 後,記得要把 jar 檔案改成 apktool.jar,與 apktool.bat 同名;

那些值得你試試的Android競品分析工具

2. 如果之前使用過舊版的 apktool ,記得到自己對應的使用者目錄下将 1.apk 檔案删除,否則會造成反編譯失敗;

那些值得你試試的Android競品分析工具

Clock 是我在 Windows 下的使用者目錄,其他童鞋自己換成自己對應的使用者目錄即可。

3. 不要拿去使用 Apktool 去幹違法盜版的事情,這也是工具的作者特别強調的;

那些值得你試試的Android競品分析工具

dex2jar

工具名: dex2jar

官網: https://sourceforge.net/projects/dex2jar/

源碼:

  • Github位址:https://github.com/pxb1988/dex2jar
  • Bitbucket位址:https://bitbucket.org/pxb1988/dex2jar

配置文檔: 很簡單,去官網連結直接下載下傳到本地即可。

使用文檔: 同樣比較簡單,直接看下面示例,或者 Google 一下。

功能:

  • 将 dex 檔案還原成為 jar 檔案;
  • 将 dex 檔案還原成為 smali 檔案;
  • 其他一些指令行很少用,喜歡折騰的童鞋,同樣自行摸索。

繼續拿微信開刀,解壓 Apk 去除一個 dex 包,對其進行如下指令行操作:

d2j-dex2jar.bat dex檔案名
           
那些值得你試試的Android競品分析工具

可以看到生成一個對應的 jar 包,這樣就可以結合下一個工具很友善的檢視源代碼了。如果想要将 dex 轉換成 smali ,同樣可以執行如下操作:

d2j-dex2smali.bat dex檔案名
           
那些值得你試試的Android競品分析工具

classes-out 目錄中就可以看到由 dex 包生成的所有 smali 檔案了。想必大家也留意到所有的檔案都存在同名但是字尾不同的兩份。

那些值得你試試的Android競品分析工具

bat 字尾的是 Windows 使用者可以調用的批處理檔案,sh 字尾的則是 Linux 使用者的 Shell 腳本。根據自己的環境去選擇用 bat 還是 sh 即可。

jd-gui

工具名: jd-gui

官網: http://jd.benow.ca/

源碼: https://github.com/java-decompiler/jd-gui

功能:

  • 檢視 dex 檔案還原成為 jar 檔案代碼;
  • 将 jar 檔案中所有的 class 檔案轉換成為 java 檔案。

使用很友善,下載下傳後,直接把用 dex2jar 生成的微信 jar 包拖曳進去即可檢視到對應的源代碼。

那些值得你試試的Android競品分析工具
那些值得你試試的Android競品分析工具

也可以去到工具欄選擇 File -> Save 或者 File -> Save All Sources 将單個 class 檔案或者整個 jar 包儲存成為 java 檔案。可惜的是,這個工具的作者從 2015 年開始就停止了維護,是以遲早尋求一個替代品。網上有童鞋說,jadx 不錯,可以取代 jd-gui 。我自己還沒玩過,童鞋們可以自行試試:

jadx:https://github.com/skylot/jadx

enjarify

工具名: enjarify

源碼: https://github.com/google/enjarify

配置文檔: 下載下傳源碼到本地,并安裝 Python3 的環境,同時配置好環境變量。

使用文檔: 可以參考上面的源碼位址中的說明,或者烏雲平台的文章 http://wiki.wooyun.org/android:tools:enjarify。

功能: 可直接将 apk 檔案還原成為 jar 檔案,也可以和 dex2jar 一樣,直接操作某個dex。

這是 Google 出品的一個逆向分析工具,從反編譯成 jar 包的流程來說,要比 dex2jar 友善得多。下載下傳完工具到本地并配置好 Python 環境後,需要修改 enjarify 目錄下的 enjarify.bat 檔案,将 python3 改為 python。

那些值得你試試的Android競品分析工具

再通過DOS視窗去到其目錄下,運作如下指令:

那些值得你試試的Android競品分析工具

這裡同樣需要注意,一定要将 apk 拷貝到和 enjarify.bat 同級目錄,如果使用 apk 的全目錄的話,會報錯。

enjarify 相較于 dex2jar 做了更多的優化處理,去避免在反編譯得到 jar 包的過程中出錯。雖然我在使用 dex2jar 的過程中還沒遇到過出錯的情況,但是在使用 enjarify 時,确實感受到相對更加友善的地方。例如:可以直接對apk進行操作,而不需要先解壓提取classes.dex,特别是針對那些本來就不止一個dex包的大型應用。而 enjarfy 也并非萬能的,它目前存在的一些限制,如暫時還無法逆向獲得源檔案的屬性、行數和注釋等。當然,相信 Google 的工程師也會盡力去優化改善 enjarfy 的功能,還是很值得期待的。

Procyon

那些值得你試試的Android競品分析工具

工具名: Procyon

源碼: https://bitbucket.org/mstrobel/procyon

配置文檔: 通過下載下傳連結 https://bitbucket.org/mstrobel/procyon/downloads,下載下傳 jar 包到本地即可。

使用文檔: https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler

功能: 将反編譯得到 jar 包還原成 java 檔案,同時能夠更強的還原代碼的邏輯結構。

下面直接對比一下,即可看到 Procyon 的優勢所在了。直接去到 Procyon 的目錄下,并将 enjarify 反編譯好的微信 jar 檔案放置到同級目錄,同時執行如下指令反編譯整個 jar 包:

java -jar procyon-decompiler-.jar -jar XXX.jar -o 目錄名
           
那些值得你試試的Android競品分析工具

即可看到目錄下指定生成的目錄,和控制台視窗相應的反編譯 log 資訊。為了驗證 Procyon 的亮點,我同時将 dex2jar 反編譯微信的某個類拿出來做對比(類名是MCacheItem)得到結果如下:

那些值得你試試的Android競品分析工具
那些值得你試試的Android競品分析工具

相同的一個方法體的代碼邏輯,圖一是 dex2jar 的,圖二是 Procyon 的,哪個能夠更好的讀懂相信大家自然心中有數,像這樣的栗子是很多的,這裡就不一一例舉。除了上面反編譯這個 jar 檔案的指令外,Procyon 還有下面兩個檔案使用比較高頻:

java -jar procyon-decompiler-.jar //擷取幫助指令

java -jar procyon-decompiler-.jar xxx.class //反編譯單個class檔案
           

ClassyShark

那些值得你試試的Android競品分析工具

工具名: ClassyShark

官網: http://classyshark.com/

源碼: https://github.com/google/android-classyshark

配置文檔: 通過下載下傳連結 https://github.com/google/android-classyshark/releases ,下載下傳 jar 包到本地即可

使用文檔:

  • Github markdown版本:https://github.com/borisf/classyshark-user-guide
  • Github PDF版本:https://github.com/google/android-classyshark/blob/master/CommandLine.pdf
  • 簡書版本:http://www.jianshu.com/p/8e8b88ea2197

功能: 可直接浏覽 Apk,支援對.dex, .aar, .so,.apk, .jar, .class等檔案的操作。

ClassyShark 同樣是 Google 的親兒子,利用它我們可以檢視一些 Apk 使用了什麼技術,友善作為我們開發的參考進行使用。同樣以别人家的 Apk 作為分析的栗子,這回不拿微信了,因為從 Apk 分析上看,微信大部分基本上都是用自己的技術,參考價值可能不太大,換一個目标下手(常常逛知乎,就拿知乎了)。操作同樣很傻瓜化,去到 ClassShark 的目錄下執行如下指令即可:

可以看到如下界面:

那些值得你試試的Android競品分析工具

我們可以看到如下界面,左邊包含了 xml 檔案、 classes 檔案以及 lib 目錄及其所包含的 so 庫。直接點選某個 xml 檔案即可看到其檔案内容,非常友善,不過這個工具的重點不在這裡。直接點選 classes 目錄下某個 dex 檔案。

那些值得你試試的Android競品分析工具
那些值得你試試的Android競品分析工具

從上面兩張圖中你可以看到知乎兩個 dex 包所包含的方法數是多少(這個資訊對我們可能沒啥用),還有就是它使用了 Facebook 開源的圖檔加載庫 Fresco、開源資料庫 Realm、還有騰訊和新浪的一些SDK。

如果我切換到另外一個 Tab,還可以看到更多的資訊。

那些值得你試試的Android競品分析工具

它分别列出了 Apk 下每個包中的方法數,并且以直覺的扇形圖展示在右邊。透過這裡也可以看到知乎還用了 Apache 的開源庫、Twitter 的移動開發檢測平台 Fabric、 Rxjava、 Retrofit 以及 Square 出品的 OKIO 庫。發現大廠引入的開源技術我們也可以進行相應的學習,并權衡考慮引入使用。

最後補充一點,ClassyShark 能顯示包中方法數的這個功能對我們開發自家産品還是有所幫助的,假設你引入大量的第三方庫而導緻了 Apk 超過了 65K 方法的限制,可以通過它來查找是哪些第三方庫的方法過多導緻。網上很多童鞋都推薦什麼計算方法數的 AS 插件,個人覺得還不如用 ClassyShark 友善一些。

TcpDump

那些值得你試試的Android競品分析工具

工具名: TcpDump

官網: http://www.androidtcpdump.com/

下載下傳位址: http://www.androidtcpdump.com/android-tcpdump/downloads

使用文檔:

  • Trinea版本:http://www.trinea.cn/android/tcpdump_wireshark/
  • MrPeak版本:http://mrpeak.cn/blog/tutorial-tcpdump/

功能: 對手機進行網絡抓包,前提是手機已經擷取 Root 權限。支援 HTTP 和 HTTPS ,還支援更多其他協定。

Tcpdump 的使用就不介紹太多,具體怎麼玩可以看上面 Trinea 和 MrPeak 的文章,已經寫得很完善了。TcpDump 沒有GUI,要檢視抓包日志可以通過控制台視窗,但明顯很雞肋,為了友善還是把所有網絡日志的抓包資訊放到 pcap 檔案裡面,然後結合下面要介紹的 WireShark 進行操作。

WireShark

那些值得你試試的Android競品分析工具

工具名: WireShark

官網: https://www.wireshark.org/

下載下傳位址: https://www.wireshark.org/#download

使用文檔: http://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html (非常齊全的文檔)

功能:

  • 配置 Tcpdump 生成打 pcap 檔案,進行分析;
  • 或者可以讓電腦建立熱點,手機連上電腦建立的熱點進行抓包,這種方式處理起來更加友善靈活。
那些值得你試試的Android競品分析工具

WireShark 支援的協定也是非常多,可以看到我抓包出來的結構也非常詳細,WireShark 的基本使用自行參考上面提供的連結即可,如果要玩得很深的話,需要對網絡協定有一定深度的了解,童鞋們可以選擇性自由發揮。

Fiddler

工具名: Fiddler

官網: http://www.telerik.com/fiddler

下載下傳位址: https://www.telerik.com/download/fiddler

使用文檔: 直接參考 Trinea 的文章 http://www.trinea.cn/android/android-network-sniffer/ 即可。

功能: 支援對 HTTP 和 HTTPS 兩種協定進行抓包。

相比 Tcpdump ,它的好處在于手機不需要 Root,且有自己的 GUI 。不過它隻支援 HTTP 和 HTTPS 兩種協定。另外在使用時,手機也需要連接配接 Wi-Fi 并設定好代理,具體檢視 Trinea 的文章好了。抓包的過程還是能夠獲得不少資訊的,我在抓了新浪微網誌和微信的包後感受是,微信的防抓包工作比以前做得好了,微網誌好像就沒發現有什麼變化,不知道是不是錯覺。

Fiddler 是本文介紹的最後一個工具,需要補充一下,請教了一些童鞋,它們說 Mac 下使用 Charles 會更爽,額,我是 Windows 使用者,Mac 下的童鞋就自行折騰吧。

總結

以上就是目前自己常用的一些競品分析工具,有針對 Apk 反編譯的,也有對應用進行網絡抓包的。競品分析并非隻是幫助我們去了解競争對手的産品,很多時候我隻是出于對某些應用的技術實作感興趣,而對其進行一番挖掘,挖掘的過程中你會發現某種新技術你可以開始學習了。例如像知乎使用 Realm 資料庫一樣,其實 Realm 正式版釋出也沒多久,不過既然大廠已經投入使用那有空也需要适當的跟進學習,說不定哪天 Realm 真的幹掉來了 SQLite 呢。

當然有時候除了學新技術,還派上了另一番用場,諸如某次同僚對一個 App 的某些資料資訊感興趣,于是乎專門做了爬蟲到網上爬取資料,後來我反編譯了 App 後大緻捋了一遍,發現該 App 在 raw 目錄下其實已經放着一個本地資料庫了,對比了資料基本差别無幾,直接可以拿來用了。或者可以拿着這些工具來對自家應用動手,找找自家的産品哪裡的安全性還不夠,可以進行完善彌補,未嘗不是一件好事。

文章總結到此,本人水準有限,無法做過多深入講解,感興趣競品(逆向)分析技術的童鞋可以考慮看看 《Android軟體安全與逆向分析》 或者逛逛看雪論壇膜拜一些大神的奇技淫巧!

第一時間掌握最新移動開發相關資訊和技術,請關注mobilehub公衆微信号(ID: mobilehub)。

那些值得你試試的Android競品分析工具

更多内容請關注Android知識庫。該知識庫包含了專家精心繪制的Android知識圖譜,及由特邀編輯(領域專家)從海量資料中層層篩選出的精華内容和資源(學習視訊、實踐Demo、圖書)。掃描下方二維碼,立即檢視Android知識庫精彩内容。

那些值得你試試的Android競品分析工具