2017-06-01 19 views
8

Tôi đang cố gắng có được hình ảnh tốt hơn về những gì xảy ra đằng sau hậu trường trong Android Studio khi tạo ứng dụng Android. Tôi đã được đọc trên Gradle, nhưng một điều tôi không thể tìm ra là làm thế nào để xem lệnh CLI tương ứng và các đối số được gọi bởi Gradle. Dường như nó được trừu tượng hóa và không được ghi vào Gradle Console hoặc Event Log.Làm cách nào tôi có thể xem lệnh CLI được thực thi bởi tác vụ Gradle trong Android Studio?

Gần nhất tôi đã nhận thấy những gì đang xảy ra bên trong Gradle là mã AOSP.

2.2.2 Nguồn:

https://android.googlesource.com/platform/tools/base/+/gradle_2.2.2/build-system/gradle-core/src/main/java/com/android/build/gradle/tasks

Mục tiêu

Tôi muốn để có thể nhìn thấy lệnh CLI tương ứng được tạo ra bởi các nhiệm vụ Gradle bên trong Android Studio.

sử dụng Case Ví dụ

Tôi muốn xem quá trình xây dựng Legacy Android trong chiều sâu. Điều này bao gồm việc thực hiện các bước sau:

Mã nguồn/Mã thư viện -> javac -> Java bytecode (.class) -> proguard -> bytecode (.class) -> dex -> DEX bytecode (.dex)

Ví dụ: tôi muốn xem lệnh javac tương ứng được gọi bởi AndroidJavaCompile. https://android.googlesource.com/platform/tools/base/+/gradle_2.2.2/build-system/gradle-core/src/main/java/com/android/build/gradle/tasks/factory/AndroidJavaCompile.java

Tôi sợ rằng cách duy nhất để làm điều này là xem trực tiếp thông qua mã nguồn hoặc thậm chí xây dựng trực tiếp từ nguồn.

Do siêng năng

tôi đã thực hiện khá nhiều tìm kiếm trên Google, blog Android, Google I/O cuộc đàm phán, sách Android, và nhiều hơn nữa. Tôi đã không thể tìm ra câu trả lời thẳng thắn.

Trả lời

4

Đó là không thể. Đơn giản, bởi vì hầu hết các nhiệm vụ Gradle không gọi các lệnh CLI.

Mỗi tệp xây dựng Gradle là một đoạn mã Groovy được thực hiện trong JVM cùng với API Gradle (viết bằng Java). Do đó, bạn có thể thực hiện bất kỳ tác vụ hoặc chức năng cấu hình nào trực tiếp trong bất kỳ ngôn ngữ JVM nào, từ đó hầu hết các plugin sử dụng thay vì thực thi các công cụ dòng lệnh. Tuy nhiên, điều này là có thể bằng cách sử dụng hoặc mở rộng nhiệm vụ Exec.

Bước biên dịch được xử lý bằng tác vụ AndroidJavaCompile, mở rộng nhiệm vụ phổ biến JavaCompile Gradle bằng một số kiểm tra phiên bản và tính năng Instant Run. Tuy nhiên, bạn không biết Gradle thực sự biên soạn các tệp .java như thế nào. Trong internal source files cho nhiệm vụ JavaCompile của API Gradle, dường như có nhiều triển khai khác nhau (DaemonJavaCompiler, JdkJavaCompiler và thậm chí CommandLineJavaCompiler). Vì bạn có thể chỉ định CompilerOptions với nhiệm vụ của mình, Gradle dường như chọn trình biên dịch thực dựa trên các tùy chọn này.Xin lưu ý rằng ngay cả khi có CommandLineJavaCompiler, cũng có thể (và rất có thể), Gradle thích sử dụng gói javax.tools và triển khai JavaCompiler để biên dịch các tệp nguồn thay vì gọi một công cụ dòng lệnh.

Tôi cũng đã xem xét bước ProGuard trong quá trình tạo ví dụ của bạn: ProGuard có thể được sử dụng làm công cụ dòng lệnh, nơi bạn có thể chỉ định đối số để xác định cách thức hoạt động. Nhưng ProGuard cũng cung cấp một nhiệm vụ Gradle (ProGuardTask), thực hiện mà không cần gọi ProGuard từ dòng lệnh. Mã Java ProGuard sẽ được thực hiện trong JVM Gradle.

Như bạn có thể thấy, ngay cả khi mỗi nhiệm vụ Gradle có thể được thay thế bằng một (hoặc nhiều) lệnh CLI, Gradle không thực hiện các lệnh này. Thay vào đó, chức năng này được gọi trực tiếp trong JVM Gradle. Nếu bạn muốn hiểu rõ hơn, bạn có thể increase the Gradle log level. Việc triển khai tốt nhiệm vụ Gradle sẽ cung cấp tất cả thông tin cần thiết trong nhật ký.

+0

Cảm ơn bạn đã dành thời gian trả lời câu hỏi này! Khác với cấp độ đăng nhập Gradle đang được tăng lên, có cách khá đơn giản để gỡ lỗi các nhiệm vụ gradle nội bộ để xem những gì đang xảy ra? Tôi cho rằng nó không quá tầm thường. –

+0

Thành thật mà nói, tôi không bao giờ cố gắng gỡ lỗi mã nội bộ của Gradle và/hoặc các plugin của nó, bởi vì tôi chưa bao giờ có những vấn đề phức tạp như vậy. Điều này có liên quan đến bất kỳ vấn đề cụ thể nào không? –

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