EP3-Android源码的食用方法

Android源码的食用方法

0x00 Prelude

有时候感觉发自内心地喜欢Android。不仅是因为我们可以创造「小而美」的应用程序,还因为Google提供了很好的售后服务。

前两天了解了一些关于ClassLoader的东西,我想真正的学习模式应该是在用到的时候再去查找,比如公司需要真正开发一套插件框架,我再去学习,这样的动机下可能动力会更足。现在是处于学习阶段,虽然不知道看了有什么用,但还是去看吧。

Android源码很庞大,要完整看完是不太可能,我想起高中数学老师常常教育我们的一句话:「不要想着一口吃成个胖子。」所以可以慢慢来。好在我们可以站在巨人的肩膀上,已经有很多人写了源码的阅读笔记,比如罗升阳的博客和书。

0x01 怎么找到具体的类

ClassLoader.java可以在Android Studio的android.jar中看到,只要按住CMD点击左键就可以跳转了,这是因为Android Studio下载sdk的时候attach了源码到android.jar上。但是DexClassLoade.java的源码打开的时候,看到的就是反编译出来的代码了;
这是因为android.jar只会attach到一些常用的源码,DexClassLoader.java这个类,是在Dalvik目录下的,也许不是很常用,所以我们看到的是反编译出来的源码。反编译出来的源码没有注释,可读性也差很多。比如,我们看到的是这样的:

public BaseDexClassLoader(String dexPath, File optimizedDirectory, String libraryPath, ClassLoader parent) {
       throw new RuntimeException("Stub!");
    }

这个的意思是,函数具体的实现都放在ROM中了,不在这里暴露。

我们可以去谷歌AOSP的网站上去看源码。比如android.jar,它的内容基本都在https://android.googlesource.com/platform/frameworks/base/+/android-6.0.1_r21/core/java/android/这个路径下。但是内容太多,找了一段时间也没找到BaseDexClassLoader.java的位置,怎么办?

这时候可以借助Google,直接搜索:
where is BaseDexClassLoader.java,可以看到,贴心的Google第一条给出了API的地址,第二条给出了BaseDexClassLoader在AOSP中的地址。

.

0x02 插件的加载

插件装载的执行顺序是:

BaseDexClassLoader--->pathList.findClass(name)--->loadClassBinaryName(),最终指向了一个native方法loadClassBinaryName()。

    /**
     * Finds the named class in one of the dex files pointed at by
     * this instance. This will find the one in the earliest listed
     * path element. If the class is found but has not yet been
     * defined, then this method will define it in the defining
     * context that this instance was constructed with.
     *
     * @return the named class or {@code null} if the class is not
     * found in any of the dex files
     */
    public Class findClass(String name) {
        for (Element element : dexElements) {
            DexFile dex = element.dexFile;
            if (dex != null) {
                Class clazz = dex.loadClassBinaryName(name, definingContext);
                if (clazz != null) {
                    return clazz;
                }
            }
        }
        return null;
    }

好了,明天我们看看Robile中的Plugin为什么重写了loadClass()方法。

-NOV23

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 177,896评论 25 709
  • 今天老师没有将什么新的内容,但是把昨天的内容复习了一遍。我把昨天不会的请教了老师,老师给我们详细的讲解,可...
    宋肖鹏阅读 112评论 0 0
  • 为什么要做竞品分析? 我们经常能听到设计师与产品经理争论,“这个功能为什么这么设计···”,“这个功能为什么不这么...
    钴蓝阅读 4,844评论 0 12
  • 超级行动课第一次作业 想了很久才想到这一些技能,全都是在学习中,还没有达到可以使用的地步。
    腹黑的小屁孩阅读 191评论 0 0

友情链接更多精彩内容