2017-03-09 18 views
5

chất xúc tácLàm thế nào để sử dụng cây phụ thuộc của Gradle để giải quyết phiên bản thư viện hỗ trợ Android không khớp?

tôi nâng cấp Android Studio để 2.3, và Gradle plugin để 3.3

vấn đề ban đầu

Sau khi cập nhật các plugin Gradle đến 3.3, tôi nhận được báo lỗi "Lỗi: Bản sửa đổi Công cụ xây dựng SDK (23.0.3) quá thấp đối với dự án ': mymodulename'. Yêu cầu tối thiểu là 25.0.0 "

Tôi đã thử điều chỉnh cả buildToolsVersion thành 25.0.2 và compileSdkVers ion đến 25, cùng với tất cả các phụ thuộc com.android.support (vì phiên bản chính của chúng cần khớp với compileSdkVersion). Điều chỉnh đó đã giải quyết vấn đề này, nhưng sau đó tôi nhận ra rằng ứng dụng của tôi không hỗ trợ Nougat, vì vậy tôi đã giảm compileSdkVersion xuống targetSdkVersion của 23. Thông báo lỗi về các công cụ xây dựng quá thấp vẫn bị mất, vì vậy tôi nghĩ rằng tôi đã rõ ràng .

phụ thuộc đầu tiên lỗi

Sau khi gõ compileSdkVersion xuống 23 Tôi cố gắng để xây dựng lại, và thấy một số lỗi tương tự như "Lỗi: (3) Lỗi lấy mẹ cho mặt hàng: Không có nguồn phát hiện ra rằng phù hợp với trao name 'android: TextAppearance.Material.Widget.Button.Borderless.Colored' ". Tôi nhận ra rằng tôi đã quên để thay đổi com.android.support phụ thuộc của tôi như vậy mà phiên bản chính của họ phù hợp với các compileSdkVersion thấp hơn nữa, vì vậy tôi tình cờ gặp chúng xuống 23.3.0

lỗi phụ thuộc thứ hai

Sau giải quyết lỗi phụ thuộc đầu tiên, tôi đã có thể biên dịch và chạy lại ứng dụng của mình. Tuy nhiên, vẫn còn có một đốm nhỏ màu đỏ bên dưới phụ thuộc com.android.support đầu tiên của tôi, với lưu ý lỗi "tất cả thư viện com.android.support phải sử dụng cùng một đặc tả phiên bản chính xác (phiên bản trộn có thể dẫn đến lỗi thời gian chạy). .0, 23.3.0 Các ví dụ bao gồm com.android.support:support-v4:24.0.0 và com.android.support:animated-vector-drawable:23.3.0 "

Không có gì trong build.gradle của tôi tham chiếu 24.0.0, kìa:

apply plugin: 'com.android.application' 


