### 一,项目目录 ###
* .gradle gradle 缓存文件
* .idea 缓存配置文件
* app 模块
* build build时候的中间文件
* gradle 绑定项目使用的gradle版本
* .gitignore 版本控制忽略的文件
* build.gradle 构建项目的gradle配置
* gradle.properties gradle配置
* gradlew linux下gradle的启动脚本
* gradlew.bat windows下gradle启动脚本
* local.properties sdk路径和ndk路径
* MyApplication.iml 项目的配置文件
* settings.gradle 配置项目的模块
### 二,app模块目录 ###
* build 构建模块的中间文件
* libs 等同于Eclipse中的libs,放jar包
* src/androidTest 安卓测试用例
* src/main 代码,资源,清单文件
* src/test java 测试用例
* .gitignore 版本控制忽略的文件
* app.iml 模块配置文件
* build.gradle 构建模块的gradle配置
* proguard-rules.pro 代码混淆配置
### 三,模块的build.gradle ###
- (一)模块下的build.gradle主要是配置模块的设置及其依赖。
apply plugin: 'com.android.application'//使用application插件,表明这是一个app
android { //Gradle插件为Project对象添加的一个拓展
compileSdkVersion 25 //编译版本 对应android7.0
buildToolsVersion "25.0.2"//构建工具版本
//1,默认配置
defaultConfig {
applicationId "com.leon.asdemo"//包名
minSdkVersion 15//此app允许运行的最低的API版本的手机
targetSdkVersion 25//目标版本,此app允许使用新特性的最高版本,也就是说api25以上的手机也能安装这个app,但仅有api25以下的新特性
versionCode 1//版本号
versionName "1.0"//版本名
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"//单元测试
//当方法数超过65535(方法的索引使用的是一个short值,(防止超过65535时报错)
//而short最大值是65535)的时候允许打包成多个dex文件,动态加载dex。这里面坑很深啊
multiDexEnabled true
}
//2,程序在编译的时候会检查lint,有任何错误提示会停止build,我们可以关闭这个开关
lintOptions {
abortOnError false //即使报错也不会停止打包
checkReleaseBuilds false //打包release版本的时候进行检测
}
//3,关闭Android Studio的PNG合法性检查的
//3.1将Eclipse项目导入到Android studio 中 很多点9图出现问题解决方法:
//3.2有时从网上下载的Demo资源文件不规范,会出现直接将jpg文件改为png后缀名的情况,
//gradle打包检查时报错编译通不过的。
//用来关闭Android Studio的PNG合法性检查的,直接不让它检查。
aaptOptions {
cruncherEnabled = false
useNewCruncher = false
}
//4,默认的一些文件路径的配置
sourceSets {
main {
assets.srcDirs = ['assets'] //资源文件
jni.srcDirs 'src/main/jni' //jni文件
jniLibs.srcDir 'src/main/jniLibs' //jni库
}
}
//5,multiDex的一些相关配置,这样配置可以让你的编译速度更快
dexOptions {
preDexLibraries = false //让它不要对Lib做preDexing
//开启incremental dexing,优化编译效率,这个功能android studio默认是关闭的。
incremental true
javaMaxHeapSize "4g" //增加java堆内存大小
}
//6,将项目导入到AS中出现以下问题:
//Error:Execution failed for task
// ':app:transformResourcesWithMergeJavaResForDebug'. > com.android.bui
//解决方式:---->在build.grade中添加以下代码:
packagingOptions {
exclude 'META-INF/DEPENDENCIES.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
}
//7,构建类型
buildTypes {
release { //release版本的配置
shrinkResources true // 移除无用的resource文件
minifyEnabled false //是否进行混淆
zipAlignEnabled true //是否支持zip
debuggable false //是否支持调试
//release的Proguard默认为Module下的proguard-rules.pro文件.
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//ndk的一些配置
ndk {
// cFlags "-std=c++11 -fexceptions -O3 -D__RELEASE__" // C++11
// platformVersion = "19"
moduleName "xiaopaowifisafe" //设置库(so)文件名称
ldLibs "log", "z", "m", "jnigraphics", "android"
//引入库,比如要用到的__android_log_print
abiFilters "armeabi", "x86", "armeabi-v7a"//, "x86"
cFlags "-std=c++11 -fexceptions" // C++11
stl "gnustl_static"
}
//采用动态替换字符串的方式生成不同的release.apk
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('release.apk')) {
def timeStamp = new Date().format('yyyyMMddHH');
def fileName = "WeShare-${defaultConfig.versionName}" + "-" + timeStamp + "-lj-" + ".apk";
output.outputFile = file("${outputFile.parent}/${fileName}")
}
}
}
jniDebuggable false //关闭jni调试
}
debug {//debug版本的配置
minifyEnabled false //是否进行混淆
zipAlignEnabled true //是否支持zip
shrinkResources true // 移除无用的resource文件
debuggable true //是否支持调试
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
ndk {
cFlags "-std=c++11 -fexceptions -g -D __DEBUG__" // C++11
}
jniDebuggable true
}
}
//8,在这里你可以进行 Java 的版本配置,以便使用对应版本的一些新特性
//错误:
//Error:(51, 52) 错误: -source 1.6 中不支持 diamond 运算符
//(请使用 -source 7 或更高版本以启用 diamond 运算符)
//解决方式:---->在build.grade中添加以下代码:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
//9,为每个渠道包产生不同的 UMENG_CHANNEL_VALUE 的值。
//所谓ProductFlavors其实就是可定义的产品特性,
//配合 manifest merger 使用的时候就可以达成在一次编译
//过程中产生多个具有自己特性配置的版本。
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
//10,在这里你可以设置你的产品发布的一些东西,
//比如你现在一共软件需要发布到不同渠道,
//且不同渠道中的包名不同,那么可以在此进行配置;
//甚至可以设置不同的 AndroidManifest.xml 文件。
productFlavors {
xiaopao {}
googlePlay {}
solo {}
}
//11,依赖
dependencies {
//3.0以前使用 compile
compile fileTree(dir: 'libs', include: ['*.jar'])//位于app/libs/下的jar包
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.0'//v7包依赖
compile 'com.android.support.constraint:constraint-layout:1.0.2'//ConstraintLayout依赖
testCompile 'junit:junit:4.12'//单元测试依赖
//3.0以后使用 implementation
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.2'
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'
androidTestCompile('com.android.support:support-annotations:26.1.0') {
force = true
}
}
- (二)从Android Gradle plugin 3.0开始推荐使用implementation和api来替换原先的compile。理论上你可以把所有的compile替换成api。下面说说它们的区别:
- 1,compile
本module将会泄露其依赖的module的内容
- 2,api
同compile
- 3,implementation
本module不会通过自身的接口向外部暴露其依赖module的内容。推荐使用implementation
来进行依赖(而不是api或compile),这会大大改善工程的构建时间
- (三)其他改动:
provided -> compileOnly
apk -> runtimeOnly
testCompile -> testImplementation // 编译测试用例时依赖, 不会打包到发布的产品中
androidTestCompile -> androidTestImplementation // 编译测试用例时依赖, 不会打包到发布的产品中
[User Guide](https://sites.google.com/a/android.com/tools/tech-docs/new-build-system/user-guide)
### 四,项目的build.gradle ###
配置所有模块公共的配置
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {//构建脚本配置
repositories {//代码仓库配置
jcenter()//代码仓库为jcenter
}
dependencies {// 配置需要依赖的gradle插件
//Android Gradle插件版本,下载下来目录为android-studio\gradle\m2repository\com\android\tools\build\gradle\2.3.1
classpath 'com.android.tools.build:gradle:2.3.1'
}
}
//默认代码仓库
allprojects {
repositories {
jcenter()
}
}
//clean任务,构建时会执行该任务,删除根目录下的build文件夹
task clean(type: Delete) {
delete rootProject.buildDir
}
## 五, gradle-wrapper.properties
####这里我们基本只需关注distributionUrl即可, 这个字段决定了你的gradle wrapper依赖哪个gradle版本。
- 1,distributionBase=GRADLE_USER_HOME
下载的Gradle压缩包解压后储存的主目录
- 2,distributionPath=wrapper/dists
相对于distributionBase的解压缩后的Gradle压缩包路径
- 3,zipStoreBase=GRADLE_USER_HOME
同distributionBase,只不过是存放zip压缩包的
- 4,zipStorePath=wrapper/dists
同distributionPath,只不过是存放zip压缩包的
- 5,distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
Gradle发型版压缩包的下载地址
![](img/elipse_vs_as.png)
## 六,其他文件介绍:
- 1,local.properties
声明AndroidSDK和NDK所在路径
- 2,gradle.properties
可以放置gradle相关的全局常量声明和项目运行内存设置等
- 3,app/proguard-rules.pro
代码混淆配置
- 4,.gitignore、app/.gitignore
记录需要被git忽略的文件/文件夹
## 七,drawable文件夹
- 1,drawable
放置selector、shape、vector文件
- 2,drawable-mdpi
中分辨率图标(72*72, 320*480)
- 3,drawable-hdpi
高分辨率图标(尺寸标准:48*48, 对应手机分辨率:480*800)
- 4,drawable-xhdpi
超高分辨率图标(96*96, 720*1280)
- 5,drawable-xxhdpi
超超高分辨率图标(144*144, 1080*1920), 主流分辨率
- 6,drawable-xxxhdpi
超超超高分辨率图标(192*192, 3840*2160)
- 7,drawable-v19
Android4.4(API19)及以上特别设置的样式/图标
- 8,drawable-v21
Android5.0(API21)及以上特别设置的样式/图标
- 9,drawable-v24
Android7.0(API24)及以上特别设置的样式/图标
- 10,总结:图标加载顺序:
drawable-v[对应的高API]->drawble-v[低API]->drawable-[对应高分辨率]dpi->
drawable-[低分辨率]dpi->drawable
##八,mipmap,用法与drawable一致。
区别在于: mipmap文件夹仅仅用于放置app的logo图标。
##九,res文件夹下的其他文件
- 1,anim ---->(在res文件夹下新建文件夹)
动画文件
- 2,raw ---->(在res文件夹下新建文件夹)
媒体文件(音频、视频文件)
- 3,xml---->(在res文件夹下新建文件夹)
其他的xml类型文件
- 4,menu---->(在res文件夹下新建文件夹)
菜单文件
##十,清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="wang.relish.demo">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher" // app桌面logo。不设置的话是Android系统自带的图标(不同Android版本长得不同)。
android:label="@string/app_name" // App名。不设置的话, 默认为启动的Activity的全类名
android:roundIcon="@mipmap/ic_launcher_round" // Android O 新特性, 原型图标
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
### 模块的删除 ###
选中模块,右键-->Open Module Settings-->"-"号,这时候模块文件夹的小图标就会消失,这时候再点右键就可以删除了。
![](img/delete_module.png)
借鉴: