美文网首页
重载ClassLoader一个构造方法给BaseDexClass

重载ClassLoader一个构造方法给BaseDexClass

作者: 修符道人 | 来源:发表于2020-01-11 15:22 被阅读0次

最近,在研究Android的dex加载相关的源码,想在DexClassLoader、BaseDexClassLoader、ClassLoader加点日志。但是日志又不能直接加,得通过dexPath限制一下,否则系统起不来,因为ClassLoader会被频繁调用。

BaseDexClassLoader

源码目录:libcore/dalvik/src/main/java/dalvik/system
编译目录:libcore


basedex.jpg

ClassLoader

源码目录:libcore/libdvm/src/main/java/java/lang
编译目录:libcore


classloader.jpg

编译

image.png

我想着,是不是BaseDexClassLoader和ClassLoader不能同时修改,我先把BaseDexClassLoader保持不修改(使用原来的不带dexPath的super方法),编译一次之后,再修改。结果还是如此。

是不是由于构造方法的特殊性导致编译不通过呢?我尝试着在ClassLoader里新增个方法,BaseDexClassLoader仍然一样无法调用。

所以,上面的问题的本质归结为:同一目录下,两个Java类A和B,假如B增加个方法,A引用B的这个方法,编译不通过,报A找不到B的这个方法。
百度了半天也没有任何的资料说明相关的问题,只有自己一点点试探了。

模拟最简单的场景

https://www.jianshu.com/p/8b77c62273c0,这里正常生成Jar包。可见是libcore的特定环境导致了编译失败。

问题终于解决

搞了好几天,终于明白了,看编译日志是编译core-libart.jar包,是art!!!
而ClassLoader有两个类:

image.png
我只改了libdvm下的ClassLoader,而现在编译的是core-libart.jar,所以把两个目录下的ClassLoader都改一下就好了。
但是,发现安装app的时候,安装不上去,报错:
I/dalvikvm( 2564): java.lang.NullPointerException:

I/dalvikvm( 2564):  at java.util.logging.Logger.log(Logger.java:1036)

I/dalvikvm( 2564):  at java.util.logging.Logger$1.publish(Logger.java:81)

I/dalvikvm( 2564):  at java.util.logging.Logger.log(Logger.java:924)

I/dalvikvm( 2564):  at java.util.logging.Logger.warning(Logger.java:853)

I/dalvikvm( 2564):  at dalvik.system.DexFile.log(DexFile.java:93)

I/dalvikvm( 2564):  at dalvik.system.DexFile.openDexFile(DexFile.java:315)

I/dalvikvm( 2564):  at dalvik.system.DexFile.<init>(DexFile.java:82)

I/dalvikvm( 2564):  at dalvik.system.DexFile.<init>(DexFile.java:61)

I/dalvikvm( 2564):  at dalvik.system.DexPathList.loadDexFile(DexPathList.java:263)

在ClassLoader里引用Logger打日志,就会报上面的错误。所以把Logger里加个null判断。


log.jpg

相关文章

  • 重载ClassLoader一个构造方法给BaseDexClass

    最近,在研究Android的dex加载相关的源码,想在DexClassLoader、BaseDexClassLoa...

  • C#多态的表现-方法重载,方法重写以及密封类的特点

    方法重载 方法重载:构造函数就属于特殊的方法重载 方法重载:是指同一个类中相同方法的不同行为 方法重载的特点: 1...

  • java05(构造函数重载与构造代码块)

    构造函数的重载: 构造函数的命名就是类名 java构造函数可以重载很多次。构造方法重载具体好处就是:扔进来...

  • Mybatis SqlSessionTemplate 实例化过程

    构造方法 SqlSessionTemplate的构造方法源代码如下,其他构造方法,都是在此构造方法上进行的重载。 ...

  • 构造方法的重载及注意事项

    A:案例演示 构造方法的重载 重载:方法名相同,与返回值类型无关(构造方法没有返回值),只看参数列表 B:构造方法...

  • NO.15 构造方法的重载

    构造方法的重载 重载:方法名相同,与返回值类型无关(构造方法没有返回值),只看参数列表 构造方法注意事项...

  • 第五章 货物管理

    构造方法的重载 构造方法的重载是指在同一个类中存在着若干个具有不同参数列表的构造方法。有时在一个类定义内可能出现多...

  • java6

    重载,尤其是构造方法的重载,要用起来。构造方法的重载可以在赋值的时候使用,来增加输入的友好性,但是重载,解决不了不...

  • Java构造方法以及重载

    构造方法以及重载 »作用:完成对对象中的属性赋值 »构造方法 ■ 构造方法是一个特殊的方法,构造方法名字必须与类名...

  • 2018-07-27

    今天看了构造方法的重载

网友评论

      本文标题:重载ClassLoader一个构造方法给BaseDexClass

      本文链接:https://www.haomeiwen.com/subject/cvovactx.html