AS工程结构
菜单栏
View
Tool Windows
Alt+1 Project窗口
Alt+F12 终端窗口
Ctrl+Q 光标处函数说明
Ctrl+P 广标处参数说明
F4 注解,配置跳转到源码
Ctrl+E 列出最近修改的文件
Ctrl+Shift+E 列出最近修改的地方
Edit
Ctrl+Z 撤销
Ctrl+Shift+Z 反撤销
右键—Copy/Paste Special—Copy Reference 拷贝包名
Ctrl+Shift+V 打开历史记录选择粘贴
Ctrl+Shift+Alt+V 粘贴文本,不粘贴格式
Ctrl+V 粘贴格式和文本
Ctrl+D 复制一行
Ctrl+Y 删除一行
Ctrl+F 当前文件查找
F3 跳到下一个搜索结果
F3+Shift 跳到上一个搜索结果
Ctrl+Shift+F 在文件中搜索
Alt+F7 查找被使用的地方
Ctrl+F7 在当前文件查找被使用的地方
Alt+Shift+Insert 切换列编辑模式
Alt+Shift+Ctrl 多点光标选择
Navigate
Ctrl+N 查找类
Ctrl+Shift+N 查找文件
Ctrl+G 按行号查找
F2 跳到下一个错误处
Shift+F2 跳到上一个错误处
Ctrl+Shift+Back 跳到上一次改动处
Ctrl+Shift+左 跳到上一次浏览处
Alt+Down 跳转到下一个方法
Ctrl+Shift+M 跳转到对应的括号
Ctrl+B 声明处和使用处切换
Ctrl+Alt+B 接口跳到实现处
Ctrl+U 跳到父类
Ctrl+H 显示类的继承视图
Ctrl+Shift+H 方法所属的列
Ctrl+Alt+H 函数在哪里被调用
Ctrl+F12 显示类的大纲
Ctrl+Alt+F12 显示文件在本地的对应
F11 用勾标记某一行
Ctrl+F11 用数字标记某一行
Shift+F11 显示标记的地方
Code
Ctrl+O 显示可以复写的方法
Ctrl+I 显示可以实现的方法
Ctrl+Alt+T try.catch或其他
Alt+Insert 插入get,set等方法
Ctrl+Alt+L 格式化代码
HOME 按一次回到行首,按两次缩进
Ctrl+Alt+O 优化引用(没有用的去掉)
Alt+Enter 导入,强转,等万能快捷键
Ctrl+Shift+Down 行代码一个方法一个方法地移动
Alt+Shift+Down 行代码一行一行地移动
Ctrl+J 根据上下文生成代码模板
代码快速完成,例如:****************
变量.not !变量
对象.nn 对象!=null
数组.fori for循环
语句.t try catch包裹
代码输入模板,例如:******************
geti 单例方法
ifn 不为空
选中代码输入“”
拷贝相同变量,选中输入{}
输入首字符,唤处提示Ctrl+Shift+空格
变成常量Ctrl+Alt+C
Analize
Inspect Code 对代码进行扫描,找出不合规范的地方
Refactor
Shift+F6 重命名字符串
Ctrl+F6 改变函数的参数,返回值
F5 拷贝类
F6 移动类
Ctrl+Alt+V 局部变量
Ctrl+Alt+F 成员变量
设置
Appearance—System Setting—Upates 取消更新检查
Appearance—Scopes 选择搜索范围
Editor----General----Rich-Text Copy 打钩,拷贝格式和文本
Editor----General----Smart Keys----Use“CamelHumps” 打钩,双击选中单词
Editor----General----Editor Tab 打开文件导航栏位置(左,顶)
Editor----General----Postfix Complex 快速完成代码
Editor----General----File and Code Templates 文件模板
Editor----General----Live Templates 代码输入模板
Plugins Json插件,图片转流插件,类序列化插件
Tools 配置比较工具
其他
Activity类所在行,左侧栏跳转到布局文件
Activity代码引用资源,左侧栏预览
Activity方法,添加注解@StringRes,@ColorRes
布局文件关联Activity
tools:text 预览,实际不显示
tools:context 对应的Activity
工具窗口
Logcat日志窗口
最右侧选项
Show only selected application 显示选择应用的日志
no Filters 当应用crash后,无法选择应用,显示所有应用的日志
Edit Filter Configuration 编辑过滤日志条件
Debug窗口
F8 一步步跳过
F7 进入方法内部
Shift+F8 跳出方法
变量–右键–Add to Watches 加入观察
变量–右键–Inspect 查看值
变量–右键–show Refercing Object 引用情况
表达式—右键–evaluate exprese 评估表达式值
点断点–右键–设置条件
Get Thread Dump 线程信息保存
3 Gradle
-
Gradle是个构建系统,能够简化你的编译、打包、测试过程。熟悉Java的同学,可以把Gradle类比成Maven。
-
Gradle Wrapper的作用是简化Gradle本身的安装、部署。不同版本的项目可能需要不同版本的Gradle,手工部署的话比较麻烦,而且可能产生冲突,所以需要Gradle Wrapper帮你搞定这些事情。Gradle Wrapper是Gradle项目的一部分。Gradle对应版本下载完成之后,Gradle Wrapper的使命基本完成了
-
Android Plugin for Gradle是一堆适合Android开发的Gradle插件的集合,主要由Google的Android团队开发,Gradle不是Android的专属构建系统,但是有了Android Plugin for Gradle的话,你会发现使用Gradle构建Android项目尤其的简单。
-
Gradle: https://docs.gradle.org/current/userguide/userguide_single.html
-
Gradle Wrapper: https://docs.gradle.org/current/userguide/gradle_wrapper.html
-
Android Plugin for Gradle: https://developer.android.com/studio/build/index.html
参考:彻底搞懂Gradle、Gradle Wrapper与Android Plugin for Gradle的区别和联系
Gradle的3种版本
①src源码打包,不能运行
②bin可运行,不含多余东西
③all可运行,包含sample和文档
3.1 gradle文件夹
- 在Android Studio安装过程中产生gradle-wrapper.jar
- 每次新建项目,会将gradle-wrapper.jar拷贝到你的项目的gradle/wrapper目录中
- gradle-wrapper.jar是Gradle Wrapper的主体功能包
- gradle-wrapper.properties文件主要指定了该项目需要什么版本的Gradle,从哪里下载该版本的Gradle,下载下来放到哪里
参考:gradle-wrapper.properties中各属性的含义
1)gradle-wrapper.properties
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.1-bin.zip
zipStoreBase和zipStorePath组合在一起,是下载的gradle-3.1-bin.zip所存放的位置。
zipStorePath是zipStoreBase指定的目录下的子目录。
distributionBase和distributionPath组合在一起,是解压gradle-3.1-bin.zip之后的文件的存放位置。
distributionPath是distributionBase指定的目录下的子目录。
各项属性的整体含义,如下:
-
①去 https://services.gradle.org/distributions/gradle-3.1-bin.zip 下载gradle的3.1版本,只包含binary的版本。
-
②下载的gradle-3.1-bin.zip存放到C:\Users<user_name>.gradle\wrapper\dists目录中。
(注:具体还有2级目录,即全路径为C:\Users<user_name>.gradle\wrapper\dists\gradle-3.1-bin<url-hash>\,gradle-3.1-bin目录是根据下载的gradle的文件名来定的,目录名是根据distribution url路径字符串计算md5值得来的,具体参考PathAssembler.java中的rootDirName()和getHash(),PathAssembler.java的位置见本文最后的参考路径) -
③ 解压gradle-3.1-bin.zip,将解压后的文件存放到C:\Users<user_name>.gradle\wrapper\dists中。(注:具体还有2级目录,同上)
2)不通过Gradle Wrapper下载,指定对应版本的Gradle
勾选如下图中的Use local gradle distribution,同时指定Gradle home:
3)Gradle读取build.gradle文件
该文件中指定了该项目需要的Android Plugin for Gradle版本是什么,从哪里下载该版本的Android Plugin for Gradle。
如下图所示:项目中可以知道我们要使用3.0.1版本,从google和jcenter处下载,那么下载到我们本地的哪里呢?它会下载到~.gradle\caches\modules-2\files-2.1\com.android.tools.build中
4)gradlew命令
./gradlew #gradle wrapper的简称,启动daemon JVM,加载gradle-wrapple.jar
./gradlew compileJava #检查有没有对应版本的gradle:①没有,则下载到gradle_user_home中,进行安装;②有,则查找有没有对应版本daemon JVM;③没有daemon JVM,则启动;④有daemon JVM,则连接daemon JVM,接受client JVM发送的任务,处理任务并返回结果;⑤daemon JVM一直存在下次cilent JVM发起新的请求,会再次连接daemon JVM减少开销;⑥若client与daemon不兼容,会启动一个新的daemon,旧的销毁。
./gradlew --stop #杀掉所有daemon进程:daemon JVM
3.2 settings.gradle文件
include模块名,使用【冒号】分割路径
每个参数中最后一个“:”后的字符串将被当做项目的名称
通过projectDir属性去改变一个项目的文件路径
project(模块名).projectDir=new FileDir(相对路径)
include ':demo1app', ':demo2app'
project(':demo1app').projectDir = new File("Demo1\\demo1app") //对应Module的路径
project(':demo2app').projectDir = new File("Demo2\\demo2app")
3.3 工程build.gradle
buildscript和allprojects中都有repositories和dependencies,两者的区别就是buildscript中的配置主要是为gradle本身服务的,gradle插件需要依赖的一些库什么的都在这里配置,allprojects则是为项目中的所有module配置的共同模块。
3.4 模块build.gradle
参考:gradle浅析
1)声明应用程序;声明库;应用第三方插件
apply plugin: ‘com.android.application’
apply plugin: ‘com.android.library’
apply from: ‘xxx’
2)android编译环境
- compileSdkVersion 指定编译的sdk版本
- buildToolVersion 指定编译工具的版本
- defaultConfig 默认配置: 应用程序包名、最小sdk版本、目标sdk版本、版本号、版本名称
defaultConfig { // 默认配置
applicationId "com.demo.test" // 应用程序的包名
minSdkVersion 22 //最小sdk版本
targetSdkVersion 27 // 目标sdk版本,充分测试过的版本(建议版本)
versionCode 1 // 版本号,第一版是1,之后每更新一次加1
versionName "1.0" // 版本名,显示给用户看到的版本号
archivesBaseName = "demo-$versionName" // 指定打包成Jar文件时候的文件名称
ndk {
moduleName "testwifisafe" // 设置库(so)文件名称
ldLibs "log", "z", "m", "jnigraphics", "android"
// 引入库,比如要用到的__android_log_print
abiFilters "armeabi", "x86", "armeabi-v7a" // "x86" 显示指定支持的ABIs
cFlags "-std=c++11 -fexceptions" // C++11
stl "gnustl_static"
}
// 当方法数超过65535(方法的索引使用的是一个short值,
// 而short最大值是65535)的时候允许打包成多个dex文件,动态加载dex。这里面坑很深啊
multiDexEnabled true
// Instrumentation单元测试
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
- signingConfigs 配置签名信息
signingConfigs {// 签名配置
release {// 发布版签名配置
storeFile file("fk.keystore") // 密钥文件路径
storePassword "123456" // 密钥文件密码
keyAlias "fk" // key别名
keyPassword "123456" // key密码
}
debug {// debug版签名配置
storeFile file("fk.keystore")
storePassword "123456"
keyAlias "fk"
keyPassword "123456"
}
}
- buildType 指定生成安装文件的配置
- minifyEnabled 是否对代码进行混淆
buildTypes {
release {
minifyEnabled false //是否对代码进行混淆,true表示混淆
applicationIdSuffix "debug" //包名后加后缀
}
debug {
minifyEnabled false //是否对代码进行混淆,true表示混淆
}
}
- 包名后加时间
buildType {
debug {
android.applicationVariants.all {
variant ->
variant.outputs.all {
def fileName = "${getCurrentTime()}_V${defaultConfig.versionName}_debug"
}
}
}
}
static def getCurrentTime() {
return new Date().format("yyyy-MM-dd",TimeZone.getZone("UTC"))
}
- productFlavors 不同的打包配置,以实现多渠道打包
//第一种方式:不断增加
productFlavors {
xiaomi {
buildConfigField "String","PLATE_FROM","\"xiaomi\""
}
}
defaultConfig {
flavorDimensions "versionCode" //声明
}
//第二种方式:一键多渠道打包
productFlavors {
productFlavors {
xiaomi()
yingyongbao()
}
productFlavors.all {
flavor ->
flavor.manifestPlaceholders = [UMENG_CHANEL_VALUE:name}
buildConfigField "String","PLATE_FROM","\"${name}\""
}
}
- 配置debug与release不同环境
//debug配置文件src/main/filters/debug/config.properties
//release配置文件src/main/filters/release/config.properties
def getServer(String str) {
def SS
Properties properties = new Properties()
def proFile = file('src/main/filters/${str}/config.properties')
if(proFile.canRead()) {
properties.load(new FileInputStream(proFile))
if(properties!=null){
SS = properties['SS']
}
}
return SS
}
//声明构建类型中使用
buildType {
debug {
buildConfigField "String","SS",getServer('debug')
}
}
- sourceSets 源文件路径
main {
manifest.srcFile 'AndroidManifest.xml' // 指定清单文件
res.srcDirs = ['res'] // 指定res资源目录
assets.srcDirs = ['assets'] // asset资源目录
jni.srcDirs 'src/main/jni' // jni代码目录
jniLibs.srcDir 'src/main/jniLibs' // jni库目录
java.srcDirs = ['src'] // 指定java源代码目录
resources.srcDirs = ['src'] // 指定resource目录
aidl.srcDirs = ['src'] // 指定aidl目录
renderscript.srcDirs = ['src'] // 指定source目录
}
3) repositories 库配置
jcenter()使用https加密,有时出错
替换为url “http://jcenter.bintray.com”
maven()
替换为url “http://repo.maven.org/maven2”
项目中使用的jar包都会从仓库下载到本地指定目录,即.gradle文件
配置本地的仓库
①配置环境变量GRADLE_USER_HOME的路径
②AS菜单settings–Gradle–修改仓库路径.gradle为新配置的路径
③在respositories中添加mavenLocal(), 表示先从本地仓库找,没有再从中央仓库下载
4)dependencies 库依赖以及远程依赖
引用lib中jar包
implement fileTree(include: ‘*.jar’, dir:‘libs’)
依赖模块
implement project(‘:模块’)
依赖jar包的标签由3个元素组成:group,name,version
依赖jar包的标签作用域???provided只在编译阶段起作用,运行阶段不起作用
使用方法:在中央仓库搜索jar包,点击context,选择某个版本,卡片选择gradle复制
4 Groovy语法简单介绍
groovy可以省略语句末尾的分号
- list集合和map集合
def a=5 #定义变量:def是弱类型,groovy会自动根据情况来给变量赋予对应的类型
def mList=['a','b'] #定义集合
mList<<'e' #添加元素
# 遍历方式一:for
for(int i int 1..10){
println i
}
# 遍历方式二:each
mList.each {
println it # it关键字,代表自己,这里it表示mList中的每个元素
}
def map=['key1':'value1', 'key2','value2'] #定义集合
map.key3='value3' # 添加元素
println map['key1'] # 打印集合
# 遍历map集合
map.each {
print "${it.key1},${it.value1} # it表示一对key-value
}
-
方法
定义一个方法,可以在task中调用
方法中没有return,默认返回非空最后一行 -
对象
定义一个对象和java一样,分号一般省略 -
闭包
开发的匿名代码块,可以接收参数,返回值并赋给变量;
闭包最为参数实参传递给方法的形参,并在方法内部回调此匿名函数,且在回调此匿名函数时,可以传递实参给到匿名函数的内部去接收,并执行此匿名函数;
groovy当函数的最后一个参数是闭包的话,闭包可以拿到圆括号外面,不引起歧义时可以省略圆括号
#定义有参数的闭包
def bag={v->println "hello ${v}"}
#定义闭包作为参数的函数
def fun(Closure<?> closure) {
closure("xiao ming")
}
#调用时省略小括号
fun bag
#也可以写成
fun {v->println "hello ${v}"}
#执行结果
hello xiao ming
# 定义返回两个参数的闭包
def eEachWithParams(closure) {
def map = ['name':'jack','age':10]
map.each {
closure(it.key,it.value)
}
}
# task FYY中调用
task FYY {
m,n ->println "${m} is ${n}"
}
如果闭包没定义参数的话,则隐含有一个参数,这个参数名字叫 it,和 this 的作用类似。it 代表闭包的参数
def greeting = { "Hello, $it!" }
#等同于
def greeting = { it -> "Hello, $it!" }
5 Gradle构建
Gradle的生命周期的3个阶段:
- Initialization 读取项目信息,创建project实例
- Configuration 把build.gradle当成groovy代码执行一遍
- Execution 运行项目
# 用闭包Configuration创建helloworld任务
# 该任务打印xxx,doLast把闭包添加到当前任务列表末尾并不真正执行
task('helloworld', {
println('xxx')
doLast({
println('yyy')
})
})
重要方法
afterEvaluate 项目实例创建完成,build.gradle从上到下执行完后(称为Evaluate),进行动作的勾函数
beforeEvaluate ????
allProjects 对所有项目实例进行操作
父工程build.gradle所依赖的jar包,子模块不能用;需要加allProject{ },子模块才能用
子工程间引用需要depencies{compile project(‘:需要引用的模块名称’)}
buildscript ????
file 读取文件
findProject 用名字查找project实例
findProperty 查找属性
getBuildDir 找到当项目的builde目录,存放临时构建输出
TaskAPI
dependsOn 项目有依赖关系时,对参数进行依赖。即先执行依赖的项目
doFirst ????
doLast 添加任务到列表,并不执行,该任务被调用时才会执行
gradle插件编写