1. 程式人生 > >關於Android原始碼的理解以及如何閱讀原始碼

關於Android原始碼的理解以及如何閱讀原始碼

文章最早釋出於我的微信公眾號 Android_De_Home 中,歡迎大家掃描下面二維碼關注微信公眾獲取更多知識內容。
本文為sydMobile原創文章,可以隨意轉載,但請務必註明出處!

平時我們在用Android Studio開發專案的時候,如果想要檢視原始碼,直接 Ctrl + 左鍵 檢視對應的原始碼,你可能會發現有一些具體原始碼看不到,或者部分程式碼飄紅。我們就來說說這一部分。

IDE檢視原始碼出現的問題

我們的Android專案都是需要依賴Android SDK裡對應的API Level的android.jar包的,這樣才可以使用Android提供的API,在IntelliJ裡面,檢視具體類的原始碼的時候,如果Android SDK裡對應的API Level的Source包有下載的話,IDE會開啟對應的Source包,如果沒有下載的話,IDE會把對應的API Level的android.jar包反編譯場成Java程式碼,這個規則對於其他的一些第三方的開源專案也是一樣的。但是你最好還是下載Source原始碼來檢視,有的時候反編譯的Java程式碼不可能完全和原始碼一樣,有時候反編譯的程式碼的執行邏輯可能完全等價,但是可閱讀性不好,有可能會缺少重要的程式碼註釋。

因為Android SDK自帶的Source原始碼包很小(你可能會說已經好幾個G了還小啊,後面會講到真正的Android原始碼,哪個時候你就知道了),並沒有包括所有的Android Framework的原始碼僅僅是提供給應用開發者參考使用,有一些比較少的系統類的原始碼沒有給出,所有你有可能在檢視原始碼的時候看到這種情況
RuntimeException(“Stub”)
runtimeexception
檢視程式碼的時候遇到這種情況,表示實際執行的時候邏輯會到Android ROM(這裡Android ROM可以理解為你Android手機的Android系統,裡面同樣也包含了你在開發的時候用到的類)裡面找相對應的類和方法來代替執行。
此外我們在IDE中檢視原始碼的時候,還會經常看到一些類和方法中會出現報紅(也就是找不到)的情況,這種情況在我們檢視原始碼的時候是很常見的。
飄紅

這種情況並不是說這些方法或者變數是不存在的,而是這些方法因為出於安全或者某些原因被我們使用的Android SDK隱藏了,這些API不直接暴露給應用層的開發者,這些類和方法在Android原始碼編譯完成的android.jar包裡面會把這些API隱藏(如果是你自己編譯的Android原始碼的話就不會了,後面的文章會講),而我們的Android專案是依賴這個編譯後的android.jar包的,所以我們在檢視原始碼的時候,IDE就會自動去android.jar裡面找對應的API,所以就會出現這種情況了,實際上這種API同樣在ROM中是存在的,有些開發者發現了一些可以修改系統行為的隱藏API,在應用層通過反射的方式強行呼叫這些API執行系統功能,這種手段也是一種HACK。

上面講了我們在IDE中直接檢視原始碼有可能會出現的問題,下面就介紹一下怎麼檢視完整的原始碼。

檢視完整原始碼

當你需要檢視完整原始碼的時候,需要去AOSP(Android Open Source Project)專案裡面找了,(需要科學上網)這個裡面放著Android真正的完整原始碼,這裡所說的完整原始碼不僅僅包括Android系統的原始碼還包括了一些開發工具比如:aapt、adb等等。
android原始碼
選擇自己需要的下先來,如果全部下載下來估計有幾個T吧,不過其實是不需要的,作為應用層的開發,我們看應用層原始碼就好了
應用層原始碼

介紹檢視原始碼工具:

AndroidInterviewQuestions
關注微信公眾號,及時獲取內容更新