luckybilly / CC

业界首个支持渐进式组件化改造的Android组件化开源框架,支持跨进程调用。Componentize your android project gradually.
https://luckybilly.github.io/CC-website/
Apache License 2.0
4.04k stars 636 forks source link

AutoRegister 编译时注册错误,1. 不修改项目 #9

Closed kassadin closed 6 years ago

kassadin commented 6 years ago

反复试了一晚上才有了比较稳定的复现,为了你能准确的重现问题,后续描述比较啰嗦

环境 win10, AS 3.0.1

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. 正常结果

  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,所以功能没响应,正常。

  2. 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, 正常。

错误

  1. 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 也注册进去了

  2. 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) 

    问题是 build 时 b 注册错误了。

luckybilly commented 6 years ago

@kassadin 谢谢反馈,这是AutoRegister的一个bug,AutoRegister V1.2.0已修复