一.Android SDK 目录结构
1.build-tools目录.
编译工具目录,包含了转化为davlik虚拟机的编译工具,比如adb、和aapt、aidl、dx等文件。
2.emulator目录.
Android模拟器模拟器目录。
3.extras目录
该文件下存放了Google提供的USB驱动,Intel提供的硬件加速附件工具包。
4.platforms目录。
是每个平台SDK真正的文件,存放不同版本的Android系统。对应android studio build.gradle中的compileSdkVersion
5.platform-tools目录.
各个版本的通用工具。比如 adb、sqlite3、fastboot等.
6.sources目录.
包含了各个版本的SDK源码。
7.system-images
存放的是创建Android虚拟机时的镜像文件(已经编译好的镜像文件,模拟器可以直接加载)。
8.tools
tools:这个文件夹下存放了大量Android开发、调试的工具。包括测试、调试、第三方工具。模拟器、数据管理工具等。
二.Android Studio工程结构。
1..gradle目录。
gradle 运行时自动生成的目录(自动编译工具产生的文件),版本由wrapper指定。一般情况不做修改,不需要纳入项目源代码管理中。
2..idea目录。
Intellij IDEA 运行时候生成的文件目录,一般情况不做修改,不需要纳入项目源代码管理中。
3.app(module)目录。
app/build:app模块编译输出的文件
app/libs: 放置引用的类库文件
app/src: 放置应用的主要文件目录
app/src/androidTest:单元测试目录
app/src/main:主要的项目目录和代码
app/src/main/assets:放置原生文件,里面的文件会保留原有格式,文件的读取需要通过流
app/src/main/java:项目的源代码
app/src/main/res:项目的资源
app/src/main/res/anim:存放动画的XML文件
app/src/main/res/drawable:存放各种位图文件(.png,.jpg,.9png,.gif等)和drawable类型的XML文件
app/src/main/res/drawable-v24:存放自定义Drawables类(Android API 24开始,可在XML中使用)
app/src/main/res/layout:存放布局文件
app/src/main/res/menu:存放菜单文件
app/src/main/res/mipmap-hdpi:存放高分辨率图片资源
app/src/main/res/mipmap-mdpi:存放中等分辨率图片资源
app/src/main/res/mipmap-xdpi:存放超高分辨率图片资源
app/src/main/res/mipmap-xxdpi:存放超超分辨率图片资源
app/src/main/res/mipmap-xxxdpi:存放超超超高分辨率图片资源
app/src/main/res/raw:存放各种原生资源(音频,视频,一些XML文件等)
app/src/main/res/values: 存放各种配置资源(颜色,尺寸,样式,字符串等)
app/src/main/res/values/attrs.xml:自定义控件时用的较多,自定义控件的属性
app/src/main/res/values/arrays.xml:定义数组资源
app/src/main/res/values/colors.xml:定义颜色资源
app/src/main/res/values/dimens.xml:定义尺寸资源
app/src/main/res/values/string.xml:定义字符串资源
app/src/main/res/values/styles.xml:定义样式资源
app/src/main/res/values-v11:在API 11+的设备上调用
app/src/main/res/values-v14:在API 14+的设备上调用
app/src/main/res/values-v21:在API 21+的设备上调用
app/src/main/res/AndroidManifest.xml:项目的清单文件(名称、版本、SDK、权限等配置信息)
app/src/.gitignore:忽略的文件或者目录
app/app.iml:app模块的配置文件
app/build.gradle:app模块的gradle编译文件
app/proguard-rules.pro:app模块的代码混淆配置文件
4.gradle目录及配置项.
- gradle/wrapper/gradle-wrapper.jar
- gradle/wrapper/gradle-wrapper.properties 主要指定了该项目需要什么版本的Gradle,从哪里下载该版本的Gradle,下载下来放到哪里
- .gitignore: 忽略的文件或者目录
- build.gradle:项目的gradle编译文件
- gradle.properties: gradle相关的全局属性设置
- gradlew: 编译脚本,可以在命令行执行打包
- gradlew.bat:windows下的gradle wrapper可执行文件
- local.properties:配置SDK/NDK所在的路径
- MyApplication.iml:保存该模块的相关信息
- settings.gradle:设置相关的gradle脚本
部分节选自:
Android Studio项目结构详解
三.Gradle,Gradle Wrapper和Android Plugin for Gradle。
1. Gradle
Gradle是个构建系统,能够简化你的编译、打包、测试过程。
详见我之前写过的博客:java 构建工具Ant、Maven和Gradle
gradle下载地址
2. Gradle Wrapper
Gradle Wrapper称为Gradle包装器,是对Gradle的一层包装。使用Gradle Wrapper可以在没有安装Gradle的情况下使用。
为什么需要Gradle Wrapper呢?比如在一个开发团队中,如果每进来一个成员,都需要在计算机中安装Gradle,这个时候运行Gradle的环境和版本就会对构建结果带来不确定性。针对这个问题,Gradle提供了一个解决方案,那就是Gradle Wrapper,它是一个脚本,可以在计算机没有安装Gradle的情况下运行Gradle构建,并且能够指定Gradle的版本,开发人员可以快速启动并运行Gradle项目,而不必手动安装,这样就标准化了项目,从而提高了开发效率。
Gradle Wrapper生成的文件如下:
|____gradle
| |____wrapper
| | |____gradle-wrapper.jar //具体业务逻辑
| | |____gradle-wrapper.properties //配置文件
|____gradlew //Linux 下可执行脚本
|____gradlew.bat //Windows 下可执行脚本
打开gradle/wrapper/gradle-wrapper.properties 文件就可以修改配置了。根据此配置Gradle Wrapper会自动为我们下载合适的Gradle版本。默认情况下,下载位置是在$USER_HOME/.gradle/wrapper/dists。
#规定了解压后的gradle包放在哪里(一般是在~/.gradle/wrapper/dists目录)
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
#规定了gradle的zip包放在哪里
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
#规定了使用哪个版本的gradle编译项目,这个地址可以配置成服务器地址或者本地地址
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
3. Android Plugin for Gradle
Android Studio构建系统基于Gradle,Android Plugin for Gradle添加了一些特定于构建Android应用程序的功能。虽然Android插件通常与Android Studio保持同步更新,但插件(以及Gradle系统的其余部分)可独立于Android Studio运行并单独更新。
在android studio中,项目的根目录下的build.gradle中会配置如下代码:
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
这个dependencies中的gradle:3.2.0代表的就是使用gradle 插件版本 3.2.0.在编译过程中,如果gradle插件版本与gradle版本不匹配,编译就会失败.
目前在使用的gradle与gradle插件版本的对应。
Android studio中的gradle.
1.顶级Gradle文件。
顶级 build.gradle 文件位于项目根目录,用于定义适用于项目中所有模块的构建配置。 默认情况下,此顶级构建文件使用 buildscript 代码块来定义项目中所有模块共用的 Gradle 存储区和依赖项
/**
* 构建块是您配置存储库和的位置
* Gradle本身的依赖关系 - 意思是,你不应该包含依赖关系
* 在这里你的模块。 例如,此块包含Android插件
* Gradle作为依赖项,因为它提供了Gradle的附加指令
* 需要构建Android应用程序模块。
*/
buildscript {
/**
* 存储库块配置Gradle使用的存储库
* 搜索或下载依赖项。 Gradle预先配置对远程的支持
* 存储库,如JCenter,Maven Central和Ivy。 您也可以使用本地
* 存储库或定义您自己的远程存储库。 下面的代码定义
* JCenter作为存储库Gradle应该用来查找它的依赖项。
*
* 使用Android Studio 3.0及更高版本创建的新项目也包括
* 谷歌的Maven存储库。
*/
repositories {
google()
jcenter()
}
/**
* dependencies块配置Gradle需要使用的依赖项
* 建立你的项目。 以下行添加了Gradle的Android插件
* 版本3.2.0作为类路径依赖项。
*/
dependencies {
classpath 'com.android.tools.build:gradle:3.2.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
/**
* allprojects块是您配置存储库和的地方
* 项目中所有模块使用的依赖项,例如第三方插件
* 或lib。 但是,您应该在其中配置特定于模块的依赖项
* 每个模块级的build.gradle文件。 对于新项目,Android Studio
* 默认情况下包括JCenter和Google的Maven存储库,但事实并非如此
* 配置任何依赖项(除非您选择需要某些依赖项的模板)。
*/
allprojects {
repositories {
google()
jcenter()
}
}
- buildScript块的repositories主要是为了表示只有编译工具才会用这个仓库,获取脚本依赖插件。
- allprojects块的repositories用于多项目构建,为所有项目提供共同所需依赖包。而子项目可以配置自己的repositories以获取自己独需的依赖包。
2.模块级Gradle文件。
apply plugin: 'com.android.application'
android {
//compilesdkversion指定Android API级别的Gradle应用于
//编译你的应用程序。这意味着您的应用程序可以使用
//此级别及更低级别的API。
compileSdkVersion 28
//buildToolsVersion指定Gradle用于构建应用程序的SDK构建工具,命令行工具和编译器的版本。 您需要使用SDK Manager下载构建工具。
//此属性是可选的,因为默认情况下插件使用推荐版本的构建工具。
buildToolsVersion "28.0.3"
//defaultConfig块封装了所有构建变体的默认设置和条目,
// 并且可以从构建系统动态覆盖main / AndroidManifest.xml中的某些属性。
// 您可以配置产品flavor以覆盖应用程序的不同版本的这些值。
defaultConfig {
//applicationId唯一标识要发布的包。
//但是,您的源代码仍应引用包名称
//由main / AndroidManifest.xml文件中的package属性定义。
applicationId "com.yousheng.myapplication"
//定义运行应用程序所需的最低API级别。
minSdkVersion 15
//指定用于测试应用程序的API级别。
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
//您可以在buildTypes块中配置多个构建类型。
// 默认情况下,构建系统定义了两种构建类型:debug和release。该
//调试构建类型未在默认构建配置中显式显示,
// 但它包含调试工具,并使用调试密钥进行签名。 发布
// 构建类型应用Proguard设置,默认情况下不签名。
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
//依赖项在模块级构建配置文件中阻止
//指定仅构建模块本身所需的依赖项。
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
}
apply plugin 表示应用了一个插件,该插件一般有两种值可选:
一种为'com.android.application',表示该模块为应用程序模块,可以直接运行;另一种为'com.android.library',表示该模块为库模块,只能作为代码库依附于别的应用程序模块来运行。android{},在这个闭包中我们可以配置项目构建的各种属性。
buildToolsVersion 构建工具的版本,其中包括了打包工具aapt、dx等等。可以用高版本的build-tool去构建一个低版本的sdk工程。
-
compileSdkVersion 用于指定项目的编译版本,这里指定成28表示使用Android 8.0系统的SDK编译。只影响编译时的行为,不影响运行时的行为。代码中可用的api也要与该声明版本对应,高于声明版本的api则无法找到、使用。Support库的大版本号要与compileSdkVersion的大版本号相同
minSdkVersion 指明应用程序运行所需的最小API level。如果Android设备的系统API level低于android:minSdkVersion设定的值,那么android系统会阻止用户安装这个应用。如果指明了这个属性,并且在项目中使用了高于这个API level的API, 那么会在编译时报错。
targetSdkVersion 表示你在该目标版本上已经做过了充分的兼容性处理和测试性处理,系统将会为你的应用程序启用一些最新的功能和特性。应用运行时使用的sdk版本
例如:
android6.0(api 23)系统的动态权限检查功能
1、targetSdkVersion<23时:
该应用安装在android6.0的手机上后,
不会执行android6.0系统以上特有的动态权限检查逻辑,
而是仍继续执行以前的权限检查逻辑。
2、当targetSdkVersion变为23后:
android6.0系统的动态权限检查特性将生效。
结论
一般minSdkVersion不随意更改targetSdkVersion,更改targetSdkVersion必须做好兼容。 buildTypes 封装此项目的所有构建类型配置。
Android studio gradle系列二