专栏名称: Cang_Wang
Android研发架构师
目录
相关文章推荐
复利大王  ·  分手撕大逼!老马已不适合美国了 ·  2 小时前  
复利大王  ·  黄小姐又来搞事情? ·  昨天  
复利大王  ·  西子电梯总裁跳楼 ·  昨天  
复利大王  ·  有业主不想还房贷了? ·  2 天前  
复利大王  ·  BJ某金融国企毕业了90%? ·  2 天前  
51好读  ›  专栏  ›  Cang_Wang

[Android]你不知道的Android进程化(6)--进程通信Andromeda框架

Cang_Wang  · 掘金  · android  · 2018-06-29 01:09

正文

请到「今天看啥」查看全文


+ output.processManifest.manifestOutputDirectory.absolutePath //output.getProcessManifest().manifestOutputDirectory output.processManifest.outputs.files.each { File file -> //在gradle plugin 3.0.0之前,file是文件,且文件名为AndroidManifest.xml //在gradle plugin 3.0.0之后,file是目录,且不包含AndroidManifest.xml,需要自己拼接 //除了目录和AndroidManifest.xml之外,还可能会包含manifest-merger-debug-report.txt等不相干的文件,过滤它 if ((file.name.equalsIgnoreCase( "AndroidManifest.xml" ) && !file.isDirectory()) || file.isDirectory()) { if (file.isDirectory()) { //3.0.0之后,自己拼接AndroidManifest.xml injectManifestFile( new File(file, "AndroidManifest.xml" )) } else { //3.0.0之前,直接使用 injectManifestFile(file) } } } } } } } }

其内会写入三种文件

def static final STUB_SERVICE = 'org.qiyi.video.svg.stub.CommuStubService$CommuStubService'

xml.application {

            int index = 0
            //每个进程都声明使用这个CommuStubService文件
            customProcessNames.each {
                //加上序号,$CommuStuService会替换成数字
                String serviceName = "${STUB_SERVICE}" + index.toString()

                service("${NAME}": serviceName,
                        "${ENABLED}": "${TRUE}",
                        "${EXPORTED}": "${FALSE}",
                        "${PROCESS}": it
                )

                if (matchedServices == null) {
                    matchedServices = new HashMap<>()
                }
                matchedServices.put(it, serviceName)

                ++index
            }

这里DipatcherService和DipatchProvider是binder的中转管理控件,默认配置到主进程。

        //配置进程地址
        this.dispatcher = project.extensions.getByType(DispatcherExtension)

           //之后,写入DispatcherService和DispatcherProvider
            def dispatcherProcess = dispatcher.process
            println "dispatcher.process:" + dispatcher.process
            if (dispatcherProcess != null && dispatcherProcess.length() > 0) {
                service("${NAME}": DISPATCHER_SERVICE,
                        "${ENABLED}": "${TRUE}",
                        "${EXPORTED}": "${FALSE}",
                        "${PROCESS}": dispatcherProcess
                )

                provider(
                        "${AUTHORITIES}": getAuthority(),
                        "${EXPORTED}": "${FALSE}",
                        "${NAME}": DISPTACHER_PROVIDER,
                        "${ENABLED}": "${TRUE}",
                        "${PROCESS}": dispatcherProcess
                )

            } else {
                service("${NAME}": DISPATCHER_SERVICE,
                        "${ENABLED}": "${TRUE}",
                        "${EXPORTED}": "${FALSE}"
                )

                provider(
                        "${AUTHORITIES}": getAuthority(),
                        "${EXPORTED}": "${FALSE}",
                        "${NAME}": DISPTACHER_PROVIDER,
                        "${ENABLED}": "${TRUE}"
                )

            }

正如通信所涉及的必要的几个步骤
1.注册
2.发其通信
3.binder间的相互绑定
4.binder间传输数据

注册流程

首先注册,通过公共的Andromeda入口注册提供远程沟通的服务

Andromeda.getInstance().registerRemoteService(IBuyApple.class, BuyAppleImpl.getInstance());

    //RemoteTransfer
    public static <T extends IBinder> void registerRemoteService(Class serviceClass, T stubBinder)






请到「今天看啥」查看全文