在使用Android Studio的過程中所遇到的一些坑:
此篇不定時更新。
1、Error:Execution failed for task ‘:app:processDebugManifest’.> Manifest merger failed with multiple errors, see logs:
此問題出現的情況是:主項目引入另一個項目作爲主項目的library。網上有方法是:
在Manifest.xml的application標籤下添加tools:replace=“android:icon, android:theme”(多個屬性用,隔開,並且記住在manifest根標籤上加入xmlns:tools=“http://schemas.android.com/tools”。
反正上述方法我是沒成功,我這裏的解決方式是,通過看log發現是Manifest裏面的 <application>
標籤裏面的android:allowBackup="true"的原因,我在library裏面設置的是“true”,但是我的主工程裏面設置的“false”, 在我把主工程裏面也改成“true”之後重新clean 編譯就好。
2、Error:Execution failed for task ‘:app:transformClassesWithDexForDebug’.Process command ‘F:\Program Files (x86)\Java\jdk1.8.0_65\bin\java.exe’ finished with non-zero exit value 1 (或 value 2)。
相信這個問題只要是從eclipse轉AS過來的同學都會遇到,這個問題出現的原因也是當一個項目依賴一個library的情況下。這裏如果library 和主項目都引用了同一個包就會報這個錯(在eclipse上面可沒遇到這個情況。。。)。 最普遍的情況就是v4包:
library:
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:support-v4:23.1.1'
}
主項目:
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile project(':BaseApplicationLibrary')
compile files('libs/android-support-v4.jar')
}
這裏“BaseApplicationLibrary”就是上面的library項目,由於都引用了v4包,這裏刪除一個重新clean編譯下就好了。不過也有情況下clean之後還是報錯,在確認沒有其他問題的情況下可以試着重啓下AS,然後再編譯。我之前就是這樣纔好的。。。
3、org.apache.http.*類丟失
當我們API 更新到23之後,org.apache.http.*一些類找不到的情況,原因是在API 23後,不提供org.apache.http.*(只保留幾個)類了。
在android 2.3 (api 9)之後 推薦使用HttpURLConnection類,因爲它效率更高。這對於我們之前用HttpClient 無疑很蛋疼。不過沒關係推薦歸推薦,要用也還是可以的 :
Eclipse 解決辦法
在libs中引入org.apache.http.legacy.jar 包
此jar包在你的sdk目錄裏面的\platforms\android-23\optional 下(需要下載android 6.0的SDK)
Android Studio解決辦法:
在build.gradle裏面加上 :useLibrary ‘org.apache.http.legacy’ 如:
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
useLibrary 'org.apache.http.legacy'
defaultConfig {
minSdkVersion 8
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
!!!這裏有一點必須注意了compileSdkVersion 23
必須是23及以上 targetSdkVersion 23
也是,不然會找不到這個包。
4.The APK file D:\XXX.apk does not exist on disk.Error while Installing APK
今天在AS編譯安裝APK的時候報如上錯誤:
在嘗試了Clean Project、Rebuild、重啓AS後發現還是不行,最後在stackoverflow發現個方法:
點擊AS窗體右邊側的Gradle按鈕,然後刷新一下就好了。
5. Error:(140, 62) 錯誤: -source 1.6 中不支持 diamond 運算符(請使用 -source 7 或更高版本以啓用 diamond 運算符)
這個問題不管在eclipse還是As上都會遇到,原因是在JDK 1.7裏新增了一個新特性:增強對通用實例創建(diamond)的類型推斷 。什麼意思呢?我們會發現報錯的地方都是如下寫法:
List<DataSource> datasources=new ArrayList<>();
正常寫成這樣就沒錯了:
List<DataSource> datasources=new ArrayList<DataSource>();
也就是說JDK1.7支持這種類型推斷後,在聲明datasources 時new ArrayList<>裏可以不需要加DataSource。
好了,既然知道了哪塊的原因我們只要設置下jdk的版本就好了,如下圖:
設置好Source Compatibility 和 Target Compatibility 的版本就好了。
6.cannot find local variable ‘’
在接手了一個新的項目後,由於需要調試當我Debug的時候竟然發現所有的變量都顯示cannot find local variable
。debug其他的項目都正常顯示,故將問題鎖定在了build文件build.gradle。經過一個個參數的嘗試發現是 minifyEnabled true
的問題。
minifyEnabled
Android Studio 1.0以後將runProguard函數已經被廢棄並停止使用,改成minifyEnabled。
所以,minifyEnabled主要用來控制是否運行混淆的。
這裏就發現了,因爲我的混淆文件裏面忽略了調試信息的輸出所以當然不顯示了。
配置如下:
android {
...
buildTypes {
release {
minifyEnabled true
...
}
debug {
minifyEnabled false
...
}
}
...
}
7.Gradle sync failed: ‘appcompat-v7-23.3.0’ already disposed:
問題出現的情景是:今天想着把項目的版本升級下,編譯工具也升級下,原先是23.0.2,升級後是25.0.3,當然對應的依賴庫也都得升級了。升級後才發現有些庫出現一些bug,於是想降回來,結果就出現瞭如上報錯。哎~~~~
好了廢話不多說,解決方案:
點擊工具欄選中File -> Invalidate Cache/Restart 於是乎AS就會自動重啓,接着就是等待的過程了,重啓後就沒啥事了。估計是AS的緩存原因,已經不是簡單的clean能解決了。
8.Android Studio 寫xml佈局 格式化代碼 不會自動換行
寫xml佈局的時候如果是根據as的自動補齊來寫的代碼會這樣:
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="aaa"/>
不管你怎麼格式化都不會自動換行,這對於有代碼潔癖的我們是無法忍受的,我們也不可能手動去換行。
解決方法: 點擊左上角進入 File ->Settings -> Editor -> Code Style -> XML 然後選中右側Android項 勾選 Use custom formatting settings for Android XML files 如圖:
**9.Timeout waiting to lock jars **
Error:A problem occurred configuring root project '項目名'.
> Timeout waiting to lock jars (C:\Users\用戶名\.gradle\caches\jars-2). It is currently in use by another Gradle instance.
Owner PID: 5332
Our PID: 10972
Owner Operation:
Our operation:
Lock file: C:\Users\用戶名\.gradle\caches\jars-2\jars-2.lock
Clean 之後重啓Android Studio
10.Studio cannot determine what kind of files the chosen items contain. Do you want to attach them as ‘Sources’?
場景:今天在給項目手動添加一個 xxxx.jar 庫後,右鍵Add As Library。 然後我們就可以查看這個 庫下面的代碼了,可是當我打開一個類後(這裏隨意打開一個),代碼上面提示:Decompiled .class file, bytecode version:50.0 (java 6) ,這時樓主很自然的點擊了右邊的一個按鈕 Choose Sources,然後選中xxxx.jar這個庫,然後就報瞭如題所示的問題,然後對應的選中的那個類引用的地方都會提示cannot not resolve,但是項目可以正常編譯!!!可是類文件有紅線提示看着很不爽,可是不管clean、rebuild甚至invalidate Caches / Restart 都不管用。
解決方式:將xxxx.jar 重新命名跟之前不一樣就行,然後右鍵Add As Library,ok解決了~~~
11.All com.android.support libraries must use the exact same version specification
出現在這種情況的時候是我引用的compile 'com.android.support:appcompat-v7:25.3.0'
下面有一條紅線,提示如下:
All com.android.support libraries must use the exact same version specification (mixing versions can lead to runtime crashes). Found versions 25.1.1, 24.0.0. Examples include com.android.support:animated-vector-drawable:25.1.1 and com.android.support:mediarouter-v7:24.0.0
一般這種情況出現在當引用了多個第三方庫之後會發生的一些衝突,這種情況我們只要對應的排除掉衝突庫就行,這裏適合樓主的解決方式是:
在build.gradle 文件中添加
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
12. com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex
完整的錯誤信息如下:
Error:Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'.> java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex
出現問題的場景是:
我在項目中倒入了一個module,module中包括佈局文件、Activity、jni、jar等文件,因爲一些原因需要放到主工程下用,於是把上訴資源都拷貝到主工程的對應目錄下,gradle之後沒有報錯,可是在編譯運行的時候就報上訴錯誤了。
解決姿勢:
當拷貝完資源文件後,刪掉module你會發現有些地方的引用會報錯,原因是它的引用包還是module裏面的,接着改改就好了。說白了就是細心的問題~~~
13. com.android.dex.DexException: Multiple dex files define L ‘your app packagename’ BuildConfig;
該問題在rebuild的時候才發生;clean和編譯項目都沒問題!!!
報錯信息如圖:
問題發生場景:
一般我們在使用Android Studio開發中會建立多個module,有兩個包名一樣且其中某個(些) module是library(依賴庫)的時候會出現這個錯誤,這是因爲有多個BuildConfig.java(包名也相同)存在。
解決方案
這時候其實只需要在module是library的build.gradle中加入
packageBuildConfig(false)
完整代碼如下:
apply plugin: 'com.android.library'
android {
compileSdkVersion 26
buildToolsVersion "26.0.3"
defaultConfig {
minSdkVersion 19
targetSdkVersion 26
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
//此行爲添加的代碼
packageBuildConfig(false)
}
14. Connection refused (Connection refused);
Android studio 出現這個問題的原因一般有:
- AS設置裏gradle offline模式被打開
- 項目裏面gradle.properties文件中設置代理
- Android .gradle目錄下的gradle.properties文件被設置代理
針對這三種情況處理方法爲:
- 第一個問題直接在設置裏面關閉offline模式即可。
- 第二個問題主要是因爲工程目錄下的gradle.properties中設置了代理。如果有類似配置,修改一下,沒有則不用管。
原始:
systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=1080
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=1080
修改爲:
systemProp.http.proxyHost=mirrors.opencas.cn
systemProp.http.proxyPort=80
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=1080
- 第三個就是樓主遇到的問題
windows查看C:\Users\用戶名\Administrator.gradle文件,查看其中的gradle.properties中是否和問題二一樣。mac 在Users/用戶名/.gradle文件中查找(mac系統目錄默認不可見)
如果有以上問題需要修改gradle.properties如下:
原始:
systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=1080
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=1080
修改爲:
刪除這一部分代碼,或者直接刪除該文件(如果你沒有配置全局的設置)即可
注:
gradle.properties 文件也是含有兩個,但是卻是一個是全局,一個是項目的;> 這與上面的 Build 文件有何區別?區別在於全局文件存在於 C:\Users\用戶名
.gradle文件夾中,該文件有可能沒有,需要自己創建,創建後所有項目都
將具有訪問權限,在該文件中一般保存的是項目的一些變量等,如果是無關
緊要的變量可以保存在項目文件中,如果是用戶名密碼等變量則需要保存在
全局文件中。
Windows實用的一些快捷鍵
- Ctrl + Shift + F7 高亮顯示類裏的所有你當前的選中 , F3 往下查找。
- Ctrl + Alt + V 快速生成一串字符串的聲明。
- Ctrl + E 打開最近查看過的文件
- Shift+Click 可以關閉文件
- Ctrl+ [ 或 ] 可以跳到大括號的開頭結尾
- Ctrl+F12 可以顯示當前文件的結構
- Ctrl+N 可以快速打開類
- Alt+Q 可以看到當前方法的聲明
- Ctrl+Alt+T 可以把代碼包在一塊內,例如try/catch
- Alt+鼠標左鍵 同時修改多行代碼
- Ctrl+Alt+L 代碼格式化
- Shift + f6 全局重命名變量或方法名
- Ctrl + p 查看方法所需參數
- Ctrl + Alt + M 自動生成方法名
- Ctrl + Shift + U 大小寫切換
- Ctrl + O 重寫父類方法
- Ctrl + Alt + B 查看某個接口被誰實現
Mac實用的一些快捷鍵
終端下
功能 | 命令 | 參數 |
---|---|---|
列出文件 | ls | -w 顯示中文,-l 詳細, -a 隱藏文件 |
新目錄 | mkdir | |
拷貝文件 | cp | 參數R表示對目錄進行遞歸操作 |
刪除文件 | rm | -rf 表示遞歸和強制 |
移動文件 | mv | |
文本編輯 | nano | |
截屏 | Shift + command + 4 (或者3截全屏) | |
複製文本信息 | pbcopy < id_rsa.pub |
功能 | 快捷鍵 |
---|---|
刪除一行 | control + u |
清屏 | control + L |
往前一格 | option + 左箭頭 |
跳到行首 | control + a |
跳到行尾 | control + e |
光標刪除 | fn + delete |