Android组件化学习
in Android with 2 comments
Read: 1,998

Android组件化学习

in Android with 2 comments

Android组件化学习

额,写这篇文章前,我先声明下我是一个渣渣

Android组件化技术在2016年的MDCC大会上就已经被提出了,如果你想了解下2016年MDCC Android分会的具体内容,可点击这里:传送门

Android组件化你可以理解成拼装积木的过程,我们知道积木有很多的分块组成,每个积木又在整体中担任的任务又不同,所以说组件化是一种拼装的过程,但是在拼装积木的过程中你会发现每个积木的拼接方式不同,那么在组件化中,我们涉及组件与组件之间的通信也是一个难点,在讲述组件化的前提下,我们首先说点题外话

组件化插件化这两个技术在名字上很相近,只不过唯一的区别是组件化是在编译的时候去执行的,而插件化则是在运行的时候执行,那这么说,插件化自然而然被我们说成了黑技术,那么这么黑技术的利弊自然显而易见,我们动态修复bug,动态添加功能,但是就是由于这个动态,导致用户的个人隐私受到了影响,虽然现在android碎片化很严重,各个厂商尽可能的按照自己的意愿思想去设计自己的ROM,每个ROM都有符合自己的安全规范,但是开发者毕竟就是开发者,问题还是可以被发现的,所以这一点对用户的隐私受到了影响,而组件化和插件化没有任何的联系,我们在编译期进行组合,各个独立出来,在Release的时候进行将独立出来的module转换为library,这样对我们的app是很友好的

具体什么是组件化在前面已经说了,但是在这里我们要说下组件化的优点,我们知道,对于android开发有65535的问题,一个app超过了65535个方法,app不能在添加了,那么我们就可以通过组件化的方式进行处理,或者就是通过MultiDex、插件化,进行处理,但是组件化最重要的优点,莫过于缩短我们程序的编译时间,用过as的人都知道,当我们的项目变得很大的时候,我们的编译器执行的时候我们都可以喝杯咖啡了

对于As编译时间处理的问题,可以参考Coder-Pigd的Gradle编译优化


组件化架构图

之前我们的结构图:

组件化的结构图

通过架构图,我们可以知道,我们把我们的业务进行单独处理,这样的化就要求我们对于程序耦合程度进行更加精确的控制,因为主App,和我们其他的业务来说必然有很多的联系,比如调用我们的业务中的activity,关于这个问题我们在后续讲述

如何组件化

全局变量的配置

配置全局变量其实很简单,我们仅仅需要在我们的gradle.properties中加入isDebug=true,记住,每次更改isDebug的值都需要Sync

组件化拆分

将我们module的build.gradle进行配置

println isDebug.toBoolean()
if (isDebug.toBoolean()) {
    apply plugin: 'com.android.application'
} else {
    apply plugin: 'com.android.library'
}

这样就可以区分我们现在的是debug还是release了,因为release情况下我们的module是作为library的形式存在的,而debug则是单独的module存在的

在这里关于我们的debug还是release还会涉及一点就是我们的清单文件的配置,我们知道debug情况下,我们的module是作为单独的app存在的,那么我们的清单文件中除了包含常用的activity的声明还应该有的是

 <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
 </intent-filter>

那么在我们的release则不需要这些,那么我们将创建两份清单文件,具体的使用为:

 sourceSets {
    main {
        if (isDebug.toBoolean()) {
        manifest.srcFile 'src/main/debug/AndroidManifest.xml'
        } else {
        manifest.srcFile 'src/main/release/AndroidManifest.xml'
            }
        }
    }

这样我们就把我们的清单文件引入了

主App配置

在上面我们知道module和app在release和debug的关系了,现在我们进行使用:

 if (!isDebug.toBoolean()) {
        compile project(':componentizationlibrary')
    } else {
        compile 'com.android.support:appcompat-v7:24.2.1'
        compile 'com.android.support:design:24.2.1'
    }

这样,我们组件化就完成了


其实在配置上很简单,核心问题就是区分我们什么时期用什么东西,但是组件化最重要的是通信问题,我们来分析下通信问题

主app与module的通信

由于我们使用debug,那么module作为独立的模块,必然可以单独运行,但是主app涉及module,那么涉及的这个模块我们该怎么处理呢?


资料分享


如果你对博客有什么看法或建议或吐槽,欢迎在下方提出,Thank you ?

Responses
  1. H

    好牛逼哦

    Reply
    1. @H

      :( 嫌弃~

      Reply