这两天博客更新都在草稿箱里面,争取周三晚前把他们发出来!嘿嘿嘿。
上上周面试了一家公司,其中有个问题就是问我Android的项目结构,挺简单的一个问题,但是当时讲得不太好,所以我这里来总结一下!
一般常用的项目结构有Android模式和Project模式,Android模式是经过as转换过的,不是真实的项目结构,但是便于开发,很容易找到经常用的那几个文件夹。
切换到Project结构模式:
1..gradle 和.idea
这两个目录下放置的都是AS自动生成的一些文件,我们不需要关心和编辑。
2.app
项目中的代码,资源文件都是放置在这个目录下的,后面的开发工作也是在这个目录下进行的。
展开app:
(1)build
主要包含编译时自动生成的文件
(2)libs
第三方jar包都放在libs目录下。放在这个目录下的jar包都会被自动添加到构建路径里去。
(3)androidTest
这里是用来编写AndroidTest测试用例的,可以对项目进行一些自动化测试
(4)java
放置我们自己写的java文件的地方。活动也在里面。
(5)res
放置资源文件的地方。
(6)AndroidManifest.xml
这里时Android项目里的配置文件,在程序里面定义的四大组件都需要在这里注册,还有权限声明也要在这里说明。
(7) test
这里是对项目进行自动化测试的另一种方式
(8).gitignore
用于将app模块内的指定的目录和文件排除在版本控制之外。
(9)app.iml
IDEA自动生成的。
(10)build.gradle
这是app模块的gradle构建脚本,这个文件中会指定很多项目构建相关的配置。
(11)proguard_rules.pro
这个文件用于指定项目代码的混淆规则,当代码开发完成后打成安装包文件,如果不希望代码被别人破解,通常会将代码进行混淆。
3.build
主要包含了一些在编译时自动生成的文件。
4.gradle
这个目录下包含了gradle wrapper的配置文件
5.gitignore
这个文件是用来将指定的目录或文件排除在版本控制之外的。
6.build.gradle
这是项目全局gradle的构建脚本。
7.gradle.properties
这个文件是全局的gradle配置文件,这里配置的属性将会影响到项目所有的gradle编译脚本。
8.gradlew和gradlew.bat
这两个文件是用来在命令行中执行gradle命令的,其中gradlew是在Linux或Mac系统下使用的,gradlew.bat是在windows系统下使用的。
9.HelloWorld.iml
这是用来标识这是一个IntelliJ IDEA项目,不需要修改这个文件中的任何内容
10.local.properties
这个文件用于指定本机中的Android SDK路径,通常内容都是自动生成的,不需要修改。
11.setting.gradle
这个文件用于项目所有引入的模块。由于HelloWorld项目中就只有一个app模块,因此该文件只引入了app这一模块。
Android的运行流程
介绍完目录结构之后,简单说下一个android项目是怎么运行起来的:
1.首先需要在Manifest.xml文件中进行注册。
可以看到上面注册了两个活动,其中
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
表示OkHttpActivity是主活动,在手机上点击这个图标,首先启动的就是这个活动。
2.启动活动之后,可以看到这个活动继承的是AppCompatActivity,这是一种向下兼容的Activity,可以将Activity在各个系统版本中增加的特性和功能最低兼容到Android2.1系统。Activity是Android系统提供的一个活动基类,我们所有项目都需要继承它或者它的子类才能拥有活动的特性(AppCompatActivity是Activity的子类)
活动中的onCreate()方法是活动创建时一定会被执行的方法。在这个方法里,调用了了setCntentView()方法,这个方法给当前活动引入了一个activity_ok_http布局。
3.activity_ok_http布局:这个布局文件存放在layout文件夹下,定义视图。
详解build.gradle文件
先来看最外层目录下的build.gradle
两处repositories的闭包中都声明了jcenter()这行配置,他是一个代码托管仓库,声明了这个配置之后,就可以在项目中引用任何jcenter上的开源项目了。
接下来,dependencies闭包中使用classpath声明了一个Gradle插件。
下面再来看一下app目录下的build.gradle文件
apply plugin: 'com.android.application' 这里表示应用了一个应用程序模块,还能选择com.android.library,表示引用的是一个库模块。程序模块和库模块最大的区别在于一个是可以直接运行的,一个只能作为代码库依附于别的应用程序模块来运行。
接下来是一个大的Android闭包,在这个闭包中我们可以配置项目构建的各种属性,其中compileSdkVersion用于指定项目的编译版本。
在android闭包中又嵌套了一个defaultConfig闭关,defaultConfig闭包,defaultConfig闭包中可以对项目的更多细节进行配置,其中applicationId用于指定项目的包名。minSdkVersion用于指定项目最低兼容的Android系统版本,这里的15指的是最低兼容到Android4.0系统。targetSdkVersion指定的值表示你在该项目版本上已经做过充分的测试,系统将会为你的应用程序启用一些最新的功能和特性。
接下来是buildTypes闭包,buildTypes闭包中用于指定生成安装文件的相关配置,通常只会有两个子闭包,一个是debug,一个是release。debug闭包用于指定生成测试版安装文件得配置,realse闭包用于指定生成正式版安装文件得配置。另外,debug闭包是可以忽略不写得,因此上面得代码中只有一个release闭包。在release闭包中,minifyEnabled用于指定是否对项目的代码进行混淆,true表示混淆,false表示不混淆。proguardFiles用于指定混淆时使用的规则文件,这里指定了两个文件,第一个proguard_android.txt是Android SDK目录下的,里面所有项目通用的混淆规则,第二个proguard—rules.pro是当前项目的根目录下的,里面可以编写当前项目混淆规则。
最后是一个dependencies闭包,这个闭包功能十分强大,他可以指定当前项目所有的依赖关系。通过AS一共有3种依赖关系:本地依赖,库依赖和远程依赖。本地依赖可以对本地的Jar包或者目录添加依赖关系,库依赖可以对项目中的库模块添加依赖关系,远程依赖可以对jcenter库上的开源项目添加依赖关系。
观察一下第一行的implementation fileTree就是一个本地依赖声明,他表示将libs目录下所有的.jar后缀的文件都添加到项目的构建路径当中,第二行是远程依赖声明。'com.android.support:appcompat-v7:28.0.0'就是一个标准的远程依赖库格式。Gradle在构建项目时会首先检查一下本地是否有这个库的缓存,如果没有的话则会自动联网下载,再添加到项目的构建路径中。
至于库依赖声明这里没有用到,它的基本格式是compile project 后面加上要依赖的库名称,比如有一个库模块的名字叫helper,那么添加这个库的依赖关系只需要加上compile project(':helper')这句声明即可。