问题
在我们的工程使用中,如果存在相同名称的Java类名,但是也是包名不同来区分,但是如果我们依赖的库中存在两个相同的类名,并且包名也相同的两个类时,gradle编译后会是什么现象呢?让我们带着这个问题来继续下面的实验。
创建工程
让我们创建一个demo工程,并新建一个lib库依赖
让我们现在app下创建一个Utils类,然后在utillibs模块下创建一个包名类名完全跟Utils相同的类。
在app工程下使用Utils类
查看调用log:
2020-05-07 21:49:05.163 11451-11451/com.baidu.testgradlelibsameclass D/glttest app: testLib: in app
根据当前实验现象,可以看到,一个工程下存在相同的包名和类名的类,在App中调用是 调用的的app module下的Utils。
在lib模块下调用
我们在utillibs工程下调用Utils,会发现在代码中能够看到 lib工程下的Utils的两个方法。然后我们依然在app下调用Same.same(); 查看log:
2020-05-07 21:55:26.195 13767-13767/com.baidu.testgradlelibsameclass D/glttest app: testLib: in app
我们看到输出依然是app下的Utils输出。
那么我们在调用下另外一个方法testUse运行下看下效果:
Process: com.baidu.testgradlelibsameclass, PID: 14803
java.lang.NoSuchMethodError: No static method testUse()V in class Lcom/baidu/testgradlelibsameclass/utils/Utils; or its super classes (declaration of 'com.baidu.testgradlelibsameclass.utils.Utils' appears in /data/app/com.baidu.testgradlelibsameclass-UPUGAABZ0rsMyM48SfkUJQ==/base.apk!classes2.dex)
at com.baidu.testgradlelibsameclass.utils.Same.same(Same.java:8)
at com.baidu.testgradlelibsameclass.MainActivity$1.onClick(MainActivity.java:32)
at android.view.View.performClick(View.java:6668)
at android.view.View.performClickInternal(View.java:6639)
可以看到会报错。
结论
从上述两个实验中,我们可以得出结论,如果存在多个模块 含有相同的包名和类名的 java类,编译器最后会以app模块下的类为准。其他模块下的被忽略丢弃。