项目结构示意图
结构简单分析
.gradle
.idea
目录: 自动配置的文件app
目录:代码、资源等内容都在这个文件夹下build
目录:编译时自动生成libs
目录:存放第三方jar包src
目录:源码目录androidTest
目录:自动化测试用的main
目录:工作目录,通常只管这个目录下的文件java
目录:写代码的目录,activitivity.java
文件就在里面res
目录:放资源的目录drawable
放图片layout
放布局values
放字符串mipmap
放应用图标(h,m,xh等对应不同分辨率)
AndroidManifest.xml
文件:整个项目的配置文件,四大组件都在这注册,添加权限声明等
test
目录:Unit Test测试使用.gitnore
文件:版本控制使用app.iml
文件:AS自动生成的build.gradle
文件:gradle
脚本构建文件proguard-rules.pro
文件:代码混淆用的,防止app被破解
gradle
目录:包含gradle wrapper
的配置文件.gitgnore
文件:版本控制相关build.gradle
文件:构建gradle
的全局脚本文件gradle.properties
文件:配置gradle
的全局配置文件gradlew
gradlew.bat
文件:执行gradle
命令的文件,bat文件是windows系统用的HelloWorld.iml
文件:别管,AS自动生成的文件local.properties
文件:指定本机Android SDK路径,通常自动生成settings.gradle
文件:指定引入的模块
主要文件分析
AndroidManifest.xml
1
2
3
4
5
6
7
8
9
10
11
12<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
//表示对MainActivity这个活动进行注册,没注册不能用。其中
<action android:name="android.intent.action.MAIN" />
和
<category android:name="android.intent.category.LAUNCHER" />
//表示这个活动是项目的主活动,也是最先启动的活动。资源引用
布局文件通过
R.layout.activity_main
来引用,那其他资源如何引用呢?比如HelloWorld
这个字符串,它的资源文件是strings.xml
:1
2
3<resources>
<string name="app_name">HelloWorld</string>
</resources>代码中
引用:R.string.app_name
xml中
引用:@string/app_name
同样的,如果是图片资源就将
string
替换为drawable
,图标则是mipmap
,布局文件就是layout
androidStudio 配置文件分析
外层build.gradle文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21//这个文件是自动生成的
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.3'
}
}
allprojects {
repositories {
google()
jcenter()
}
}
//repositories{}中声明了jcenter(),这是一个代码托管仓库,声明了这个就能引用jcenter的开源项目了。还声明了goole(),这是google自有的仓库。
//dependencies中使用classpath声明了一个Gradle插件,用来表示这是个Android项目而不是C++或其他项目。内层builld.gradle文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29apply plugin: 'com.android.application'
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.example.helloworld"
minSdkVersion 15
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
}第一行应用了一个插件,一般选两个值:
com.android.application
:表示这是个应用程序模块com.android.library
:表示这是个库模块,只能依附于别的应用程序模块运行
第三行
android{}
配置项目构建的属性:compileSdkVersion
指定编译的版本,29代表用Android 10的SDK编译buildToolsVersion
指定构建工具的版本,有最新的AS会提示defaultConfig{}
细节配置applicationId
指定包名minSdkVersion
指定最低兼容版本,15表示Android4.0targetSdkVersion
数字越大会启用一些新功能,比如权限控制等versionCode
项目版本号versionName
项目版本名
buildTypes{}
指定生成安装文件的配置release{}
正式版安装文件的配置minifyEnabled
指定是否代码混淆proguardFiles
指定混淆的规则文件proguard-android-optimize.txt
SDK目录下,项目通用混淆规则proguard-rules.pro
当前项目根目录下,当前项目的特有混淆规则
debug{}
测试版安装文件的配置,通常忽略不写
dependencies{}
:指定当前项目的所有依赖关系- 第一行:
fileTree
:本地依赖 - 第二三行:远程依赖:
androidx.appcompat
域名部分,appcompat
组名,1.0.2是版本名。Gradle
会先检查本地是否已经有此库的缓存,如果没有就会联网下载 - 最后三行用来测试用例,暂时用不到。
- 第一行: