GithubHelp home page GithubHelp logo

luckybilly / cc Goto Github PK

View Code? Open in Web Editor NEW
4.0K 115.0 635.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

CC : ComponentCaller

CC是一套Android的组件化框架,由CC核心API类库和cc-register插件组成

模块 CC cc-register
当前最新版本 Download Download

华丽丽的文档

CC的特色

  • 一静一动,开发时运行2个app:
    • 静:主App (通过跨App的方式单组件App内的组件)
    • 动:单组件App (通过跨App的方式调用主App内的组件)
  • 支持渐进式组件化改造
    • 解耦只是过程,而不是前提

一句话介绍CC:

CC是一套基于组件总线的、支持渐进式改造的、支持跨进程调用的、完整的Android组件化框架

  • 基于组件总线:
    • 不同于市面上种类繁多的路由框架,CC采用了基于组件总线的架构,不依赖于路由(路由 VS 总线)
  • 支持渐进式改造:
    • 接入CC后可立即用以组件的方式开发新业务,可单独运行调试开发,通过跨app的方式调用项目中原有功能
    • 不需要修改项目中现有的代码,只需要新增一个IComponent接口的实现类(组件类)即可支持新组件的调用
    • 模块解耦不再是前提,将陡峭的组件化改造实施曲线拉平
  • 支持跨进程调用:
    • 支持应用内跨进程调用组件,支持跨app调用组件
    • 调用方式与同一个进程内的调用方式完全一致
    • 无需bindService、无需自定义AIDL,无需接口下沉
  • 完整:
    • CC框架下组件提供的服务可以是几乎所有功能,包括但不限于页面跳转、提供服务、获取数据、数据存储等
    • CC提供了配套插件cc-register,完成了自定义的组件类、全局拦截器类及json转换工具类的自动注册,
    • cc-register同时还提供了代码隔离、debug代码分离、组件单独调试等各种组件化开发过程中需要的功能

CC的设计灵感来源于服务端的服务化架构,将组件之间的关系拍平,不互相依赖但可以互相调用,不需要再管理复杂的依赖树。

了解业界开源的一些组件化方案:多个维度对比一些有代表性的开源android组件化开发方案

demo演示

demo下载(主工程,包含ComponentB之外的所有组件)

demo_component_b组件单独运行的App(Demo_B)下载

以上2个app用来演示组件打包在主app内和单独以app运行时的组件调用,都安装在手机上之后的运行效果如下图所示

目录结构

    - cc                            组件化框架基础库(主要)
    - cc-register                   CC框架配套的gradle插件(主要)
    - cc-settings-2.gradle          组件化开发构建脚本(主要)
    - demo                          demo主程序(调用其它组件,并演示了动态组件的使用)
    - demo_base                     demo公共库(base类、util类、公共Bean等)
    - demo_component_a              demo组件A
    - demo_component_b              demo组件B(上方提供下载的apk在打包时local.properties中添加了demo_component_b=true)
    - demo_component_jsbridge       demo组件(面向组件封装的jsBridge,并演示了如何进行跨进程组件调用)
    - demo_component_kt             demo组件(kotlin)
    - demo_interceptors             demo全局拦截器(如果有多个app并且拦截器不同,可以创建多个module给不同app使用)
    - cc-settings-demo.gradle       演示如何自定义配置文件,如:添加actionProcessor自动注册的配置
    - demo-debug.apk                demo安装包(包含demo/demo_component_a/demo_component_kt)
    - demo_component_b-debug.apk    demo组件B单独运行安装包

创建组件

创建一个组件很简单:只要创建一个IComponent接口的实现类,在onCall方法中实现组件暴露的服务即可

public class ComponentA implements IComponent {
  @Override
  public String getName() {
      //指定组件的名称
      return "ComponentA";
  }

  @Override
  public boolean onCall(CC cc) {
    //在此处将组件内部的服务暴露给外部调用
    //组件内部的逻辑与外部完全解耦
    String actionName = cc.getActionName();
    switch (actionName) {
      case "showActivity": //响应actionName为"showActivity"的组件调用
        //跳转到页面:ActivityA
        CCUtil.navigateTo(cc, ActivityA.class);
        //返回处理结果给调用方
        CC.sendCCResult(cc.getCallId(), CCResult.success());
        break;
      default:
        //其它actionName当前组件暂时不能响应,可以通过如下方式返回状态码为-12的CCResult给调用方
        CC.sendCCResult(cc.getCallId(), CCResult.errorUnsupportedActionName());
        break;
    }
    return false;
  }
}

调用组件

CC 使用简明的流式语法API,因此它允许你在一行代码搞定组件调用:

"CC"也是本框架主入口API类的类名,是由ComponentCaller缩写而来,其核心职能是:组件的调用者

CC.obtainBuilder("ComponentA")
  .setActionName("showActivity")
  .build()
  .call();

也可以这样

CC.obtainBuilder("ComponentA")
  .setActionName("showActivity")
  .build()
  .callAsync();

或者这样

CC.obtainBuilder("ComponentA")
  .setActionName("showActivity")
  .build()
  .callAsyncCallbackOnMainThread(new IComponentCallback() {
        @Override
        public void onResult(CC cc, CCResult result) {
          String toast = result.isSuccess() ? "success" : "failed";
          Toast.makeText(MainActivity.this, toast, Toast.LENGTH_SHORT).show();
        }
    });

开始使用

看文档看文档看文档

混淆配置

不需要额外的混淆配置

自动注册插件

CC专用版:cc-register,fork自AutoRegister,在自动注册的基础上添加了一些CC专用的业务

通用版:

源码:AutoRegister 原理:android扫描接口实现类并通过修改字节码自动生成注册表

版本更新日志

请点击:更新日志

遇到问题怎么办?

  • 先打开CC的日志开关,看完整的调用过程日志,这往往能帮助我们找到问题
CC.enableDebug(true);  //普通调试日志,会提示一些错误信息
CC.enableVerboseLog(true);  //组件调用的详细过程日志,用于跟踪整个调用过程
  • 文档
  • 看issue了解开源社区上其它小伙伴提出的问题及解答过程,很可能就有你现在遇到的问题
  • 提issue,如果以上还没有解决你的问题,请提一个issue,这很可能是个新的问题,提issue能帮助到后面遇到相同问题的朋友
  • 加下方的QQ群提问

QQ群

QQ群号:686844583

CC交流群

或者扫描下方二维码加群聊

image

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 编译时注册错误,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 注册错误了。

在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("\.", "/") + ".*"
]
]

自动注册插件注册不上

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

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'),这个应该怎样拿到值?非常感谢.

目前编译并不支持 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框架对登录进行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

IComponent 注册不成功?

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

image

MIUI9 android 8.0 不能启动

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

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

moudle 直接共享组件的问题

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

启动页放入独立模块

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

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

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上看到是有注册的.

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

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

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) 

找不到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)

不支持3.1.2的编译

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

在组件中传递事件

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

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

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

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

默认超时是多久

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

插件问题?

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 这里面有说到

主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中有相应的方法接收到这个传值再去做其他事。请问下这个该怎么写?

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

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

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

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

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

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

合并模块打包

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

cc框架 无法使用instant run

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

请问cc支持ButterKnife么?

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

关于数据库设计

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

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

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

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

            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
    }

}

关于 Auto register Custom ActionProcessor into component 不生效

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

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.