从2.0.0开始,CC的自动注册插件从通用的AutoRegister改为定制化的CCRegister 在根目录需要将插件地址换一下:
buildscript {
dependencies {
classpath 'com.billy.android:autoregister:x.x.x' //使用最新版
}
}
改为
buildscript {
dependencies {
classpath 'com.billy.android:cc-register:x.x.x' //使用最新版
}
}
由于2.0.0开始使用定制化的插件,插件名称发生了变化,并且将许多原来在cc-settings.gradle中的配置已放在插件中完成,减少配置文件的复杂度
为了兼容以前直接apply github上cc-settings.gradle文件的用户,2.0版该gradle文件命名为cc-settings-2.gradle
从2.0.0版本开始,不再推荐直接依赖github上的cc-settings-2.gradle文件,推荐下载到工程根目录下使用,主要原因有:
- github上的文件偶尔会在编译时出现下载失败的情况
- cc-settings-2.gradle内容只包含了使用插件和添加对CC库的依赖,其它内容都已移至cc-register插件中维护
- 此文件是为了给用户避免在每个组件中添加重复的代码使用,可在文件中添加自己的配置逻辑,建议在本地维护
之前是通过apply from: 'https://raw.githubusercontent.com/luckybilly/CC/master/cc-settings.gradle'
方式接入,按如下方式修改:
- 未新增/修改任何配置:
- 下载
cc-settings-2.gradle
文件到工程根目录,并使用该文件:apply from: rootProject.file('cc-settings-2.gradle')
- 下载
- 有类似于cc-settings-demo.gradle的扩展配置文件:
- 下载
cc-settings-2.gradle
文件到工程根目录,并使用该文件:apply from: rootProject.file('cc-settings-2.gradle')
- 将之前在文件中添加的
project.ext.registerInfoList.add
改为:ccregister.registerInfo.add
放到cc-settings-2.gradle
文件中
- 下载
之前是通过apply from: rootProject.file('cc-settings.gradle')
方式接入,按如下方式修改:
- 未新增/修改任何配置:
- 重新下载
cc-settings-2.gradle
文件并替换原来的cc-settings.gradle
文件(或者复制文件中的内容覆盖原来的内容)
- 重新下载
- 有类似于cc-settings-demo.gradle的扩展配置文件:
- 重新下载
cc-settings-2.gradle
文件并替换原来的cc-settings.gradle
文件(或者复制文件中的内容覆盖原来的内容) - 将文件中的
project.ext.registerInfoList.add
改为:ccregister.registerInfo.add
- 重新下载
2.0以前,组件切换app/lib运行方式的步骤为:
- 在local.properties中修改配置: module_name=true
- sync 或 clean 工程比较大的情况下,sync/clean耗时比较长,影响开发效率 借鉴DDComponentForAndroid的思路: 让所有组件可直接在Android Studio中点击绿色Run按钮独立运行,无需sync和clean
在CC 2.0.0及以上版本中:
- 不在兼容在module/build.gradle中添加
ext.runAsApp=true
来实现组件独立运行- 但仍然可以通过
if (project.ext.runAsApp) { ... }
来判断当前module当前是否以app方式编译运行
- 但仍然可以通过
- 所有组件可直接在Android Studio中点击绿色Run按钮直接运行
- 需要注意的是,编译主app时,需要在local.properties添加配置:
module_name=true
将单独运行的组件从主app打包依赖项中排除
- 需要注意的是,编译主app时,需要在local.properties添加配置:
- 主app module一直以application方式编译,可以用如下方式来标记:
- 在module/build.gradle中添加
ext.mainApp=true
- 在module/build.gradle中添加
- 依赖CC的公共库module(如demo_base/demo_interceptors)一直以library方式编译,可选如下方式中的一种来实现:
- 直接将CC添加到dependencies列表
api 'com.billy.android:cc:x.x.x'
,而不是apply cc-settings-2.gradle文件 - 或者在apply cc-settings-2.gradle之前添加
ext.alwaysLib=true
- 直接将CC添加到dependencies列表
- 默认情况下通过assemble命令打包是打apk包,若要打aar包,可用如下方式来实现:
- 在local.properties中添加
assemble_aar_for_cc_component=true
- 在local.properties中添加
注:默认情况下未开启App内部多进程的支持
可下载cc-settings-2.gradle
文件到本地根目录,并在文件最后添加:
ccregister.multiProcessEnabled = true
并在组件类(IComponent
实现类)上添加一个注解,标明其所在进程(在主进程运行组件无需添加注解)
注意:这样做并不是创建新的进程,而是指定此组件在哪个进程运行(如果AndroidManifest.xml中没有对应的进程,此组件无效)
public class DemoComponent implements IComponent{} //DemoComponent组件在主进程运行
@SubProcess(":yourProcessName") //指定DemoComponentA组件所在的进程名称为 'packageName:yourProcessName'
public class DemoComponentA implements IComponent{}
@SubProcess("a.b.c") //指定DemoComponentB组件所在的进程名称为 'a.b.c'
public class DemoComponentB implements IComponent{}
@AllProcess //指定DemoComponentC组件在主进程和所有子进程内都存在,每个进程调用进程内部的DemoComponentC组件
public class DemoComponentC implements IComponent{}
为了支持多进程通信,CCRegister插件会在编译时扫描合并后的AndroidManifest.xml
文件中所有四大组件
收集所有子进程名称,为每个子进程生成一个RemoteProvider
的子类并注册到AndroidManifest.xml
文件中
这样做是因为:
如果放在Transform.transform方法中修改,在扫描完class代码之后再修改AndroidManifest.xml,无效
欢迎提PR优化
这将导致一些不含有子进程组件的进程也会生成一个没有任何作用的RemoteProvider
的子类,这会额外带来一点点内存消耗。
虽然这种内存消耗是可以基本忽略的,但是还是可以通过如下方式添加配置来避免:
ccregister.excludeProcessNames = [':processNameA', ':processNameB']
动态组件在其被注册的进程中运行,如:在主进程中调用CC.registerComponent(dynamicComponent);
,dynamicComponent将在主进程中运行
5.1 关于CC调用日志
开启verbose日志(CC.enableVerboseLog(true);
)后
由于会频繁调用cc.toString()
、ccResult.toString()
、remoteCC.toString()
、remoteCCResult.toString()
会带来一定的性能损耗
故在打正式上线包时,一定要将其关闭CC.enableVerboseLog(false);
(默认是关闭状态)
5.2 关于跨App调用
如果要调用的app不是存活状态,或者刚刚重新安装该app或杀掉重启app(这种情况常见于单组件调试时修改代码重新打包运行)
跨进程调用之前,会先唤醒该app,并通过RemoteProvider
获取调用该进程组件的句柄:RemoteCCService
由于(app唤醒 -> ContentProvider初始化完成 -> 获取句柄)这个过程需要一定的时间:根据app初始化耗时不同而有差异
所以:跨app调用时,初次调用会消耗大约100ms左右的时间,但这只在开发期间有影响,不会影响正式产品