0.查看Android framework源码

时间:2024-04-17 12:07:31

参考

http://kaedea.com/2016/02/09/android-about-source-code-how-to-read/

https://www.zhihu.com/question/19759722

https://blog.****.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,即可。