android { 
    compileSdkVersion 23 
    buildToolsVersion '25.0.2' 


    defaultConfig { 
     applicationId ... 
     minSdkVersion 16 
     targetSdkVersion 23 
     versionCode ... 
     versionName ... 
    } 
    buildTypes { 
     debug{ 
      debuggable true 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
    lintOptions{ 

     //check for errors in release builds, 
     // but continue the build even when errors are found: 
     abortOnError false 
    } 
    dexOptions{ 
     jumboMode true 
    } 

} 

repositories { 
    // You can also use jcenter if you prefer 
    mavenCentral() 
} 

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    testCompile 'junit:junit:4.12' 
    //android support libs etc. 
    compile 'com.android.support:appcompat-v7:23.3.0' 
    compile 'com.android.support:support-v13:23.3.0' 
    compile 'com.android.support:mediarouter-v7:23.3.0' 
    compile 'com.android.support:recyclerview-v7:23.3.0' 
    //snackbar support 
    compile 'com.android.support:design:23.3.0' 

    //Facebook Android SDK 
    compile 'com.facebook.android:facebook-android-sdk:4.7.0' 
    //Facebook Audience Network SDK. Only versions 4.6.0 and above are available 
    compile 'com.facebook.android:audience-network-sdk:4.7.0' 

    //gplay services dependencies 
    compile 'com.google.android.gms:play-services-plus:10.0.1' 
    compile 'com.google.android.gms:play-services-analytics:10.0.1' 
    compile 'com.google.android.gms:play-services-location:10.0.1' 

    //provides Firebase Analytics 
    compile 'com.google.firebase:firebase-core:10.0.1' 

    //provides Google Mobile Ads SDK, a.k.a the AdMob service. 
    compile 'com.google.firebase:firebase-ads:10.0.1' 

    //dependencies required by the InMobi ads SDK 
    compile 'com.squareup.picasso:picasso:2.5.2' 

} 

apply plugin: 'com.google.gms.google-services' 

cây phụ thuộc

để f igure ra nơi phụ thuộc 24.0.0 đến từ, tôi tạo ra một cây phụ thuộc bằng cách sử dụng './gradlew -q dependencies mymodulename: dependencies --configuration compile'. Đầu ra là:

compile - Classpath for compiling the main sources. 
+--- com.android.support:appcompat-v7:23.3.0 
| +--- com.android.support:support-vector-drawable:23.3.0 
| | \--- com.android.support:support-v4:23.3.0 -> 24.0.0 
| |   \--- com.android.support:support-annotations:24.0.0 
| +--- com.android.support:animated-vector-drawable:23.3.0 
| | \--- com.android.support:support-vector-drawable:23.3.0 (*) 
| \--- com.android.support:support-v4:23.3.0 -> 24.0.0 (*) 
+--- com.android.support:support-v13:23.3.0 
| \--- com.android.support:support-v4:23.3.0 -> 24.0.0 (*) 
+--- com.android.support:mediarouter-v7:23.3.0 
| +--- com.android.support:appcompat-v7:23.3.0 (*) 
| \--- com.android.support:palette-v7:23.3.0 
|   \--- com.android.support:support-v4:23.3.0 -> 24.0.0 (*) 
+--- com.android.support:design:23.3.0 
| +--- com.android.support:appcompat-v7:23.3.0 (*) 
| +--- com.android.support:support-v4:23.3.0 -> 24.0.0 (*) 
| \--- com.android.support:recyclerview-v7:23.3.0 
|   +--- com.android.support:support-v4:23.3.0 -> 24.0.0 (*) 
|   \--- com.android.support:support-annotations:23.3.0 -> 24.0.0 
+--- com.facebook.android:facebook-android-sdk:4.7.0 
| +--- com.parse.bolts:bolts-android:1.2.0 
| \--- com.android.support:support-v4:[22,23) -> 24.0.0 (*) 
+--- com.facebook.android:audience-network-sdk:4.7.0 
| \--- com.google.android.gms:play-services-ads:7.8.0 -> 10.0.1 
|   +--- com.google.android.gms:play-services-ads-lite:10.0.1 
|   | \--- com.google.android.gms:play-services-basement:10.0.1 
|   |   \--- com.android.support:support-v4:24.0.0 (*) 
|   +--- com.google.android.gms:play-services-base:10.0.1 
|   | +--- com.google.android.gms:play-services-basement:10.0.1 (*) 
|   | \--- com.google.android.gms:play-services-tasks:10.0.1 
|   |   \--- com.google.android.gms:play-services-basement:10.0.1 (*) 
|   +--- com.google.android.gms:play-services-clearcut:10.0.1 
|   | +--- com.google.android.gms:play-services-base:10.0.1 (*) 
|   | \--- com.google.android.gms:play-services-basement:10.0.1 (*) 
|   +--- com.google.android.gms:play-services-basement:10.0.1 (*) 
|   \--- com.google.android.gms:play-services-gass:10.0.1 
|    \--- com.google.android.gms:play-services-basement:10.0.1 (*) 
+--- com.google.android.gms:play-services-plus:10.0.1 
| +--- com.google.android.gms:play-services-base:10.0.1 (*) 
| \--- com.google.android.gms:play-services-basement:10.0.1 (*) 
+--- com.google.android.gms:play-services-analytics:10.0.1 
| +--- com.google.android.gms:play-services-analytics-impl:10.0.1 
| | +--- com.google.android.gms:play-services-base:10.0.1 (*) 
| | \--- com.google.android.gms:play-services-basement:10.0.1 (*) 
| +--- com.google.android.gms:play-services-base:10.0.1 (*) 
| +--- com.google.android.gms:play-services-basement:10.0.1 (*) 
| \--- com.google.android.gms:play-services-tagmanager-v4-impl:10.0.1 
|   +--- com.google.android.gms:play-services-analytics-impl:10.0.1 (*) 
|   +--- com.google.android.gms:play-services-base:10.0.1 (*) 
|   \--- com.google.android.gms:play-services-basement:10.0.1 (*) 
+--- com.google.android.gms:play-services-location:10.0.1 
| +--- com.google.android.gms:play-services-base:10.0.1 (*) 
| +--- com.google.android.gms:play-services-basement:10.0.1 (*) 
| \--- com.google.android.gms:play-services-tasks:10.0.1 (*) 
+--- com.google.firebase:firebase-core:10.0.1 
| \--- com.google.firebase:firebase-analytics:10.0.1 
|   +--- com.google.android.gms:play-services-basement:10.0.1 (*) 
|   +--- com.google.firebase:firebase-common:10.0.1 
|   | +--- com.google.android.gms:play-services-basement:10.0.1 (*) 
|   | \--- com.google.android.gms:play-services-tasks:10.0.1 (*) 
|   \--- com.google.firebase:firebase-analytics-impl:10.0.1 
|    +--- com.google.android.gms:play-services-basement:10.0.1 (*) 
|    +--- com.google.firebase:firebase-iid:10.0.1 
|    | +--- com.google.android.gms:play-services-basement:10.0.1 (*) 
|    | \--- com.google.firebase:firebase-common:10.0.1 (*) 
|    \--- com.google.firebase:firebase-common:10.0.1 (*) 
+--- com.google.firebase:firebase-ads:10.0.1 
| +--- com.google.android.gms:play-services-ads:10.0.1 (*) 
| \--- com.google.firebase:firebase-analytics:10.0.1 (*) 
+--- com.squareup.picasso:picasso:2.5.2 
\--- com.android.support:recyclerview-v7:23.3.0 (*) 

(*) - dependencies omitted (listed previously) 

các câu hỏi

  1. không cây phụ thuộc cú pháp 'phiên bản lib -> khác nhau lib phiên bản' nghĩa là gì? Cụ thể, khi cây nói "com.android.support:support-v4:23.3.0 -> 24.0.0", nghĩa là gì?

  2. Nếu có yêu cầu ẩn đối với thư viện 24.xx phiên bản com.android.support trong một số phụ thuộc khác của tôi (xem com.google.android.gms: play-services-basement: 10.0.1 tùy thuộc vào com. android.support:support-v4:24.0.0), tại sao không xây dựng này.lỗi ném gradle trước Android Studio, plugin Gradle và bản cập nhật buildToolsVersion được đề cập trước đó?

  3. Làm cách nào để đảm bảo tất cả các phụ thuộc của tôi tương thích với compileSdkVersion 23?

+0

Điều gì sẽ xảy ra nếu bạn biên dịch với 25 nhưng sử dụng thư viện hỗ trợ phiên bản 23? –

+1

Bạn nên đăng cây phụ thuộc dưới dạng văn bản. Đánh dấu nó và nhấn Ctrl-K để giữ nguyên định dạng. Phím tắt này thêm các khoảng trống cần thiết cho một khối mã. –

+2

Hãy nhớ rằng 'compileSdkVersion' không thay đổi hành vi ứng dụng của bạn - đó sẽ là' targetSdkVersion' như được giải thích trong [bài đăng trên blog này] (https://medium.com/google-developers/picking-your-compilesdkversion- minsdkversion-targetsdkversion-a098a0341ebd). Bạn nên luôn biên dịch với phiên bản Android mới nhất, ngay cả khi bạn không nhắm mục tiêu nó. – ianhanniballake

Trả lời

6

Specifically, when the tree says "com.android.support:support-v4:23.3.0 -> 24.0.0", what does it mean?

Nó có nghĩa là một thư viện có com.android.support:support-v4:23.3.0 dipendency như lồng nhau nhưng bạn chỉ sử dụng khác và phiên bản cao hơn của sự phụ thuộc tương tự, trong trường hợp này com.android.support:support-v4:24.0.0.
Mặt khác dự án của bạn đang sử dụng các com.android.support:support-v4:24.0.0

why didn't this build.gradle throw errors prior to the Android Studio, Gradle plugin, and buildToolsVersion update mentioned earlier?

Bởi vì bạn đã được cập nhật các plugin Gradle lên 3,3 có loại séc.

How can I make sure all my dependencies are compatible with compileSdkVersion 23?

Rất khó có.
Cách duy nhất là để rà soát tất cả phụ thuộc, nhưng tôi đề nghị bạn sử dụng:

compileSdkVersion 25 
targetSdkVersion 23 

Nói chung nó là một ý tưởng tốt để sử dụng phiên bản mới nhất của buildToolsVersion trong mọi trường hợp, một cách độc lập bởi các phiên bản của thư viện hỗ trợ sử dụng .

Hơn nữa. Chúng tôi khuyên bạn luôn luôn biên dịch với SDK mới nhất. Điều đó có nghĩa là hôm nay bạn nên sử dụng compileSdkVersion 25.

+0

được, rất thú vị. Tôi đã chơi xung quanh với các phụ thuộc khác của tôi và có vẻ như các mục nhập com.google.android.gms và com.google.firebase là các mục nhập trong phiên bản thư viện hỗ trợ 24.x.x; thả các mục com.google.android.gms và com.google.firebase xuống phiên bản 9.0.0 cho phép hỗ trợ lib 23.x.x và compileSdkVersion 23 hoạt động mà không có ký hiệu lỗi. – CCJ

+0

liên quan đến nhận xét của bạn về việc biên dịch với SDK mới nhất, liệu việc sử dụng các API mới có nguy cơ không có sẵn trong cấp API mục tiêu của tôi có rủi ro không? Lint có thể bắt chúng, nhưng sẽ không có lỗi biên dịch và tôi khá chắc chắn sẽ có lỗi thời gian chạy ... Lợi ích của việc sử dụng một compileSdkVersion cao hơn targetSdkVersion của bạn là gì? Bạn có tham chiếu chính thức đề xuất rằng nhà phát triển luôn biên dịch với phiên bản SDK mới nhất không? – CCJ

+0

@CCJ Kiểm tra liên kết này: https://medium.com/google-developers/picking-your-compilesdkversion-minsdkversion-targetsdkversion-a098a0341ebd#.23i9y3s6f. Tác giả là người ủng hộ nhà phát triển Android tại Google: Cụ thể, hãy kiểm tra phần: "Cần nhấn mạnh rằng việc thay đổi compileSdkVersion của bạn không thay đổi hành vi thời gian chạy. Trong khi biên dịch/lỗi trình biên dịch mới có thể xuất hiện khi thay đổi compileSdkVersion của bạn, compileSdkVersion của bạn không được bao gồm trong APK của bạn: nó hoàn toàn được sử dụng trong thời gian biên dịch " –

Các vấn đề liên quan