0.查看Android framework源碼


參考

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

 

在線查看系統源碼

http://androidxref.com/

 

https://cs.android.com/

這個是官方出的,和第一個類似。

 

在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文件比較困難,這也是為什么我選擇模擬器的原因。

 

  1. adb pull /system/framework/framework.jar

    或使用DDMS里的File Explorer。

  2. 從framework.jar中提取出classes.dex,
  3. 使用dex2jar工具,將其轉換成classes.jar
  4. 然后把classes.jar里的文件都替換到android.jar中。
  5. 替換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。

  1. 打開C:\Users\puppet\.AndroidStudio3.4\config\options\jdk.table.xml文件,找到對應的Android版本,在<classPath>標簽里加入對應的完全版android.jar。
  2. 然后重啟as,即可。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM