参考
http://kaedea.com/2016/02/09/android-about-source-code-how-to-read/
https://www.zhihu.com/question/19759722
?
查看系统源码说明
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,即可。
?
?
?
?