參考
http://kaedea.com/2016/02/09/android-about-source-code-how-to-read/
https://www.zhihu.com/question/19759722
https://blog.csdn.net/hejjunlin/article/details/53454514
查看系統源碼說明
1.可以在sdk中source查看大部分framework源碼
2.如果在sdk中的source找不到某系統類源碼,則可以在官方源碼網查看
https://android.googlesource.com/?format=HTML
其中framework源碼在platform/frameworks/base,
android/platform/frameworks/base/android-xxx/./core/java
在線查看系統源碼
這個是官方出的,和第一個類似。
在AS 中查看隱藏的API源碼
platform和sources目錄的關系
AS會把platform里面的android.jar里的class文件關聯到sources里對應的java文件。
也就是說android.jar里面沒有的類,在AS里也看不到,android.jar有對應的class文件才能映射到sources里對應的java文件。
如果沒有對應api的sources的話就會解析顯示android.jar里的class文件。
1.介紹
Android有兩種類型的API是不能經由SDK訪問的。
- 第一種是位於com.android.internal包中的API。我將稱之為internal API。
- 第二種API類型是一系列被標記為@hide屬性的類和方法。
Internal和hidden API的編譯時 vs 運行時
當你使用Android SDK進行開發的時候,你引用了一個非常重要的jar文件——android.jar。它位於Android SDK平台的文件夾中(SDK_DIR/platforms/platform-X/android.jar)。這個android.jar移掉了com.android.internal包中所有的類,也移掉了部分標記有@hide的類,枚舉,字段和方法。
每個模擬器或真機在運行時都會有一個等同android.jar的東西,叫做framework.jar,它和android.jar等同,而其未移掉internal API和hidden API。當你在設備上啟動應用程序時,它將加載framework.jar。
但這樣對開發者來說,並不能友好地訪問,因此,我將向大家展示不通過反射如何使用這些API。
2.解決方法
方法一
大致流程就是:我們可以從framework.jar,提取出原始的.class文件,並拷貝到Android SDK的android.jar中。
注意:模擬器通常在.dex文件中包含代碼,而真機一般在優化版的dex文件中包含代碼——odex文件。操作odex文件比較困難,這也是為什么我選擇模擬器的原因。
-
adb pull /system/framework/framework.jar
或使用DDMS里的File Explorer。
- 從framework.jar中提取出classes.dex,
- 使用dex2jar工具,將其轉換成classes.jar
- 然后把classes.jar里的文件都替換到android.jar中。
-
替換D:\Android\sdk\platforms\android-xx里的android.jar即可
注意:記得備份原android.jar
注意:可能高版本系統把隱藏api分到了多個jar包中,所以都需要進行上面操作
- android.policy.jar
- framework.jar
- framework2.jar
- services.jar
方法二
在萬能的GitHub已有人去除Android.jar中@hide注解
地址: https://github.com/anggrayudi/android-hidden-api
1.下載對應API版本的Android.jar
2.替換SDK/platforms/android-版本/Android.jar
3.重新打開IDE就可以查看
直接調用隱藏API的缺點:
1.Android隱藏API是因為不能保證這些API還存在新系統版本, 所以盡量少用隱藏API!
2.不利於團隊合作,如果有人使用正常Android.jar就無法編譯如endCall()之類的隱藏API!
eclipse中查看Android源碼
在eclipse中隨便創建一個項目,
右鍵項目-》properties-》java build path-》Libraries-》Add external jars-》選擇D:\Android\sdk\platforms\android-xx\android.jar
在android.jar下的source attachment
使用Idea查看Android源碼
之前有eclipse來查看Android的framework源碼,但eclipse的查找功能太弱,不太方便。AS的查看很方便但每次查看Android源碼都得修改platform的android.jar,很不方便。
可以用IntelliJ IDEA來進行查看。
關聯Android sdk,
隨便創建一個java項目即可
然后打開項目的Project Structure,在sdks下可以看到可用的sdk,其中就包含了Android sdk,就可以通過修改classpath
然后再modules選項卡中,項目根目錄的dependencies時jdk,這里可以直接就修改根目錄的引用的sdk。
或者可以創建一個新的module,修改module的dependencies,這樣就可以同時訪問jdk和Android sdk中的源碼。
在AS 中查看隱藏的API源碼2
不知道怎么回事,在idea上查看不了布局,所以經過各種嘗試又回到了使用AS查看源碼。
具體就是模仿idea在project structure中的設置。最終其實是修改的C:\Users\puppet\.IdeaIC2019.2\config\options\jdk.table.xml文件。
由於as在3.4中修改了project structure界面,把sdks去掉了,沒法再ide上修改,所以直接手動修改jdk.table.xml。
-
打開C:\Users\puppet\.AndroidStudio3.4\config\options\jdk.table.xml文件,找到對應的Android版本,在<classPath>標簽里加入對應的完全版android.jar。
-
然后重啟as,即可。