-
app
:主要代码所在目录-
build
:编译打包时产生的临时文件,打包产物默认也在此目录中。上传git时,需隐忽略此文件夹 -
src
:主要编写代码的地方-
androidTest
:android特有的单元测试 -
main
:主要盛放源代码和资源文件 -
java.包名
:java源代码,各种页面、控件、页面逻辑等在此文件下编写 -
res
:资源文件,盛放了布局、控件样式、动画、图片、颜色、文本、主题等相关资源-
drawable
:控件背景,颜色,形状等 -
layout
:布局文件 -
mipmap-xxx
:不同分辨率的图片文件 -
values
-
colors.xml
:颜色值,根据默认格式继续扩展即可 -
strings.xml
:文本,根据默认格式继续扩展即可 -
theme.xml
:主题 -
attrs.xml
:自定义控件属性声明 -
style.xml
:控件样式 -
dimens.xml
:距离,控件大小单位,字体大小单位
-
-
-
AndroidManifest.xml
:清单文件,主要用于权限的声明、四大组件注册、主题样式的引用、图标的配置、APP名称的配置等
-
-
test
:基于JUnit的单元测试 -
.gitignore
:git忽略文件 -
build.gradle
:模块的配置文件,用于声明依赖,配置打包参数等等 -
proguard-rules.pro
:混淆配置文件,当打开混淆功能时,用于配置哪些类、库等被混淆忽略
-
-
build.gradle
:整个项目的配置文件,用于声明第三方依赖下载源,gradle插件引用, -
gradle.properties
:可用于声明gradle文件可直接引用的常量。默认声明了编译时jvm的内存大小和编码格式、使用androidX -
gradlew
,gradlew.bat
:运行gradle命令的脚本,无需配置gradle环境变量,直接使用gradlew,一般不要修改 -
local.properties
:本地参数,git上传时需忽略 -
settings.gradle
:项目配置文件,主要用来声明不同模块(module)
开始编码
很多时候,在开始新项目时,我们需要依赖很多库,并且根据这些库开发很多基本的工具。此时你可以新建一个module,用于编写基本的功能。当然也可以不用创建。
新建module
在android项目中,module主要分为两种,一种是application,一种是library,application的打包结果是apk,即可安装的文件。library的打包结果是aar,用于供其他application使用。
一个非组件化的项目中,一般只有一个application和n个library,默认新建的项目,app
目录即为application的module。
步骤
右击根目录,选择
New
->Module
新建module和新建项目相似
新建完module后,你会发现,文件树中出现了一个文件夹,图标有些特殊。更改的地方还有settings.gradle
文件,可打开观察不同
如果需要删除这个module,需先删除settings.gradle
中的相应值,编译一下,然后右击文件树要删除的文件夹即可删除。
我们继续观察,从app
目录下的文件和新建module_base
目录下的内容相差无几,主要差距如下:
- 包名不同
-
build.gradle
第二行不同,一个是com.android.application
,一个是com.android.library
此时两个module之间还没有任何联系,还处在你是你我是我的关系,但我们新建module_base
的目的就是为了给app模块提供基本支持,所以我们要让app模块依赖module_base
。
在app模块中的build.gradle
中添加如下内容
dependencies {
//...
implementation project(':module_base')
}
现在我们已经建了两个module,接下来就可以添加相关三方库依赖了。
在添加依赖前,先介绍两个关键字
- implementation:添加的依赖,只能在本module中使用
- api:添加的依赖,可公开给其他依赖本module的module使用。
所以,你可根据不同情况使用不同的关键词
添加三方依赖
一个常见的APP,要有网络请求的功能,要有图片显示的功能,还可能需要其他许许多多的功能,在这些常见且基础的功能中,有很多人为我们写好了优秀的代码库,我们可以直接拿来使用。
如何添加三方依赖呢,和module之间的依赖相同,直接在dependencies
代码块中引用即可:
dependencies {
//原有的引用,把implementation改为api,使其公开为其他module使用
api 'androidx.core:core-ktx:1.3.2'
api 'androidx.appcompat:appcompat:1.2.0'
//原生控件库,materia风格库
api 'com.google.android.material:material:1.3.0'
//Compose相关依赖
api "androidx.compose.ui:ui:$compose_version"
api "androidx.compose.material:material:$compose_version"
api "androidx.compose.ui:ui-tooling-preview:$compose_version"
api 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1'
api 'androidx.activity:activity-compose:1.3.0-alpha06'
//约束布局库
api 'androidx.constraintlayout:constraintlayout:2.0.4'
//网络请求Retrofit库
api 'com.squareup.retrofit2:retrofit:2.9.0'
api 'com.squareup.retrofit2:converter-gson:2.9.0'
//网络请求日志库
api 'com.squareup.okhttp3:logging-interceptor:4.3.1'
//图片请求库
api 'com.github.bumptech.glide:glide:4.11.0'
//测试相关库
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
上面这些依赖,已基本满足一个APP的开发。
如果想查看库的最新版,可在
https://mvnrepository.com/
中查看相应的版本号。
当你添加完依赖后,记得同步一下项目;如果需要同步,右上角会出现Sync now
按钮,如果不需要同步,则不会出现。
Gradle
Android项目的管理主要使用的是Gradle,因此需要了解一些Gradle相关知识。
Gradle是基于Groovy的特定领域语言,基于JVM。因此对于Java工程师来说入门相对容易一些。
有时AS无法下载Gradle或下载过慢,这个时候可以根据项目中的
gradle/wrapper/gradle-wrapper.properties
文件中的distributionUrl
网址,去用浏览器或工具下载。然后把压缩包手动放到C:\Users\xxx\.gradle\wrapper\dists\gradle-x.x.x-xxx\xxxxxxxxxxxxx
路径下即可(此路径会在第一次下载时自动创建),然后从新打开项目即可
我们先来认识一下Android项目中几个主要的gradle文件。
根目录build.gradle
// 顶级构建文件,您可以在其中添加所有子项目模块通用的配置选项。
buildscript {
ext {
//定义的常量,所有子项目中可以引用
compose_version = '1.0.1'
}
//库下载源
repositories {
google()
mavenCentral()
}
//gradle依赖的插件
dependencies {
classpath "com.android.tools.build:gradle:7.0.2"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.21"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
//清理任务,运行后可清理所有build目录
task clean(type: Delete) {
delete rootProject.buildDir
}
根目录settings.gradle
//所有module依赖的统一配置
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
//下载源
repositories {
google()
mavenCentral()
jcenter() // Warning: this repository is going to shut down soon
}
}
//根项目名
rootProject.name = "LearnCompose"
//包含的module,也可这样声明include ':app', ':module_base'
include ':app'
include ':module_base'
module目录中build.gradle
//插件的引用
plugins {
id 'com.android.application'
id 'kotlin-android'
}
android {
//编译SDK版本号
compileSdk 30
defaultConfig {
//包名
applicationId "com.withme.learncompose"
//最小支持的SDK
minSdk 21
//目标SDK
targetSdk 30
//APP版本号
versionCode 1
//APP版本名称
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
//开启矢量图支持
vectorDrawables {
useSupportLibrary true
}
//开启分包
multiDexEnabled true
}
buildTypes {
//正式版配置内容
release {
//最小化是否开启
minifyEnabled false
//指定混淆文件
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
//编译配置,开启java8支持
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
//kotlin配置,jvm目标版本1.8,开启JVM IR后端
kotlinOptions {
jvmTarget = '1.8'
useIR = true
}
buildFeatures {
//开启jetpack compose功能
compose true
}
//compose配置
composeOptions {
kotlinCompilerExtensionVersion compose_version
kotlinCompilerVersion '1.5.21'
}
//打包配置
packagingOptions {
resources {
excludes += '/META-INF/{AL2.0,LGPL2.1}'
}
}
}
//依赖模块
dependencies {
//声明依赖
//从网络引用依赖
//implementation 'androidx.core:core-ktx:1.3.2'
//从本地引用依赖
implementation project(':module_base')
}
自定义
1.添加构建类型
默认只有release和debug类型,且未开启混淆,如果想把release类型开启混淆,则:
//在android{}中
buildTypes {
release {
shrinkResources true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
在AS左下角的BuildVariants
中可以进行切换,切换后每次运行都会根据你选择的类型进行打包运行,开启混淆打包运行过程会超慢。
2.重命名打包apk的名称
默认的apk文件名,很简单app-构建类型.apk
,有时想改变打包产物的文件名:
//还是在android{}中
//无多渠道版本,apk文件名为:app_构建类型_版本名称_版本号_当前日期.apk
android.applicationVariants.all {
variant ->
variant.outputs.all {
output -> output.outputFileName = "app_" + buildType.name + "_v" + defaultConfig.versionName + "_"+ defaultConfig.versionCode + "_" + new Date().format("yyyyMMdd") + ".apk"
}
}
//多渠道版本,apk文件名:构建渠道名_构建类型_渠道版本名称_渠道版本号_当前日期.apk
android.applicationVariants.all {
variant ->
variant.outputs.all {
output -> output.outputFileName = variant.productFlavors[0].name+"_" + buildType.name + "_v" + variant.productFlavors[0].versionName + "_"+ variant.productFlavors[0].versionCode + "_" + new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC")) + ".apk"
}
}
3.常量声明
有时想在build.gradle中希望声明一个常量,使其在代码中使用。可以使用如下方法:
buildTypes {
release {
shrinkResources true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField "String","X_VALUE",'"你好哈"'
}
debug {
buildConfigField "String","X_VALUE",'"Hello"'
}
}
当进行了以上声明,在代码中可以直接使用BuildConfig.X_VALUE
了。当然,你也可以声明其他基本数据类型。