Giter Site home page Giter Site logo

luckybilly / cc Goto Github PK

View Code? Open in Web Editor NEW
4.0K 115.0 637.0 31.67 MB

业界首个支持渐进式组件化改造的Android组件化开源框架,支持跨进程调用。Componentize your android project gradually.

Home Page: https://luckybilly.github.io/CC-website/

License: Apache License 2.0

Java 70.91% Kotlin 0.70% Groovy 24.36% JavaScript 2.60% HTML 1.36% Shell 0.07%
cc android-architecture android-component component architecture-components componentization

cc's Introduction

GitHub stats

cc's People

Contributors

ccixyj avatar hubertyoung avatar luckybilly avatar seasonfif avatar sloaix avatar zhangkangbin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cc's Issues

AutoRegister 编译时注册错误,2. 修改为 demo 依赖 b,a 独立运行

修改项目 demo build.gradle

//    compile project(':demo_component_a')
    compile project(':demo_component_b')

demo 依赖 b, a 独立运行

错误 1

  1. clean run demo
:demo:transformClassesWithAuto-registerForDebug
start auto-register transform...

register scan all class cost time: 345 ms

insert register code to file:D:\github_repo\CC\demo\build\intermediates\transforms\auto-register\debug\0.jar
com/billy/cc/demo/component/b/ComponentB
com/billy/cc/demo/lifecycle/LifecycleComponent

codeInsertToClassName:com/billy/cc/core/component/ComponentManager.class

register insert code cost time: 14 ms
register cost time: 359 ms

:demo:transformClassesWithDexBuilderForDebug

b 的 action 没有注册进去

demo 调用b 没反应,因为action 没注册进去
a 未 安装,所以也没反应

  1. run a 或 clean run a

:demo_component_a:transformClassesWithAuto-registerForDebug
start auto-register transform...

register scan all class cost time: 226 ms

insert register code to file:D:\github_repo\CC\demo_component_a\build\intermediates\transforms\auto-register\debug\0.jar
com/billy/cc/demo/component/a/ComponentA

codeInsertToClassName:com/billy/cc/core/component/ComponentManager.class

register insert code cost time: 19 ms
register cost time: 245 ms

:demo_component_a:transformClassesWithDexBuilderForDebug

A 正常,但调不起来,可能是权限问题,没去试

错误 2

  1. clean build
:demo_component_a:transformClassesWithAuto-registerForDebug
start auto-register transform...

register scan all class cost time: 220 ms

insert register code to file:D:\github_repo\CC\demo_component_a\build\intermediates\transforms\auto-register\debug\0.jar
com/billy/cc/demo/component/a/ComponentA

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: 16 ms
register cost time: 236 ms

:demo_component_a:transformClassesWithDexBuilderForDebug
// 
// 省略
//
:demo:transformClassesWithAuto-registerForDebug
start auto-register transform...

register scan all class cost time: 328 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/component/b/ComponentB
com/billy/cc/demo/lifecycle/LifecycleComponent

codeInsertToClassName:com/billy/cc/core/component/ComponentManager.class
insert register code to file:D:\github_repo\CC\demo\build\intermediates\transforms\auto-register\debug\14.jar
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

codeInsertToClassName:com/billy/cc/demo/component/b/ComponentB.class

register insert code cost time: 22 ms
register cost time: 350 ms

:demo:transformClassesWithDexBuilderForDebug

a 正常

demo 将 a 也注册了

点击demo 任意按钮崩溃

FATAL EXCEPTION: main
Process: com.billy.cc.demo, PID: 30079
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.call(Unknown Source:0)
   at com.billy.cc.core.component.CC.call(CC.java:558)
   at com.billy.cc.demo.MainActivity.onClick(MainActivity.java:73)
   at android.view.View.performClick(View.java:6256)
   at android.view.View$PerformClick.run(View.java:24697)
   at android.os.Handler.handleCallback(Handler.java:789)
   at android.os.Handler.dispatchMessage(Handler.java:98)
   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-mqT17mT7WX75xV-GDvINqw==/base.apk"],nativeLibraryDirectories=[/data/app/com.billy.cc.demo-mqT17mT7WX75xV-GDvINqw==/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.call(Unknown Source:0) 
   at com.billy.cc.core.component.CC.call(CC.java:558) 
   at com.billy.cc.demo.MainActivity.onClick(MainActivity.java:73) 
   at android.view.View.performClick(View.java:6256) 
   at android.view.View$PerformClick.run(View.java:24697) 
   at android.os.Handler.handleCallback(Handler.java:789) 
   at android.os.Handler.dispatchMessage(Handler.java:98) 
   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) 

