3个按钮
Build 菜单下的 clean project, make project(build) 和 项目名右边的 run
2种操作, 操作的都是上述3个按钮,不使用命令行
1. clean run
clean 后直接 run 安装到手机
2. clean build run
clean 后先build生成文件, run 安装到手机
clone 项目后不修改代码
默认状态是 :demo 依赖 a, b 独立运行
1. 正常结果
clean run demo
:demo:transformClassesWithAuto-registerForDebug
start auto-register transform...
register scan all class cost time: 336 ms
insert register code to file:D:\github_repo\CC\demo\build\intermediates\transforms\auto-register\debug\0.jar
com/billy/cc/demo/component/a/ComponentA
com/billy/cc/demo/lifecycle/LifecycleComponent
codeInsertToClassName:com/billy/cc/core/component/ComponentManager.class
The specified register class not found:com/billy/cc/demo/component/b/ComponentB
register insert code cost time: 15 ms
register cost time: 351 ms
:demo:transformClassesWithDexBuilderForDebug
demo 依赖 a, 所以注册 a 相关内容,没问题。
此时手机上没有b,所以功能没响应,正常。
run demo_component_b 或 clean run demo_component_b,效果一致
:demo_component_b:transformClassesWithAuto-registerForDebug
start auto-register transform...
register scan all class cost time: 259 ms
insert register code to file:D:\github_repo\CC\demo_component_b\build\intermediates\transforms\auto-register\debug\1.jar
com/billy/cc/demo/component/b/ComponentB
codeInsertToClassName:com/billy/cc/core/component/ComponentManager.class
insert register code to file:D:\github_repo\CC\demo_component_b\build\intermediates\transforms\auto-register\debug\13\com\billy\cc\demo\component\b\ComponentB.class
com/billy/cc/demo/component/b/processor/CheckAndLoginProcessor
com/billy/cc/demo/component/b/processor/GetDataProcessor
com/billy/cc/demo/component/b/processor/GetNetworkDataProcessor
com/billy/cc/demo/component/b/processor/LoginProcessor
com/billy/cc/demo/component/b/processor/ShowActivityProcessor
register insert code cost time: 24 ms
register cost time: 283 ms
:demo_component_b:transformClassesWithDexBuilderForDebug
安装好 b 后,demo 可以调起 b, 正常。
错误
clean build
:demo:transformClassesWithAuto-registerForDebug
start auto-register transform...
register scan all class cost time: 324 ms
insert register code to file:D:\github_repo\CC\demo\build\intermediates\transforms\auto-register\debug\0.jar
com/billy/cc/demo/component/a/ComponentA
com/billy/cc/demo/lifecycle/LifecycleComponent
codeInsertToClassName:com/billy/cc/core/component/ComponentManager.class
The specified register class not found:com/billy/cc/demo/component/b/ComponentB
register insert code cost time: 15 ms
register cost time: 339 ms
:demo:transformClassesWithDexBuilderForDebug
//
// ... 省略中间过程
//
:demo_component_b:transformClassesWithAuto-registerForDebug
start auto-register transform...
register scan all class cost time: 272 ms
insert register code to file:D:\github_repo\CC\demo_component_b\build\intermediates\transforms\auto-register\debug\1.jar
com/billy/cc/demo/component/a/ComponentA
com/billy/cc/demo/lifecycle/LifecycleComponent
com/billy/cc/demo/component/b/ComponentB
codeInsertToClassName:com/billy/cc/core/component/ComponentManager.class
insert register code to file:D:\github_repo\CC\demo_component_b\build\intermediates\transforms\auto-register\debug\13\com\billy\cc\demo\component\b\ComponentB.class
com/billy/cc/demo/component/b/processor/CheckAndLoginProcessor
com/billy/cc/demo/component/b/processor/GetDataProcessor
com/billy/cc/demo/component/b/processor/GetNetworkDataProcessor
com/billy/cc/demo/component/b/processor/LoginProcessor
com/billy/cc/demo/component/b/processor/ShowActivityProcessor
register insert code cost time: 19 ms
register cost time: 291 ms
:demo_component_b:transformClassesWithDexBuilderForDebug
过程中会有两段注册
demo 的注册 正常
component b 的将 a 和 demo 的 LifecycleComponent 也注册进去了
run demo, run b,demo 调用 b,崩溃
FATAL EXCEPTION: main
Process: com.billy.cc.demo.component.b:cc, PID: 28648
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/billy/cc/demo/component/a/ComponentA;
at com.billy.cc.core.component.ComponentManager.<clinit>(ComponentManager.java:27)
at com.billy.cc.core.component.ComponentManager.hasComponent(ComponentManager.java:73)
at com.billy.cc.core.component.ComponentBroadcastReceiver.onReceive(ComponentBroadcastReceiver.java:29)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:3252)
at android.app.ActivityThread.-wrap17(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1677)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.billy.cc.demo.component.a.ComponentA" on path: DexPathList[[zip file "/data/app/com.billy.cc.demo.component.b-08ksbCINS5fkD1IJp9sOmQ==/base.apk"],nativeLibraryDirectories=[/data/app/com.billy.cc.demo.component.b-08ksbCINS5fkD1IJp9sOmQ==/lib/x86, /system/lib, /system/vendor/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:93)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at com.billy.cc.core.component.ComponentManager.<clinit>(ComponentManager.java:27)
at com.billy.cc.core.component.ComponentManager.hasComponent(ComponentManager.java:73)
at com.billy.cc.core.component.ComponentBroadcastReceiver.onReceive(ComponentBroadcastReceiver.java:29)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:3252)
at android.app.ActivityThread.-wrap17(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1677)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
反复试了一晚上才有了比较稳定的复现,为了你能准确的重现问题,后续描述比较啰嗦
环境 win10, AS 3.0.1
3个按钮 Build 菜单下的 clean project, make project(build) 和 项目名右边的 run
2种操作, 操作的都是上述3个按钮,不使用命令行
clone 项目后不修改代码
默认状态是 :demo 依赖 a, b 独立运行
1. 正常结果
clean run demo
demo 依赖 a, 所以注册 a 相关内容,没问题。
此时手机上没有b,所以功能没响应,正常。
run demo_component_b 或 clean run demo_component_b,效果一致
安装好 b 后,demo 可以调起 b, 正常。
错误
clean build
过程中会有两段注册
demo 的注册 正常
component b 的将 a 和 demo 的 LifecycleComponent 也注册进去了
run demo, run b,demo 调用 b,崩溃
问题是 build 时 b 注册错误了。