U2020代码目录结构分析
U2020是JakeWharton在github的一个开源项目(参与人有很多,不只是JakeWharton一个人完成的),虽然代码量不少,但也只是一个Demo程序,涵盖了很多开源库的使用。
Dagger - http://square.github.io/dagger 地球人都知道
ButterKnife - http://jakewharton.github.io/butterknife 视图注入工具
Retrofit - http://square.github.io/retrofit 网络交互框架
Moshi - https://github.com/square/moshi JSON解析
Picasso - http://square.github.io/picasso 图片加载
OkHttp - http://square.github.io/okhttp 大名鼎鼎的http请求框架
RxJava - https://github.com/ReactiveX/RxJava
Timber - http://github.com/JakeWharton/timber 日志工具
Madge - http://github.com/JakeWharton/madge 测试相关
ProcessPhoenix - https://github.com/JakeWharton/ProcessPhoenix 应该是一个在程序崩溃的时候重新启动的工具
Scalpel - http://github.com/JakeWharton/scalpel 测试相关
LeakCanary - http://github.com/square/leakcanary 内存泄露检测工具
想把这个开源项目的代码基本掌握,需要先准备一下的知识点
- Gradle
- 依赖注入(Dependency Inject)这个就参照Dagger的实现就OK
- Android Studio开发环境的使用,说实话,U2020是我在AndroidStudio上面编译的第一个程序,对这个IDE的不熟悉,也带来了很多的麻烦
- 理解Java的注解
上面这四点能够理解,就能开始学习一下U2020(如果这四点都不了解,看这个代码绝对都是云里雾里一样)下面我们来看代码的目录结构:
怎么这么多文件夹,到底哪个是主要的文件夹,编译的时候,是每一个文件夹都参与编译??,先让我们来看build.gradle这个文件
buildscript {
repositories {
//maven {
// url 'https://oss.sonatype.org/content/repositories/snapshots/'
//}
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
}
}
buildTypes {
debug {
applicationIdSuffix '.debug'
}
}
productFlavors {
internal {
applicationId 'com.jakewharton.u2020.internal'
}
production {
applicationId 'com.jakewharton.u2020'
}
}
exclude 'LICENSE.txt'
}
}
// TODO remove eventually: http://b.android.com/162285
configurations {
internalDebugCompile
}
这里面先看productFlavors这一段
productFlavors {
internal { //internal这个是不是看着很眼熟
applicationId 'com.jakewharton.u2020.internal'
}
production {//production这个字段看着是不是也很眼熟
applicationId 'com.jakewharton.u2020'
}
}
是的这就对应上面的项目目录文件夹internal和production,productsFlavors是Gradle支持,打包配置不同的项目的自动化方法,也就是说,可以编译生成internal和production的APK文件,但是不需要堆代码做任何的变更,完全通过Gradle已经定义好的配置文件就可以完成,那么这又是怎么做到的?
其实很简单,productsFlavors中的internal就对应项目目录中的internal文件夹,production也一样,但是查看这两个 文件夹下对应的java文件,仿佛又不完整,其实main文件夹下才是整个项目的主要文件夹,所以整个目录结构是这样的
- main文件夹:是共有的文件夹,无论是编译internal或者是production的APK文件,main都是必定要包含其中的
- internal文件夹:编译internal的APK文件对应的文件夹 编译的目标代码 = main + internal
- production文件夹:编译production的APK文件对应的文件夹,编译的目标代码 = mian +production
但是还有internalDebug、internalRelease、productionDebug、productionRelease这四个文件夹,是分别对应每一个productFlavor的Debug和Release版本,所以:
internal相关的release的APK编译的目标代码 = main + internal + internalRelease
每个文件夹下有可能也包括AndroidManifest文件,其中的内容都将包含在main文件夹下得AndroidManifest文件中,这样是不是很方便,每个文件夹(也可以理解为每个模块)以自己为单位,定义Activity,并将其登记在自己模块下的AndroidManifest文件中,在项目中,有很多可能需要用一版代码为Base,编程出很多变种的APK(比如带广告的,免费的,体验版本的等等),其中包含的源代码文件也不劲相同,放到不同的文件夹下,独立成一个模块,和Base程序互不干扰,在编译的时候通过Gradle配置来进行编译,就是那么的feel倍爽
其实这篇文章写的跟U2020这个开源项目没有太多的关系,只是先借着这个项目来理解一下Gradle,我在刚看这个项目的时候确实因为Gradle的不太熟悉,蒙了很长时间,以后会分析一些U2020相关的代码