MIUI9 android 8.0 不能启动

单独以app运行时的组件,在android8.0 上不能启动,设备是MIX2 MIUI9,单独安装的app已经打开一次了。还是不行,提示指定的ComponentName没有找到

目前编译并不支持 Instan Run

java.util.NoSuchElementException  
java.lang.RuntimeException: com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: Failed to execute aapt  
com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: Failed to execute aapt  
com.android.ide.common.process.ProcessException: Failed to execute aapt  
java.util.NoSuchElementException  

cc框架 无法使用instant run

cc框架使用
ext.mainApp = true
apply from: '../cc-settings.gradle'
后,无法使用instant run。
每次都重新打包重启。

体验了一下新的跨进程交互

hi,我拉了您开发分支来体验了一下,发现一个问题:
W/System.err: android.content.ActivityNotFoundException: Unable to find explicit activity class {com.android.vending/com.billy.cc.core.component.remote.RemoteConnectionActivity}; have you declared this activity in your AndroidManifest.xml?
我在AndroidManifest上看到是有注册的.

实际公司组件化git部署用的哪种方式

你好,麻烦问下,
1.在实际公司组件化git部署用的哪种方式,gitsubmodule,repo,还是直接组件打包aar发布maven然后主项目引用,或者其他方式。最近再纠结选哪种方式。

在Common层中定义了BaseComponent实现了IComponent为什么接收不到onCall传递的事件

已解决:

需要在cc-setting.gradle里面使用autoregist注入BaseComponent的类名

