AndroidStudio技巧

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插件编写


  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值