• 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:Androidsdkplatformsandroid-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:Androidsdkplatformsandroid-xxandroid.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:Userspuppet.IdeaIC2019.2configoptionsjdk.table.xml文件。

    由于as在3.4中修改了project structure界面,把sdks去掉了,没法再ide上修改,所以直接手动修改jdk.table.xml。

    1. 打开C:Userspuppet.AndroidStudio3.4configoptionsjdk.table.xml文件,找到对应的Android版本,在<classPath>标签里加入对应的完全版android.jar。
    2. 然后重启as,即可。

  • 相关阅读:
    alternatives命令用法
    Apache Kafka官方文档翻译(原创)
    java===泛型
    java===map集合
    java===集合框架之HashSet,treeSet
    java===集合之linkedlist
    java===集合框架之list体系
    StringBuilder===练习
    java===String类练习
    java练习多线程
  • 原文地址:https://www.cnblogs.com/muouren/p/11701664.html
Copyright © 2020-2023  润新知