經過Android Studio導入supportDemo,解決編譯錯誤

以前在網上找到有人分享的已經編譯好的support4Demo的apk,其實就是google的sdk中所提供的support包的幾個demo。因此就想着順便把其餘幾個也一併導入到Android Studio中,方便查看源碼學習。android


首先來看一下幾個Demo的目錄結構app

SupportDemo目錄結構

其實很簡單,就是src源碼和res資源兩個文件夾,再加上一個AndroidManifest.xml清單文件。ide

###Support4Demo佈局

咱們先來導入v4 Demo包。在一個新的Project中,File->New->Import Module.將v4 Demo的源碼導入。一路Next以後,Gradle就開始編譯了。這時候咱們會碰到第一個錯誤。學習

第一個錯誤

failed to find Build Tools revision 19.1.0gradle

這裏能夠看到,錯誤的緣由是沒法找到19.1.0版本的Gradle。由於我當前使用的Gradle版本是最新的23.0.2,因此只須要將文件修改一下就能夠了。在support4Demos包下的build.gradle中,修改代碼:ui

buildToolsVersion "23.0.2"

修改以後繼續編譯,這時會遇到第二個問題。google

第二個錯誤

錯誤:程序包android.support.v4.view不存在code

錯誤信息顯示,android.support.v4下的某個包不存在。這個應用是support4Demos,固然是基於v4包來展現新功能(控件)的Demo。而咱們當前並無給引用添加庫,天然會報錯了。router

dependencies {
    compile 'com.android.support:support-v4:23.1.1'
}

在build.gradle中太添加應用庫,再次編譯。

bingo!此次終於編譯成功,能夠在手機上跑起來了。

###Support7Demos

咱們繼續來導入v7Demo。Import Module後一樣會碰到Gradle版本的錯誤,有了以前的經驗,咱們能夠很輕易的解決這個問題了。

由於此次是v7包的Demo,因此咱們先將appcompat-v7包添加到引用中

dependencies {
    compile 'com.android.support:appcompat-v7:23.1.1'
}

按照以前的步驟,到這裏咱們的應用就已經能夠運行了。等等,怎麼又報錯了?

第三個錯誤指定

Error retrieving parent for item: No resource found that matches given name 'android.TextAppearance.Material.Widget.Button.Inverse'

這又是什麼錯誤呢?咱們先來看看android:TextAppearance.Material.Widget.Button.Inverse是個什麼屬性。原來這是在SDK 23,也就是6.0以後添加的style。

由於我所下載的Support Library是最新的23.1.1版本。在這個版本中使用了6.0的style使得總體的風格可以統一。而咱們默認建立項目的時候所使用的compileVersion是19,那麼固然拿不到新的屬性了。因此這裏咱們將編譯版本修改一下就能夠了,一樣是在build.gradle下:

compileSdkVersion 23

這樣就能夠找到對應的resource了。但是這時候編譯仍然會報錯

第四個錯誤

No resource identifier found for attribute 'cardElevation' in package 'com.example.android.supportv7'

沒法在當前項目中找到'cardElevation'屬性。查看一下xml佈局文件,咱們發現這個屬性是在CardView這個標籤下的,原來v7Demo中所使用的控件並再也不supportv7包下,而是一個獨立的cardview-v7包。這樣咱們就清楚了,只要把這個包也引入就能夠了:

dependencies {
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:cardview-v7:23.1.1'
    compile 'com.android.support:mediarouter-v7:23.1.1'
    compile 'com.android.support:gridlayout-v7:23.1.1'
    compile 'com.android.support:recyclerview-v7:23.1.1'
}

除了CardView,Demo中還用到了MediaRouter、GridLayout、RecyclerView,咱們把這幾個獨立的控件包也添加到build.gradle中來。這樣應用就能夠成功的編譯了。

###Support13Demos 和 SupportAppNavigation

剩下的v13Demo和appNavigation的Demo,咱們按照以前處理相應錯誤的方式就能夠成功的導入到Android Studio中進行編譯並安裝了。

####總結

其實這幾個問題在咱們導入開源的項目的時候會常常遇到。可是通常總結起來大可能是三個緣由: 1. Gradle版本不一致。通常將Gradle改成本機上所使用的版本就能夠解決了。 2. 項目所使用的庫沒有被引入。錯誤大可能是沒法找到resource,也就是沒法使用res包下所定義的某個style、value等。這時候咱們就須要將庫添加到dependencies下。 3. CompileVersion不匹配。編譯版本不匹配所致使的每每是項目沒法調用新版本的屬性,因此最徹底的解決方式就是將編譯版本修改成最新的。

固然,在實際操做時,每每不像咱們上面所遇到的錯誤這樣很輕鬆就能夠找到錯誤發生的位置。最多見的每每是因爲項目中所使用的庫與咱們的配置的庫衝突、不一致而引發的編譯失敗。可是歸根結底仍是上面所說的三種緣由,只須要將每個庫都進行檢查比對,總能找到錯誤的緣由的(可是一個成熟的上線項目那龐大的引用庫...想想也很頭大)。

其實使用Eclipse來進行編譯也會遇到這些錯誤,相比起來,Android Studio只須要添加一行代碼就能夠把Library引入也算是方便很多了。固然若是可以學到更多的Gradle命令的話就更簡單了。

相關文章
相關標籤/搜索