2010-08-06 25 views
27

Tôi quan tâm đến việc tích hợp Scala (hoặc một số ngôn ngữ JVM không phải Java khác) vào nền tảng Android. Tôi không đề cập đến việc viết một ứng dụng Android với Scala, mà tôi đã làm sớm vào ngày, nhưng thực sự hooking vào quá trình xây dựng xây dựng cây nguồn nền tảng Android. Tôi tưởng tượng điều này sẽ là một vấn đề của hooking vào makefiles và như vậy. Có ai có cái nhìn sâu sắc về điều này?Làm thế nào để tích hợp Scala vào nền tảng Android cốt lõi?

Những gì tôi có cho đến nay: Nền tảng nguồn treefrom git: //android.git.kernel.org/platform/manifest.git xây dựng ở dạng nguyên sinh của nó, được hướng dẫn bởi "[Tải về và xây dựng Android của Google ] [1]"

  • build/lõi/combo/scalac.mk # Cấu hình biến biên dịch scala liên quan, bao gồm theo config.mk
  • định nghĩa thêm trong xây dựng/lõi/definitions.mk cho một all-subdir -scala-files và tất cả các tệp scala-dưới
  • Đã thêm định nghĩa trong định nghĩa.mk để tạo quy mô một tập tin như vậy mà họ có trong gói

Những gì còn lại:

  • Bao gồm scala-library.jar
  • Đảm bảo thay đổi để bootclasspath đã không bị phá vỡ bất cứ điều gì
  • Hình ra cách xử lý trường hợp các lớp scala phụ thuộc vào các lớp java và visa ngược
  • Làm sạch mã chính
  • Thử nghiệm!
  • Hình ra phải làm gì (trừ chỉ đăng chúng ở đây) với những thay đổi tôi đã thực hiện

Hình như tôi là gần đó !!!

Một số lưu ý từ quá khứ

mới nhất: Tôi đã tìm thấy nơi các tập tin nguồn Java được biên dịch! Trong định nghĩa.mk, xem 'define transform-java-to-classes.jar'. Ý tưởng mới nhất là viết định nghĩa biến đổi thành lớp và sau đó lưu trữ các lớp đó trực tiếp được đóng gói. Tôi sẽ gọi biến đổi-scala-to-class ngay trước bước này trong biến đổi-java-to-classes.jar. Hỗ trợ cho nhật thực và Cygwin bây giờ sẽ được giảm xuống vì nó clutters lên mã với cách giải quyết và do đó làm tăng cơ hội của tôi thất bại.

Quá trình xây dựng bắt đầu bằng phần mềm gốc Makefile running build/core/main.mk build/core/main.mk bao gồm build/core/config.mk bao gồm build/core/combo/javac.mk. HOST_JAVAC, TARGET_JAVAC và COMMON_JAVAC. COMMON_JAVAC là "lệnh trình biên dịch Java với các đối số chung", bởi giao diện của nó, hai biến còn lại nhận được các giá trị này theo mặc định, trừ khi trong một môi trường đặc biệt (openjdk hoặc eclipse). COMMON_JAVAC không được sử dụng bên ngoài tệp này. Hai cái còn lại chỉ được sử dụng trong build/core/definitions.mk.

xây dựng/core/java_library.mk (bao gồm bởi config.mk) dường như chỉ quan tâm đến việc xây dựng các lọ. Điều này nằm ngoài phạm vi chúng tôi quan tâm. Bất kỳ sự tương tác nào với các lọ đều giả định các tệp lớp mà giả định rằng chúng ta đã thành công trong việc xây dựng các tệp scala của chúng ta.

Có các kiểm tra trong main.mk liên quan đến phiên bản java. Chúng tôi sẽ bỏ qua những điều này và giả định rằng phiên bản scala của chúng tôi tương thích. Ngay bây giờ (trong combo/scalac.mk) Tôi đang sử dụng cùng một --target arg được sử dụng trong javac.mk. Điều này có lẽ nên được lưu trữ trong một biến.

main.mk cũng bao gồm bản dựng/lõi/định nghĩa.mk mà lần lượt xác định một số chức năng hữu ích. Một trong những chúng tôi quan tâm ở đây là tất cả-java-files-under và all-subdir-java-files. Sau này được sử dụng trong các tệp Android.mk để tìm tệp java. Trước đây được sử dụng trong việc thực hiện sau này. Tôi sẽ viết Scala tương đương với chúng.

Để tìm hiểu cách thức hoạt động của quy trình xây dựng, tôi hiện đang chạy với -n và những người khác. Tôi đã có ý tưởng này từ bài viết stackoverflow "[Công cụ gỡ lỗi makefiles] [2]". Tôi cũng đang điều tra gỡ lỗi với bản làm lại.

xây dựng/core/{config.mk, definitions.mk} cho chúng ta biết ánh sáng làm cho tệp/lệnh được sử dụng để làm những gì.

Là một cách có thể hack hỗ trợ trên cơ sở mỗi dự án, mã bổ sung có thể được thêm vào tệp Android.mk của dự án. Từ platform/build/core/build-system.html, chúng tôi đọc "Android.mk là tên chuẩn cho các đoạn makefile kiểm soát việc xây dựng một mô-đun nhất định. Chỉ thư mục trên cùng phải có tệp có tên" Makefile "." Bạn có thể tạo một mục tiêu mới như "scala-build" và chạy nó (tạo PackageName scala-build) trước khi tạo xong. Người ta có lẽ cũng có thể che giấu nó một cách lén lút trong một bài tập thay đổi, giảm thiểu sự cần thiết cho một mục tiêu được gọi một cách rõ ràng.

Một cách khác (xa hơn nhiều) là tấn công lệnh đang được sử dụng cho javac. Điều này được thiết lập trong build/core/combo/javac.mk. Android.mk của dự án của bạn sẽ phải bao gồm tệp * .scala trong LOCAL_SRC_FILES cùng với tệp * .java.

+0

Tôi sẽ hỏi về điều này trong danh sách gửi thư của tòa nhà android. https://groups.google.com/group/android-building –

Trả lời

7

Guys trên reddit nói, có một hướng dẫn về tích hợp Scala vào Android với ant here.

+0

Tôi sẽ thử tính năng này. Cảm ơn! – Octoberdan

+0

@Octoberdan nếu bạn có thể thông báo cho chủ đề này về tiến độ của bạn, điều đó sẽ thực sự tuyệt vời. – folone

+0

Tôi đã đi xa vào cuối tuần, nhưng vừa trở lại. Tôi sẽ không có thời gian để cho nó đi cho đến ngày mai. Tôi chắc chắn sẽ cho bạn biết! – Octoberdan

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