AndroidStudio软件用法说明
个人吐血整理,希望能给大家一些帮助,可能是史上最全的android studio 文档
介绍
Google官方的Android集成开发环境(IDE = Integrated Development Environment),Eclipse + Adt插件的代替者。
学习的必要性
- 趋势
原因 | 说明 |
---|---|
发展趋势 | google公司把官方IDE工具定为AS,并停止了EclipseADT的维护 |
工作 | 越来越多的公司在使用AS作为开发工具,特别是大公司、好公司 |
学习 | Github上越来越多的android开源项目是AS开发的 |
- 更好用
对比
对比项 | Eclipse + ADT | Android Studio |
---|---|---|
基于 | IBM公司的Eclipse | JetBrains公司的 IDEA 社区版 |
运行速度 | 中 | 快 |
程序界面 | 中 | 漂亮 |
编码速度 | 中 | 快(更智能的提示) |
插件 | 安装繁琐 | 安装简单,自带很多插件 |
版本控制 | 需额外安装 | 多 |
内存占用 | 中 | 大 |
编译 | ANT | gradle |
依赖网络 | 否 | 是 |
其他 | 内置终端; UI编辑支持多屏预览;多APK打包 |
安装
http://developer.android.com/sdk/index.html
-
安装需求
- JDK 1.7
- 2G空闲内存
- 500M磁盘空间
-
安装方式
- 解压IDE工具(推荐)
- 安装IDE工具
- 安装IDE+SDK+AVD
-
运行
- 32 位运行android-studio\bin\studio.exe
- 64 位运行android-studio\bin\studio64.exe
-
配置
-
AS的android插件会尝试下载SDK更新,因国内网络问题,会导致下载失败无法启动程序
初次运行无法进入程序(网络问题,无法下载SDK更新)
在 AS安装目录/bin/idea.properties最后添加
disable.android.first.run=true
-
-
常见问题
tools.jar缺失,或其他的jar缺失
原因:jdk没有安装好。
解决:卸载当前jdk、删除java环境变量;重启;安装正确的jdk(已提供合适的JDK安装文件,安装时不要安装JRE),配置环境变量
界面
-
整体
) -
菜单 -File
) -
菜单 - Build
-
快捷工具
-
-
Project视窗
-Structure视窗
-
代码编辑区域
-
-
代码编辑- 布局文件的多屏预览
-
-
Android 监控
-
-
Message
-
建立HelloWorld项目
- 重要概念
中文 | Eclipse | AS |
---|---|---|
工作空间 | WorkSpace | Project |
工程(库或应用) | Project | Module |
As中强调应该把相关的工程放在同一个工作空间中
Gradle相关
概念
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML。当前其支持的语言限于Java、Groovy和Scala,计划未来将支持更多的语言。
https://zh.wikipedia.org/zh/Gradle
编译过程
http://developer.android.com/tools/building/index.html
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7t0VLAa6-1601042672516)()]
Gradle相关文件
- 重要
project 中的 settings.gradle 说明
// 这个Project中有2个Moduleinclude ':app', ':percent-23.1.0'
project 中的build.gradle说明
// 构建脚本buildscript { // 仓库 repositories { // 中央仓库 https://bintray.com/bintray/jcenter // 通过jar包的字符串包名,就可以下载到jar包了 // 成熟的公司可能会有自己的仓库服务器,需要在此配置 jcenter() } dependencies { // android gradle构建工具,用于处理module下的build.gradle文件,此版本与Gradle版本有配套关系,目前gradle已经到2.8了,但主要使用的是2.4 classpath 'com.android.tools.build:gradle:1.3.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }}// 所有项目都依赖于jcenterallprojects { repositories { jcenter() }}// gradle在执行构建任务时的清理配置task clean(type: Delete) { delete rootProject.buildDir}
module中的build.gradle详细说明
// 表示这个项目编译完成后,是一个anrdoid应用程序apply plugin: 'com.android.application'// 表示这个项目编译完成后,是一个anrdoid的库//apply plugin: 'com.android.library'android { // 编译的sdk版本,见sdk\platforms compileSdkVersion 23 // 构建工具的版本,见sdk\build-tools buildToolsVersion "23.0.1" defaultConfig { // 包名:用于在市场上区分应用的唯一性的标示 applicationId "cn.itcast.as.helloworld" // 最小sdk版本、目标sdk版,原先是放在清单文件中的 minSdkVersion 15 targetSdkVersion 23 // 应用程序的版本号,和版本码,原先是放在清单文件中的 versionCode 1 versionName "1.0" } // 构建类型 buildTypes { // debug版默认有配置,没有写在这里 // 发行版 release { // 是否混淆 minifyEnabled false // 混淆配置文件 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }}// 关键:项目的依赖dependencies { // 在项目中的libs中的所有的.jar结尾的文件,都是依赖 compile fileTree(dir: 'libs', include: ['*.jar']) // 依赖于junit测试 testCompile 'junit:junit:4.12' // 还依赖于appcompat-v7,23.1.0版本 compile 'com.android.support:appcompat-v7:23.1.0'}
- 其他
所属 | 文件 | 类型 | 作用 |
---|---|---|---|
Project | .gradle | 文件夹 | 配置文件,无需更改、关注 |
Project | gradle | 文件夹 | 包含了gradle-wrapper相关文件,无需更改、关注 |
Project | gradle.properties | 文件 | gradle启动的配置,如java虚拟机的内存占用等,一般无需修改 |
Project | gradlew/gradlew.bat | 文件 | 初始化gradle相关变量的脚本 |
文件和文件夹说明
- Project根目录
文件/文件夹 | 说明 |
---|---|
.idea/ | IDE的Project相关设置 |
app/ | 默认建立的module目录 |
build/ | 打包的临时目录 |
gradle/ | gradle的相关目录 |
.gradle/ | gradle的相关目录 |
.gitignore | git同步时的忽略的文件 |
builder.gradle | Project的gradle依赖 |
gradle.properties | project的gradle配置 |
gradlew | 执行gradle构建的脚本(un*x) |
gradlew.bat | 执行gradle构建的脚本(windows) |
local.properties | SDK目录设置 |
Project.iml | 存放module信息 |
settings.gradle | Project下有哪些Module |
- module目录
文件/文件夹 | 说明 |
---|---|
build/ | 编译的中间数据、最终apk存放目录 |
build/source/r/debug/R.java | R文件 |
build/outputs/apk/ | APK文件默认位置 |
libs/ | 导入的jar包存放的位置 |
src/ | 源码(java、xml、…) |
src/androidTest/ | 测试代码存放位置 |
src/main/java/your/package/name | java代码 |
src/main/jniLibs/ | 动态连接库所在目录 |
src/main/assets/ | 资产文件存放目录 |
src/main/res/ | 资源目录 |
src/AndroidManifest.xml | 清单文件 |
src/main/res/mipmap/ | 一般放置应用图标 |
app.iml | 存放module信息(由AS创建) |
build.gradle | gradle的构建文件 |
proguard-rules.pro | 混淆设置 |
设置
-
文件编码
-
程序外观
-
-
编辑区域外观
-
logcat外观
快捷键
视窗快捷键
代码补全
快捷键方案修改 && 编辑快捷键
活动模板
后缀补全
常用快捷键
动作 | 按键 |
---|---|
删除行 | Ctrl + Y |
复制一行 | Ctrl + D |
上下移动代码 | Alt + Shift + Up/Down |
格式化代码 | Ctrl + Alt + L |
优化导导包 | Alt + Ctrl + O |
大小写转换 | Ctrl + Shift + U |
打开文件 | 两次shift |
注释代码(//) | Ctrl + / |
注释代码(/**/) | Ctrl + Shift + / |
生成代码 | Alt + Insert |
快速定位错误 | F2 |
查找 | Ctrl + F |
查看继承关系 | Ctrl + H |
查找+替换 | Ctrl + R |
快捷覆写方法 | Ctrl + O |
调试
进入调试的两种方式
-
以调试模式运行
-
运行后调试
需要注意 运行的程序的代码应该与所看到的是同一份,不然点击提示会错位
如何打断点
- 代码左侧单击
- 代码左侧单击时按着shift键
断点类型
断点类型 | 什么时候会停下来 | 注意 |
---|---|---|
行断点 | 执行到此行 | 无 |
成员变量断点 | 被赋值 或 访问 | art虚拟机提供,需安卓5以上设备才有此功能 |
方法断点 | 进入方法或退出方法 | 会影响代码执行的效率,慎用 |
异常断点 | 出现了未捕获异常 及 捕获的异常 | 默认不开启 |
导入module
导入Eclipse项目
File –> New –> Import Module
导入AndroidStudio项目
File –> New –> Import Module
导入AAR
File –> New –>New Module –> Import .jar/.aar package
删除导入的Module
当文件夹上显示了手机或柱状图 图标,说明此文件夹是受保护的,无法被删除
- 取消保护
打开Project Struecture。 选中要删除的module,点上面的减号。 然后点确定
- 删除文件
在原来是module的文件夹上点击鼠标右键,选中delete,在弹出的对话框上点确定。
导入依赖![img](https://i-blog.csdnimg.cn/blog_migrate/0d541a7c11fd7d6318e4dcf58ca84147.png)
导入Library
导入文件jar包
导入Module依赖
对应关系
插件管理
安装插件的两种方式
- 本地安装
- 网络安装
ButterKnife Zelezny的使用
打包APK
混淆
作用及意义
- 减小apk大小,删除无用的类和方法
- 避免被反编译后重要的程序逻辑暴露
配置
app/build.gradle
buildTypes { release { // false ,关闭混淆 // true , 开启混淆 minifyEnabled false // proguard-android.txt 是通用的混淆配置文件,放在sdk中 (sdk\tools\proguard\) // proguard-rules.pro 是项目都有的混淆配置文件 ,在项目的根目录中 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' }}
通用混淆文件说明
# 以#开头的都是注释,下同# This is a configuration file for ProGuard.# http://proguard.sourceforge.net/index.html#manual/usage.html# 不使用大小写混合的类名# 比如说 a.java 和 A.java。因为在windows下文件名是不区分大小写的,会导致文件的覆盖-dontusemixedcaseclassnames# 混淆第三方jar-dontskipnonpubliclibraryclasses# 打印更多日志-verbose# Optimization is turned off by default. Dex does not like code run# through the ProGuard optimize and preverify steps (and performs some# of these optimizations on its own).# 不做做优化(有时会弄巧成拙)-dontoptimize# 不做预校验-dontpreverify# Note that if you want to enable optimization, you cannot just# include optimization flags in your own project configuration file;# instead you will need to point to the# "proguard-android-optimize.txt" file instead of this one from your# project.properties file.# 保留注解上的属性-keepattributes *Annotation*# 保留此类(com.google.vending.licensing.ILicensingService)不被混淆,google需要用到-keep public class com.google.vending.licensing.ILicensingService# 保留此类( com.android.vending.licensing.ILicensingService)不被混淆,google需要用到-keep public class com.android.vending.licensing.ILicensingService# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native# 保持 native 方法不被混淆,混淆后不能正确调用底层方法了-keepclasseswithmembernames class * { native <methods>;}# keep setters in Views so that animations can still work.# see http://proguard.sourceforge.net/manual/examples.html#beans# 保留任何直接或间接继承与View的类的set和get开头的方法,不被混淆-keepclassmembers public class * extends android.view.View { void set*(***); *** get*();}# We want to keep methods in Activity that could be used in the XML attribute onClick# 保留直接或间接继承于Activity的类的 点击事件方法不被混淆,因为混淆后布局文件写的点击事件方法就会找不到-keepclassmembers class * extends android.app.Activity { public void *(android.view.View);}# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations# 保留枚举类的如下 values 和valueOf方法-keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String);}# 保留实现了Parcelable 接口的类的静态CREATOR常量-keepclassmembers class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator CREATOR;}# 保留R.java中的及内部类的的所有静态字段-keepclassmembers class **.R$* { public static <fields>;}# The support library contains references to newer platform versions.# Don't warn about those in case this app is linking against an older# platform version. We know about them, and they are safe.# 告诉ProGuard不要警告找不到android.support开头的包名.-dontwarn android.support.**
项目特有的常用的混淆语法
- 特定的类不被混淆
-keep class package.name.Klass {*;}
- 某个包下的类不被混淆
-keep class package.name.** {*;}
- 继承与某类的类不被混淆
-keep class * extends java.lang.annotation.Annotation { *; }
使用第三方jar包在混淆后出错
一般,都可以在网站上找到相应的混淆配置
比如
- butterknife
http://jakewharton.github.io/butterknife/ 查找 PROGUARD - baidu map sdk
http://lbsyun.baidu.com/index.php?title=androidsdk/qa 查找 混淆 - xutils
https://github.com/wyouflf/xUtils 查找 混淆
多APK打包
意义
- 国内现状: 多个电子市场可提供apk的下载,用于统计市场的作用
- 同一个应用程序,给不同的客户,需要连接不同的服务器
步骤
1 在清单文件中添加metadata
<application ...... > <!-- market 表示键 ${MARKET}表示值 ,用${}表示会变......--> <meta-data android:name="market" android:value="${MARKET}"/> <!-- ......--></application>
2 在程序中获得metadata并使用
//TODO 从sp中获取是否是第一运行boolean isFirstRun= true;if(isFirstRun){ // 通过PackageManager拿到在清单文件中记录的metadata信息 PackageManager packageManager = getPackageManager(); String packageName = getPackageName(); int flag = PackageManager.GET_META_DATA; // 表示我们获取当前应用程序的application下的metadata数据 ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName, flag); // 传入键名,拿到键值 String market = applicationInfo.metaData.getString("market"); //TODO 获取imei String imei = "123456"; // TODO 自己实现代码 sentToServer(market, imei); //TODO 写入sp,下次启动程序就不发送了}
3 添加flavor动态修改metadata
android{ //...... productFlavors { _360 { manifestPlaceholders = [MARKET: "_360"] } wandoujia { manifestPlaceholders = [MARKET: "wandoujia"] } anzhi { manifestPlaceholders = [MARKET: "anzhi"] } }}
版本控制
SVN环境
-
安装TortoiseSVN
!!! 注意勾选 command line client tools
-
-
在as中,设置svn的命令行工具
settings –> Version Control –> Subversion –>General –> use command line client
选中TortoiseSVN的安装目录中的bin文件夹中的svn.exe -
上传本地代码
- 设置同步
settings –> Version Control
把project后面加上版本控制的类型
-
设置忽略文件
settings –> Version Control –> Ignored Files
3种方式:特定文件、指定目录下的文件、特定规则文件 -
-
提交目录
project 右键 –> Subversion –> share directory
这一步只提交了目录,文件并没有上传到服务器
-
上传文件
project 右键 –> Subversion –> submit directory
下载服务器的代码
在Welcome to Android Studio界面,点击第三个Check out project from Version Control
提交代码,编辑冲突
project 右键 –> Subversion –> submit directory
好习惯:先update,再submit
- 冲突的解决
3种 接受服务器的,接受自己的,合并
英文 | 含义 |
---|---|
Accept Theirs | 用服务器的覆盖本地的 |
Accept Youts | 用本地的覆盖服务器的 |
Merge | 查看服务器和本地的,最终决定提交的内容 |
!!! 注意,在合并后,还需要submit
断开连接
- 断开连接
- 先删除配置
在settings –> version control -掉同步文件夹
- 先删除配置
2. 再删除文件
删除.svn文件夹
- 忘记记录的用户名和密码
settings –> version control –> subversion –>clear auth cache
0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
2. 再删除文件
删除.svn文件夹
- 忘记记录的用户名和密码
settings –> version control –> subversion –>clear auth cache
感谢大家!