KotlinAndroid

Introduction: 组件化 + MVP + Retrofit + RxKotlin + Dagger2 实现的一款用 Kotlin 语言编写的多媒体类应用。
More: Author   ReportBugs   
Tags:

基于组件化 + MVP + Retrofit + RxKotlin + Dagger2 实现的一款用 Kotlin 语言编写的影视类应用。

APK 下载

点击下载

说明

PluginSwitch:插件项目

如何使用 Android Studio 开发 Gradle 插件

实现了两个功能:

  • 1.自动切换 library 和 Application

    如果 gradle.properties 中配置了 isRunAlone=true,也就是能够独立运行,那么点击运行按钮可以选择该模块自动运行,无需在 build.gradle 文件中配置。如果运行的是主 module,不管其依赖的 module 是否可以独立运行,插件自动设置为 library。实现真正的自动切换。

    //不需要再通过变量来控制了
    if(isHomeModule.toBoolean()){
      apply plugin: 'com.android.library'
    }else{
      apply plugin: 'com.android.application'
    }
    //省略资源目录的配置
    

    效果图:

  • 2.主 Module 在开发时不依赖业务模块,只要在运行打包时才依赖,彻底避免业务模块之间的耦合

    通过在 build.gradle 配置,通过字节码插桩来实现的。 ``` 主 module 依赖其他模块配置在该目录下的 gradle.properties 中配置: debugComponent=Home,Crosstalk,Music,Player //debug 时依赖的 compileComponent=Home,Crosstalk,Music,Player //release 时依赖的

不需要在 build.gradle 中依赖了 api project(':Home') api project(':Music') ......

>这样主 Module 在开发时不再依赖具体的业务模块,只是使用业务模块提供的服务,所以业务模块需要实现 Provider 模块定义的接口,提供具体的业务。

interface IApplicationLike {

/** 组件加载*/
fun registered()

/** 组件卸载*/
fun unregistered()

}

定义 Music 模块提供的服务 interface MusicService {

fun getMusicFragment(): BaseFragment

}


>组件之间页面跳转(通信)使用的是路由:**ARouter**


### componentrelease:文件夹
>该文件夹存放的是业务模块的.aar 包,在执行业务 Module 的`assembleRelease`命令后会生成对应的.aar 包,也可以上传到 maven 仓库。这样的话主 Module 只需要依赖.arr 包。哪个业务 Module 改变只需要编译哪个生成对应的.aar 包即可,实现真正的组件化。

>如果项目中的 module 很多,gradle 在编译的时候会去检测 module 的依赖链,gradle 会帮助我们层层梳理 module 之间的关系,避免因为 module 之间相互引用而来带的问题。这些梳理工作和 module 的合并工作都会带来 build 的时间,会造成 build 十分缓慢,所以将稳定的 module 打包为 aar,上传到公司的 maven 仓库,借此来加快 build 速度。


### API 说明
>项目中用到的数据都是通过解析网站数据而来,所以没有固定的接口格式。因此没有封装统一的网络工具类,而使用三方库[okhttp-OkGo](https://github.com/jeasonlzy/okhttp-OkGo)来请求,便于解析数据。

[Jsoup](http://www.open-open.com/jsoup/)

### build 文件

#### [common.gradle](/common.gradle):三方依赖库和版本管理,统一放在该文件中。

#### [and_res_guard.gradle](/and_res_guard.gradle):微信开源工具[AndResGuard](https://github.com/shwenzhang/AndResGuard)资源文件"混淆"配置文件。

>[Android 打包那些事](https://www.jianshu.com/p/5255cf853fad)

#### [libbase.gradle](/libbase.gradle):多 Module build 文件公共部分抽取。

#### [releaseinfo.gradle](/releaseinfo.gradle):版本发布文档自动维护脚本

//该文档自动生成,只需要在 build 中配置版本更新日志。 <?xml version="1.0" encoding="GBK"?>

1 1.0.0 App 的第 1 个版本,上线了一些最基础核心的功能。

110 1.1.0 App 的第 2 个版本,修复网络数据解析问题,处于稳定版本。 ```

Gradle 实战

屏幕适配

采用 smallestWidth 适配

smallestWidth 限定符适配和宽高限定符适配最大的区别在于,前者有很好的容错机制,如果没有对应 dp 文件夹,系统会向下寻找,比如离 360dp 最近的只有 value-sw350dp,那么 Android 就会选择 value-sw350dp 文件夹下面的资源文件。这个特性就完美的解决了上文提到的宽高限定符的容错问题。

自动生成适配文件工具 AndroidUI 屏幕适配

模块化结构图

Common 为公共库,主要包含一些基类和常用的工具类,Provider 依赖于 Common,是模块真正依赖的库。其中业务模块包括:Home,Music,User,Player。每个业务模块对应一个 Module。主模块 APP 和业务模块都依赖 Provider,主模块 APP 在开发阶段不再依赖具体的业务模块,彻底隔离业务模块之间的耦合。业务模块统一实现 Provider 中定义的接口,暴露需要提供的服务。

效果图

首页模块

音乐模块

电视直播,相声模块

Support Me
Apps
About Me
Google+: Trinea trinea
GitHub: Trinea