Studio 初步汇总
参考资料
可能是史上最全的Android Studio入门级文档
http://blog.csdn.net/Jefferyleng/article/details/51356980
Android Studio 使用说明(一)
http://blog.csdn.net/gantao754246624/article/details/52752788
Android studio工具介绍
http://www.cnblogs.com/jiuyi/p/6121662.html
1. 整体界面
1.1整体框架
1.2菜单 -file
1.3菜单build
1.4 快捷工具
1.5 Project视窗
1.6-Structure视窗
1.7 代码编辑区域
1.8 Android 监控
1.9 Message
2. 编译过程
3. Gradle相关文件
3.1 project 中的 settings.gradle 说明
// 这个Project中有2个Module
include ':app', ':percent-23.1.0'
3.2 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
}
}
// 所有项目都依赖于jcenter
allprojects {
repositories {
jcenter()
}
}
// gradle在执行构建任务时的清理配置
task clean(type: Delete) {
delete rootProject.buildDir
}
3.3 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相关变量的脚本
4. 文件和文件夹说明
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 混淆设置
5. 设置
5.1 文件编码
5.2 程序外观
5.3 编辑区域外观
5.4 logcat外观
6. 快捷键
6.1 视窗快捷键
6.2 代码补全
6.3 快捷键方案修改 && 编辑快捷键
6.4 后缀补全
6.5 常用快捷键
动作 按键
删除行 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
7 调试
进入调试的两种方式
以调试模式运行
运行后调试
需要注意 运行的程序的代码应该与所看到的是同一份,不然点击提示会错位
如何打断点
代码左侧单击
代码左侧单击时按着shift键
7.1 断点类型
断点类型 什么时候会停下来 注意
行断点 执行到此行 无
成员变量断点 被赋值 或 访问 art虚拟机提供,需安卓5以上设备才有此功能
方法断点 进入方法或退出方法 会影响代码执行的效率,慎用
异常断点 出现了未捕获异常 及 捕获的异常 默认不开启
7.2 导入依赖
7.2.2 导入Library
7.2.3 导入文件jar包
7.2.4 导入Module依赖
7.2.5 对应关系
7.2.6 插件管理
安装插件的两种方式
本地安装
网络安装
8 打包APK
9. 混淆
作用及意义
减小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 查找 混淆
10 多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"]
}
}
}