luckybilly / cc Goto Github PK
View Code? Open in Web Editor NEW业界首个支持渐进式组件化改造的Android组件化开源框架,支持跨进程调用。Componentize your android project gradually.
Home Page: https://luckybilly.github.io/CC-website/
License: Apache License 2.0
业界首个支持渐进式组件化改造的Android组件化开源框架,支持跨进程调用。Componentize your android project gradually.
Home Page: https://luckybilly.github.io/CC-website/
License: Apache License 2.0
修改项目 demo build.gradle
// compile project(':demo_component_a')
compile project(':demo_component_b')
demo 依赖 b, a 独立运行
: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 未 安装,所以也没反应
: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 正常,但调不起来,可能是权限问题,没去试
: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)
单独以app运行时的组件,在android8.0 上不能启动,设备是MIX2 MIUI9,单独安装的app已经打开一次了。还是不行,提示指定的ComponentName没有找到
最核心的问题是怎么在两个独立业务组建间的跳转,比如从ActivityA跳转到ActivityB。
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框架使用
ext.mainApp = true
apply from: '../cc-settings.gradle'
后,无法使用instant run。
每次都重新打包重启。
在每个模块里面都有自己的application初始化分模块怎么做
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上看到是有注册的.
你好,麻烦问下,
1.在实际公司组件化git部署用的哪种方式,gitsubmodule,repo,还是直接组件打包aar发布maven然后主项目引用,或者其他方式。最近再纠结选哪种方式。
已解决:
需要在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文件夹下的所有文件移除吗?
有种场景,demoA demoB 以及他们依赖的base ,在base 中定义一个接口 Itest,在demoA中有 Itest 的实现,demoA demoB 在同一个application 中时,demoB 可以获取demoA 中的 Itest 的实现,分别运行时就不行了,这种场景下除了下沉到base 以外还有别的解决方案吗
java.lang.OutOfMemoryError
pthread_create (1040KB stack) failed: Out of memory
java.lang.Thread.nativeCreate(Native Method)
多次调用会创建很多线程
参考你的《实现登录成功再进入目标界面功能》代码
login页面没调用 CC.sendCCResult(callId, result);返回了,默认超时是多久
升级as到3.1后,如果希望可以更新下
WARNING: Configuration 'compile' is obsolete and has been replaced with 'implementation'.
CC添加Tinker热修复,在使用修复包后无法打开组件提示CCResult结果提示:{"success":false,"code":-5}
demo中,每次在local.properties 修改配置之后,执行“Refresh all gradle projects”后针对manifest修改偶尔会出现不能修改的情况,demo_component_kt会出现,原理是什么?在什么时候触发修改
详细描述: 项目工程**有三个module: HostApp
、ComponentA
、ComponentB
,运行HostApp时发现,其依赖的ComponentA、B
也作为App安装到测试机中。
原因分析: 经 @luckybilly 提醒,发现之前进行组件测试时修改了它们的Manifest文件,导致有了3个Launch Activity
。
建议: 组件module中的测试activity、application可以写在debug目录中,这样就不会出现你debug的代码影响正式包的情况了。可参考demo:
启动页放入独立组件后,app的启动会报错 ;
如果启动页不能放入组件,可能后期的app壳就一定要保持一个act了
例如文件下载进度回调,需要多次回调。
问题是这样的,单独运行,数据绑定没有问题,作为库依赖,数据绑定会失败,具体代码是:
https://gist.github.com/vihuela/05f06193410456f91c59bd4a8821372e/
18行的DataBindingUtil.inflate会执行失败,binding 返回空,暂时未解决
首先感谢你的开源!
我在进行组件化拆分的时候,对于数据库的设计存在疑问。
我使用的是Room数据库开发,对其进行组件拆分的时候目前只想到如下方式:
问题描述:
比如我的moduleA和moduleB,用到了共享的全局变量及持久化数据,两个组件整合运行时,没有问题。
但是现在两个组件单独运行,它们共享的全局变量和持久化数据,就需要做好同步。
如果它们之间有比较大量的这种共享数据,如果每次修改都一个个去手动做同步,工作量不小,维护起来也麻烦,
请问:
有没有比较好的方式解决这个问题?
每次更改module为app模式运行,都需要clean一次才能运行成功的,有没有什么可以解决的办法?
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 这里面有说到
当module_name=true时,运行app module获取组件失败,code为-5,单独其他module能够成功运行。
当module_name=false时,运行app module成功
需求: 进入登录页面前,如果已经记住了密码,直接静默自动登录,否则进入到登录页面手动登录。
调用代码:
// 闪屏延迟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
华为荣耀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)
反复试了一晚上才有了比较稳定的复现,为了你能准确的重现问题,后续描述比较啰嗦
环境
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 独立运行
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)
问题是 build 时 b 注册错误了。
hi,您好,我想问一下CC框架是否能够向组件传递事件?如账号注销事件 该如何传递给各组件?
比如:我在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中有相应的方法接收到这个传值再去做其他事。请问下这个该怎么写?
组件无法运行,难道组件中debug包需要手动添加?
你好,读了一下项目,非常感谢开源.我们项目现在使用ButterKnife,请问CC组件化时支持ButterKnife么?
提示json解析错误
引用不到library里面res,
请问怎么解决?
大神是否考虑使用lifecycle-component这个组件提供生命周期来进行相应的改造
module中只要apply @@了cc-settings.gradle这个plugin,
在这个生成类中,
DataBinderMapperImpl() {
addMapper(new com.XXX.DataBinderMapperImpl());
addMapper(new com.android.databinding.library.baseAdapters.DataBinderMapperImpl());
addMapper(new com.XXX.baselibs.DataBinderMapperImpl());
}
貌似对应的Mapper没生成出来?导致DataBindingUtil.setContentView()返回为空...
再用gradle 3.1.2编译时会报错 各种的android**.jar出错.这时更改为3.0.1进行编译立刻就好,为什么
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.