project.ext.registerInfoList = [
[ //自动注册组件
'scanInterface' : 'com.billy.cc.core.component.IComponent'
//扫描指定父类的子类(注:abstract抽象类不会被自动注册)
, 'scanSuperClasses' : ['app.btcsql.com.common.base.component.BaseComponent']
, 'codeInsertToClassName': 'com.billy.cc.core.component.ComponentManager'
, 'registerMethodName' : 'registerComponent'
, 'exclude' : [//排除的类,支持正则表达式(包分隔符需要用/表示,不能用.)
'com.billy.cc.core.component.'.replaceAll("\.", "/") + ".*"
]
]

合并模块打包

在合并各个模块,打release包的时候会把各个模块中debug文件夹下的所有文件移除吗?

moudle 直接共享组件的问题

有种场景,demoA demoB 以及他们依赖的base ,在base 中定义一个接口 Itest,在demoA中有 Itest 的实现,demoA demoB 在同一个application 中时,demoB 可以获取demoA 中的 Itest 的实现,分别运行时就不行了,这种场景下除了下沉到base 以外还有别的解决方案吗

autoregister 引入JavaVersion.VERSION_1_8后不能注册的问题(续)

但我并未设置
jackOptions {
enabled true
}
仅仅新建了一个module并且在它的gradle配置文件中设置了
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
就找不到了额...

com.android.tools.build:gradle:3.0.1 版本添加 java8,应该默认不打开jack的吧。

image

默认超时是多久

参考你的《实现登录成功再进入目标界面功能》代码
login页面没调用 CC.sendCCResult(callId, result);返回了,默认超时是多久

切换libray和application针对manifest修改不生效

demo中,每次在local.properties 修改配置之后,执行“Refresh all gradle projects”后针对manifest修改偶尔会出现不能修改的情况,demo_component_kt会出现,原理是什么?在什么时候触发修改

打包主App时,发现组件也作为App安装到手机中

详细描述: 项目工程**有三个module: HostAppComponentAComponentB ,运行HostApp时发现,其依赖的ComponentA、B也作为App安装到测试机中。

原因分析:@luckybilly 提醒,发现之前进行组件测试时修改了它们的Manifest文件,导致有了3个Launch Activity

建议: 组件module中的测试activity、application可以写在debug目录中,这样就不会出现你debug的代码影响正式包的情况了。可参考demo:
image

启动页放入独立模块

启动页放入独立组件后,app的启动会报错 ;
如果启动页不能放入组件,可能后期的app壳就一定要保持一个act了

addComponent方法里无法识别module的ext.runAsApp属性

image

hi,你好,我尝试在demo_component_a的gradle文件的第一行加了runAsApp=true,之后demo_component_a作为一个独立App是可以编译安装的.但是demo不能,如果没在loca.properties做配置的话会在addComponent方法里,他会把demo_component_a加入到demo依赖中去.
请问componentProject.ext.has('runAsApp'),这个应该怎样拿到值?非常感谢.

关于数据库设计

首先感谢你的开源!
我在进行组件化拆分的时候,对于数据库的设计存在疑问。
我使用的是Room数据库开发,对其进行组件拆分的时候目前只想到如下方式:

  1. 每个组件都维护各自一份db,其表和DAO都定义在各自的组件中,但这样使用的时候每个组件都会存在一个db数据库及实例,感觉存在性能问题。
  2. 独立一个数据库模块,只维护一份db,将所有的表及其操作都定义在其中,但这么做,内容都集中在一块了,感觉进行的组件化就有点变味了。
    想请问下在配合该框架进行组件拆分的时候,有没更好的数据库拆分方式?

关于 Auto register Custom ActionProcessor into component 不生效

抱歉,大神再次打扰,学习使用您开源CC框架中,遇到一个问题:
// compile project(':demo_component_b')后,自定义的ActionProcessor找不到,不能自动注册。
image
compile project(':demo_component_b')后,就能注册成功了。
image
请问就是这样,还是我哪里操作不对呢。。
谢谢您百忙中抽出时间的解答。

多组件单独运行时,原本共享的数据如何同步比较好

问题描述:
比如我的moduleA和moduleB,用到了共享的全局变量及持久化数据,两个组件整合运行时,没有问题。
但是现在两个组件单独运行,它们共享的全局变量和持久化数据,就需要做好同步。
如果它们之间有比较大量的这种共享数据,如果每次修改都一个个去手动做同步,工作量不小,维护起来也麻烦,

请问:
有没有比较好的方式解决这个问题?

IComponent 注册不成功?

新建module可以创建Component可注册成功并且可以调用成功,但是修改原有的module gradle文件后,却调用始终返回-5,即找不到Component。配置都配置了。不过差异是原有的module里会引用其他的插件例如greendao这样的,是否有影响AutoRegister注册??
image

image

自动注册插件注册不上

interceptor:com.billy.cc.core.component.LocalCCInterceptor.CCResult:{"success":false,"code":1,"errorMessage":"has not support for action:login"}

componentName和actionName都是一样的

`public class ComponentB implements IComponent {

public static final String ComponentName = "library_b.ComponentB";

private AtomicBoolean initialized = new AtomicBoolean(false);
private final HashMap<String, IActionProcessor> map = new HashMap<>(4);

public void initProcessors() {
}

private void add(IActionProcessor processor) {
    map.put(processor.getActionName(), processor);
}

@Override
public String getName() {
    return ComponentName;
}

@Override
public boolean onCall(CC cc) {

// switch (cc.getActionName()) {
// case "login":
// map.put(cc.getActionName(), new LoginProcessor());
// break;
// case "getNetData":
// map.put(cc.getActionName(), new NetProcessor());
// break;
// }

    if (initialized.compareAndSet(false, true)) {
        synchronized (map) {
            initProcessors();
        }
    }
    String actionName = cc.getActionName();
    IActionProcessor processor = map.get(actionName);
    if (processor != null) {
        return processor.onActionCall(cc);
    }
    CC.sendCCResult(cc.getCallId(), CCResult.error("has not support for action:" + cc.getActionName()));
    return false;
}`

其中map的size为0

在调用没有注册组件的时候,全局拦截器没有执行,我想在组件没有的时候,统一提示:功能正在开发中

调用代码,这个组件并没有注册:

            CC.obtainBuilder("TaskComponentCC")
                    .setContext(this)
                    .setActionName("showTaskDetails")
                    .build()
                    .call()

全局拦截器:

class ToastInterceptor : IGlobalCCInterceptor {
    override fun intercept(chain: Chain): CCResult {
        val ccResult = chain.proceed()
        if (!ccResult.isSuccess) {
            "功能正在开发中,敬请期待!".infoToast()
        }
        ccResult.logJson()
        return ccResult
    }

    override fun priority(): Int {
        return 100
    }

}

插件问题?

Unexpected scopes found in folder '/Users/xx/MEGA/AndroidStudio/CC/demo_component_b/build/intermediates/transforms/mergeJniLibs/debug'. Required: PROJECT. Found: EXTERNAL_LIBRARIES, PROJECT, SUB_PROJECTS

重现步骤,使用demo,在demo_base中引入一个包含.so的库如:com.bugtags.library:bugtags-lib:3.0.0
1.运行demo_component_b正常
2.切换运行demo爆出上面异常

https://blog.csdn.net/fengrui_sd/article/details/78658103 这里面有说到

用CC框架对登录进行AOP实现时,出现Call超时的问题

需求: 进入登录页面前,如果已经记住了密码,直接静默自动登录,否则进入到登录页面手动登录。
调用代码:

// 闪屏延迟400毫秒后进行登录
mDisposable = Observable.timer(400, TimeUnit.MILLISECONDS)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(aLong -> {
         //  这里会出现超时result就会一直为flase
          CCResult result = CC.obtainBuilder("component_login")
              .setActionName("init").setNoTimeout().build().call();
          if (result.isSuccess()) {
            toastMessage("登录成功");
            CC.obtainBuilder("component_navigation").build().call();
          } else {
            toastMessage("登录失败");
          }
        });

登录组件call()方法:

  @Override
  public boolean onCall(CC cc) {
    Context context = cc.getContext();
    String account = PreferenceManager.getDefaultSharedPreferences(context)
        .getString(Config.PREFERENCES_KEY_USER_ACCOUNT, "");
    String pwd = PreferenceManager.getDefaultSharedPreferences(context)
        .getString(Config.PREFERENCES_KEY_USER_PASSWORD, "");
    // 如果没有在Prenference中记录账号密码,直接进入登录页面
    if (TextUtils.isEmpty(account) || TextUtils.isEmpty(pwd)) {
      Intent intent = new Intent(context, LoginActivity.class);
      intent.putExtra("callId", cc.getCallId());
      if (!(context instanceof Activity)) {
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      }
      context.startActivity(intent);
    } else {
    // 如果在Prenference中记录了账号密码,直接静默登录
      DataRepository dataRepository = new DataRepository(context);
      dataRepository.login(account, pwd, new DataSourceCallback<String>() {
        @Override
        public void onSuccess(String data) {
          CCResult result = CCResult.success();
          CC.sendCCResult(cc.getCallId(), result);
        }

        @Override
        public void onFailed(String msg) {
          CC.sendCCResult(cc.getCallId(), CCResult.error(msg));
        }
      });
    }
```java
**登录页`onDestroy()`方法:**
```java
  @Override
  public void onDestroy() {
    super.onDestroy();
    String callId = Objects.requireNonNull(getActivity()).getIntent().getStringExtra("callId");
    if (!TextUtils.isEmpty(callId)) {
      CCResult result;
      if (TextUtils.isEmpty(PreferenceManager.getDefaultSharedPreferences(getContext())
          .getString(Config.PREFERENCES_KEY_USER_PASSWORD, ""))) {
        result = CCResult.error("login_cancel");
      } else {
        result = CCResult.success();
      }
      CC.sendCCResult(callId, result);
    }
  }
```java

找不到CCUtil

华为荣耀honor h30-L01 ,android版本 4.4.2 初始化时候崩溃
E/AndroidRuntime: FATAL EXCEPTION: main java.lang.NoClassDefFoundError: com.billy.cc.core.component.CCUtil at com.billy.cc.core.component.CC.<clinit>(CC.java:67) at com.cop.filesearch.MyApp.onCreate(MyApp.java:29) at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1009) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4621) at android.app.ActivityThread.access$1800(ActivityThread.java:138) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1299) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5297) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:851) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:667) at dalvik.system.NativeStart.main(Native Method)

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

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

环境
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 注册错误了。

在组件中传递事件

hi,您好,我想问一下CC框架是否能够向组件传递事件?如账号注销事件 该如何传递给各组件?

主APP与组件之间值传递

比如:我在APP这个主工程的MainActivity中调用了ComponentA组件中的ActivityA,采用String callId = CC.obtainBuilder("ComponentA").build().callAsync(new IComponentCallback(){...})这种方式,在ComponentA中拦截到并CC.sendCCResult(cc.getCallId(), CCResult.success())处理,那么主APP中立即会在Callback中得到结果,这个OK。但是,现在是这样一个场景:我需要在ActivityA销毁或者点击某个地方触发的事件的时候,把数据回传到MainActivity,并且MainActivity中有相应的方法接收到这个传值再去做其他事。请问下这个该怎么写?

请问cc支持ButterKnife么?

你好,读了一下项目,非常感谢开源.我们项目现在使用ButterKnife,请问CC组件化时支持ButterKnife么?

不支持3.1.2的编译

再用gradle 3.1.2编译时会报错 各种的android**.jar出错.这时更改为3.0.1进行编译立刻就好,为什么

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.