AndroidStudio
介紹
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打包 |
安裝
-
安裝需求
- 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
- AS的android插件會嘗試下載SDK更新,因國內網絡問題,會導致下載失敗無法啟動程序
-
常見問題
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,計划未來將支持更多的語言。
編譯過程
http://developer.android.com/tools/building/index.html
Gradle相關文件
- 重要
project 中的 settings.gradle 說明
// 這個Project中有2個Module
include ':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
}
}
// 所有項目都依賴於jcenter
allprojects {
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,在彈出的對話框上點確定。
導入依賴
導入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