《第⼀⾏代码》第三版读书笔记解析AndroidStudio项⽬结构
第⼀⾏代码
第⼀章-开始启程,你的第⼀⾏安卓代码
这⼀章先简单介绍了Android的系统架构,以及安卓开发需要的⼯具:JDK,AndroidSDK,AndroidStudio。然后剩下的就是如何安装以及配置AndroidStudio这类问题了,书上讲的蛮详细的。
我觉得第⼀章⽐较重要的内容是读到这⾥才开始的(本⼈是安卓开发⼩⽩Orz),郭婶在这⾥已helloWorld项⽬为例,介绍了Android项⽬的结构。
1. .gradle和.idea
这两个⽬录是放置的AndroidStudio⾃动⽣成的⼀些⽂件,不⽤关⼼,也不⽤⼿动编辑。
2. app
项⽬中的代码、资源等内容都是放置在这个⽬录下的,后续的开发⼯作基本也是在这个⽬录下进⾏
3. build
编译时⾃动产⽣的⽂件,郭婶说不需要过多关⼼,那就不吧~
4. gradle
包含了gradle wrapper的配置⽂件,AS默认的是启⽤gradle wrapper,可以在设置中更改离线模式,具体路径:File->Settings->Biuld,Execution,Deployment->Gradle。
5. .gitignore
将指定的⽬录和⽂件排除在版本控制外,版本控制在第六章介绍,⽬前还没看到。
6. adle
全局gradle构建脚本,通常是不需要修改的
7. gradle.properties
全局gradle配置⽂件,在这⾥⾯配置的属性将会影响到项⽬中所有的gradle编译脚本。
8. gradlew和gradlew.bat
⽤于在命令⾏中执⾏gradle命令,gradlew⽤于Linux或MacOS,.bat⽤于Windows。
9. HelloWorld.iml
.iml⽂件是所有IntelliJ IDEA项⽬都会⾃动⽣成的⼀个⽂件,因为AS是基于IDEA开发的,主要⽤于标识这是⼀个IDEA项⽬,不需要修改。
10. local.properties
⽤于指定本机中AndroidSDK的路径,⼀般是⾃动⽣成的,不需要修改,除⾮本机中Android SDK位置发⽣了变化。
11. adle
⽤于指定项⽬中所有引⼊的模块,通常情况下模块引⼊是⾃动完成的。
然后详细介绍了app⽬录下内容
1. biuld
这个和外层biuld⽬录类似,包含了⼀些在编译时⾃动⽣成的⽂件,也不需要过多关⼼。
2. libs
如果在项⽬中使⽤了第三⽅jar包,就需要把这些jar包放在libs⽬录下,放在这个⽬录下的jar包会被⾃动添加到项⽬的构建路径中。那什么是jar包呢,jar包就是别⼈做好的⼀些类,全名Java archive file,Archive-档案的意思。等于说放进去就可以引⽤了。
3. androidTest
此处⽤于编写测试⽤例,对项⽬进⾏⼀些⾃动化的测试(有⼀说⼀⽬前我还没⽤上这个功能)。
4. java
放代码的地⽅~
5. res
放资源的地⽅,图⽚布局字符串之类的。
6. l
整个Android项⽬的配置⽂件,四⼤组件在这⾥注册,还可以在这⾥给应⽤程序添加权限声明。
7. test
编写UnitTest测试⽤例的,是对项⽬进⾏⾃动化测试的另⼀种⽅式(显然,我也还没⽤过Orz)。
8. .gitignore
将指定⽬录或⽂件排除在版本控制之外。
9. app.iml
IDEA⾃动⽣成的⽂件,不需要过多关⼼。
10. adle
app模块的gradle构建脚本,会指定很多项⽬构建的相关配置,稍后会进⾏详细分析。
11. proguard-rules.pro
⽤于制定项⽬代码的混淆规则,就是代码开发完打包成安装包⽂件后,如果不希望被别⼈破解,就可以对代码进⾏混淆。
OK!app中的⽂件看完了,我看到这⾥有点懵,因为之前从来没接触过安卓相关的内容,但是不要放弃,先往后看,看着看着感觉就来了。那么然后再来详解⼀些app⽬录下adle⽂件。
⾸先我们知道了项⽬中有两个adle⽂件,⼀个在最外层⽬录下,⼀个在app⽬录下。那⾸先我们来看⼀下最外层⽬录下的
buildscript {
ext.kotlin_version ="1.3.72"
repositories {
google()
jcenter()
}
dependencies {
classpath "ls.build:gradle:4.0.1"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
belong
}
}
allprojects {
repositories {
google()
jcenter()
}
}
可以看出,⾸先是声明了kotlin的版本,然后我们不难发现有两个repositories闭包(repository英[rɪˈpɒzətri]n. 仓库; 贮藏室; 存放处; 学识渊博的⼈; 智囊; 知识宝典;),都声明了google和jcenter这两⾏配置,那这两个配置其实就是分别对应了⼀个代码仓库,google仓库主要是Google⾃家的拓展依赖库,j
center仓库包含的⼤多数是⼀些第三⽅开源库。声明了这两个配置后,咱就可以在项⽬中引⽤Google和jcenter仓库中的依赖库啦。当然,也可以改成国内的仓库地址,这样的话可能会稍快上⼀些,就⽐如这样:
//google()
//jcenter()
maven { url 'maven.aliyun/nexus/content/repositories/google'}
maven{ url 'maven.aliyun/nexus/content/groups/public/'}
maven{ url 'maven.aliyun/nexus/content/repositories/jcenter'}
}
接下来,我们看到在dependencies闭包中(dependency 英[dɪˈpendənsi] n. (尤指不正常或不必要的) 依靠,依赖; 附属国; 附属地;)使⽤classpath声明了两个插件,⼀个gradle插件和⼀个Kotlin插件。如果是⽤java开发,就不需要声明kotlin插件。
外层的adle⽂件差不多就是酱紫了,下⾯我们来看看app⽬录下的adle⽂件:
apply plugin:'com.android.application'
apply plugin:'kotlin-android'
apply plugin:'kotlin-android-extensions'
android {
compileSdkVersion 30
buildToolsVersion "30.0.2"
defaultConfig {
applicationId "ample.helloworld"
minSdkVersion 16
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "st.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile(''),'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir:"libs", include:["*.jar"])
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation ':core-ktx:1.3.2'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'straintlayout:constraintlayout:2.0.4'
testImplementation 'junit:junit:4.12'
androidTestImplementation ':junit:1.1.2'
androidTestImplementation 'st.espresso:espresso-core:3.3.0'
}
看起来代码有点⼦多呀,不要慌,⼀⾏⼀⾏看。
apply plugin:'com.android.application'
apply plugin:'kotlin-android'
apply plugin:'kotlin-android-extensions'
第⼀⾏应⽤了⼀个插件,⼀般有两种值可选,com.android.application 表⽰这是⼀个应⽤程序模块和com.android.library表⽰这是⼀个库模块,⼆者区别在于应⽤程序模块可以直接运⾏,⽽库模块只能作为代码库依附于别的应⽤程序模块来运⾏。
然后是kotlin-android和koylin-android-extensions这两个插件,如果想使⽤kotlin来开发android项⽬就必须要⽤到第⼀个插件,第⼆个插件帮助我们实现⼀些⾮常好⽤的kotlin拓展功能。
接下来就是⼀个⼤的android闭包:
compileSdkVersion 30
buildToolsVersion "30.0.2"
defaultConfig {
applicationId "ample.helloworld"
minSdkVersion 16
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "st.runner.AndroidJUnitRunner"
maven打包本地jar包}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile(''),'proguard-rules.pro'
}
}
}
在这个闭包中我们可以配置项⽬构建的各种属性。其中compileSdkVersion是⽤来指定项⽬的编译版本,这⾥的30表⽰使⽤的是Android10的系统SDK编译。buildToolsVersion⽤于指定项⽬构建⼯具版本。android闭包中还嵌套了⼀个defaultConfig闭包,⽤来对项⽬中更多细节进⾏配置。其中applicationId是每个应⽤的唯⼀标识符,默认是我们创建项⽬时指定的包名,如果后期相对其进⾏修改,就是在这⾥修
改。mkSdkVersion⽤来指定最低兼容的Android系统版本这⾥的16表⽰最低兼容到4.0的系统,targetSdkVersion表⽰你已经在该⽬标版本上做了充分的测试,系统将会为你的应⽤程序启⽤⼀些最新的功能和特性。个⼈理解上来讲就是你开发软件的系统版本,系统会为你提供这个版本及之前版本的所有特性,但是不会为你提供⽐⽬标版本更新的版本的特性。接下来的versionCode⽤于指定项⽬版本
号,versionName⽤于指定项⽬版本名。最后testInstrumentationRunner⽤于在当前项⽬中启⽤JUnit测试,可以为当前项⽬编写测试⽤例,以保证功能的正确性和稳定性(这个功能暂时没⽤过Orz)。
然后是buildTypes闭包:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile(''),'proguard-rules.pro'
}
}
这buildTypes闭包主要是⽤于指定⽣成相关⽂件的相关配置,通常只有两个⼦闭包,debug和release。debug⽤于指定⽣成测试版安装⽂件,release⽤于指定正式版安装⽂件的配置。debug可以不写,所以上⾯的就只有⼀个release闭包,第⼀个minifyEnable⽤于指定是否对代码进⾏混淆,True or False,这个好理解。proguardFiles则是⽤于指定混淆时使⽤的规则⽂件,⽂中代码指定了两个⽂件,第⼀
个是在< Andoid SDK >/Tool/proguard⽬录下,第⼆个proguard-rules.pro是在当前项⽬的根⽬录下,⾥⾯可以编写当前项⽬特有的混淆规则。当然需要注意的是,通过AS直接运⾏项⽬⽣成的都是测试版安装⽂件。
最后还有⼀个dependencies闭包。这个闭包功能⼗分强⼤,它可以指定当前项⽬所有的依赖关系。通常的AS项⽬⼀共有三种依赖⽅式:本地依赖,库依赖和远程依赖。本地依赖可以对本地的jar包或⽬录添加依赖关系,库依赖可以对项⽬中的库模块添加依赖关系,远程依赖可以对jcenter仓库上的开源项⽬添加依赖关系。观察⼀下其中配置:
dependencies {
implementation fileTree(dir:"libs", include:["*.jar"])
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation ':core-ktx:1.3.2'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'straintlayout:constraintlayout:2.0.4'
testImplementation 'junit:junit:4.12'
androidTestImplementation ':junit:1.1.2'
androidTestImplementation 'st.espresso:espresso-core:3.3.0'
}
第⼀⾏显然是本地依赖配置,他将libs⽬录下所有jar⽂件都添加到项⽬的构建路径中,⽽implementation则是远程依赖
声'androidx.appcompat:appcompat:1.2.0'就是⼀个标准的远程依赖库格式,其中androidx.appcompat是域名部分,⽤于和其他组织的库做区分,appcompat是⼯程名部分,⽤于和同⼀个公司中的不同的库⼯程做区分,最后的就是版本号啦,这个就不多解释了。加上这个声明
后,gradle在构建项⽬时会先检查⼀下本地是否已经有这个库的缓存,如果没有的话则会联⽹⾃动下载并添加到项⽬构建路径。⾄于剩下两个则是⽤于声明测试⽤例库的,暂时⽤不上,就先忽略吧。
看了⼆三⼗页了,做个⼩总结吧:最外层build和app⽬录下的build到底有哪些区别,个⼈⽬前的看法是:同样都是配置,最外层配置了项⽬的仓库地址,还有项⽬的开发需要的插件。⽽app⽬录下的build主要是配置了项⽬更加具体的⼀些细则,编译的版本,最⾼、最低适配的版本,项⽬本⾝的版本、名字、ID,还有要在之前外层build⽂件中配置的仓库中具体哪个组织哪个版本的依赖库,模块。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论