2014-10-07 24 views
29

Tôi có một dự án Android dựa trên gradle với 4 mô-đun con - hai thư viện và hai ứng dụng. Tôi đã cố gắng đơn giản hóa các tệp build.gradle của từng mô-đun con bằng cách di chuyển một số mã/cấu hình được chia sẻ đến tệp build.gradle cấp cao nhất và sử dụng subprojects {} để làm cho mã đó có sẵn cho từng mô-đun con.Không thể tìm thấy phương thức android() cho các đối số khi xây dựng dự án Android từ gradle

cấu trúc

Các hệ thống tập tin trông như thế này:

Root 
|- App1/ 
|- App2/ 
|- Lib1/ 
|- Lib2/ 
|- build.gradle 
|- settings.gradle 

Vấn đề là nếu tôi thêm một phần android {} cho các tiểu dự án sau đó nhiệm vụ gradle thất bại. Ví dụ, đây là top-level tập tin của tôi build.gradle:

subprojects { project -> 
    android { 
    buildToolsVersion "20.0.0" 
    } 
} 

Chạy lợi nhuận gradle này:

gì đã xảy ra: Một vấn đề xảy ra đánh giá dự án root 'android'. Không thể tìm thấy phương thức android() cho đối số [build_7dngpra6ldok366maq0on77r7e $ _run_closure3_closure5 @ 43d95624] trên dự án gốc 'android'.

Tôi đã tìm kiếm cho bài viết tương tự và một số người đề nghị thêm dòng apply plugin: 'android' cho từng tiểu dự án nhằm phơi bày các thiếu android() phương pháp mà gradle được khiếu nại. Tuy nhiên, giải pháp đó không hiệu quả với tôi bởi vì nó có hiệu quả sẽ thêm dòng đó vào dự án thư viện, thay vào đó yêu cầu apply plugin: 'android-library'.

Có cách nào để sử dụng android {} bên trong số subprojects {} khi bạn có ứng dụng và thư viện trong cùng một dự án không?

Trả lời

31

Đây thực sự là hạn chế về cách plugin android-gradle được cấu trúc và có một giải pháp được ghi lại tại the android tools website.

Nếu bạn có nhiều mô-đun Android, bạn có thể muốn tránh đặt giá trị giống nhau theo cách thủ công trong tất cả các mô-đun. Bởi vì bạn có thể có một kết hợp của android và android-thư viện dự án bạn không thể áp dụng các plugin thông qua một tiểu dự án đóng cửa.

Các giải pháp được đề xuất là:

... trong build.gradle dự án gốc của:

ext { 
    compileSdkVersion = 19 
    buildToolsVersion = "19.0.1" 
} 

trong tất cả các mô-đun android:

android { 
    compileSdkVersion rootProject.ext.compileSdkVersion 
    buildToolsVersion rootProject.ext.buildToolsVersion 
} 

.. .

Tôi nghĩ rằng tôi nhận thấy rằng điều này không hoạt động trên các phiên bản cũ hơn của gradle (Tôi đã cố gắng với 1,10 và có một lỗi). Với Gradle 2.1, điều này dường như hoạt động chính xác.

+1

Tôi đã thực hiện thay đổi này ở chế độ gradle vẫn lỗi tương tự Tôi nhận được – AdiAtAnd

+0

làm việc cho tôi, đảm bảo bạn chỉnh sửa tệp build.gradle chính xác (có 2, kiểm tra các thư mục) – vaskort

2

Có một vấn đề nhỏ với câu trả lời của người dùng4118620 ... ít nhất là trên Gradle 2.10 khi tôi sử dụng nó. Để có khóa hiển thị cho các mô-đun android.Chúng ta cần phải đặt ext thuộc phạm vi tiểu dự án

Tại gốc tập tin gradle bạn cần phải thêm sau

subprojects { 
    ext{ 
    <android_compile_sdk_key> = <sdk_value> 
    <android_build_key> = <build_value> 
    } 
} 

Tại mỗi submodules sau đó bạn chỉ cần làm theo những gì ông đã đề cập trước

android { 
    compileSdkVersion <android_compile_sdk_key> 
    buildToolsVersion <android_build_key> 
} 

Bạn có thể tìm thấy tài liệu về việc xây dựng đa nhiệm gradle trên liên kết sau

https://docs.gradle.org/current/userguide/multi_project_builds.html#sub:adding_specific_behavior

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