项目结构示意图


结构简单分析
.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的全局配置文件gradlewgradlew.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_namexml中引用:@string/app_name
同样的,如果是图片资源就将
string替换为drawable,图标则是mipmap,布局文件就是layoutandroidStudio 配置文件分析
外层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.txtSDK目录下,项目通用混淆规则proguard-rules.pro当前项目根目录下,当前项目的特有混淆规则
debug{}测试版安装文件的配置,通常忽略不写
dependencies{}:指定当前项目的所有依赖关系- 第一行:
fileTree:本地依赖 - 第二三行:远程依赖:
androidx.appcompat域名部分,appcompat组名,1.0.2是版本名。Gradle会先检查本地是否已经有此库的缓存,如果没有就会联网下载 - 最后三行用来测试用例,暂时用不到。
- 第一行: