2013-04-18 36 views
5

Quá trình xây dựng Android tạo ra cuống Java cho mỗi lớp trong android.jar, và lưu trữ chúng trong thư mục sau (?):Các tệp .java trong thư mục android_stubs_current_intermediates được tạo như thế nào?

./out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/src/

Ví dụ, thư mục con của thư mục java/lang/ trên chứa các tệp .java tương ứng với các lớp java.lang. * và thư mục con `android/app/'chứa các tệp .java tương ứng với các lớp android.app. *. Các tệp .java này không chứa mã thực tế, nhưng chỉ là chữ ký với các thân giả.

Tôi giả định rằng các tệp .java đó được tạo từ mã nguồn thực tế bằng cách sử dụng công cụ. Câu hỏi của tôi là, công cụ này là gì và có thể sử dụng được bên ngoài quy trình xây dựng Android không?

Tôi muốn sử dụng công cụ đó để tạo sơ khai cho các lớp Java không phải của Android.

+0

http://stackoverflow.com/questions/1264530/how-to-generate-stub-in-android?rq=1 có thể có một số câu trả lời, không chắc chắn mặc dù tôi không biết nhiều về nó. –

+0

Câu hỏi của tôi khác. Bởi stubs, tôi đặc biệt có nghĩa là các tập tin .java được sản xuất trong thư mục nói trên như là một phần của quá trình xây dựng của Android. –

Trả lời

9

"Sơ khai" ở đây là sơ đồ API khung được tạo bằng cách chạy công cụ javadoc.

Trong hầu hết các trường hợp, khi chúng ta nói về tệp sơ khai trong Android, chúng tôi có nghĩa là tệp java được tạo bởi công cụ aidl. Ví dụ thấy How to generate stub in android? - Stack Overflow

Đặc biệt, xây dựng hệ thống Android chứa một makefile gọi droiddoc.mk có thể được sử dụng để tạo ra tài liệu, khai java API và các file xml API, mà thực sự gọi javadoc.
droiddoc.mk là dưới build/core. Trong số build/core/config.mk, có một biến có tên là BUILD_DROIDDOC để giúp dễ dàng bao gồm droiddoc.mk.

Nhìn vào droiddoc.mk, nó gọi javadoc:

javadoc \ 
      \@$(PRIVATE_SRC_LIST_FILE) \ 
      -J-Xmx1280m \ 
      $(PRIVATE_PROFILING_OPTIONS) \ 
      -quiet \ 
      -doclet com.google.doclava.Doclava \ 
      -docletpath $(PRIVATE_DOCLETPATH) \ 
      -templatedir $(PRIVATE_CUSTOM_TEMPLATE_DIR) \ 
      $(PRIVATE_DROIDDOC_HTML_DIR) \ 
      $(addprefix -bootclasspath ,$(PRIVATE_BOOTCLASSPATH)) \ 
      $(addprefix -classpath ,$(PRIVATE_CLASSPATH)) \ 
      -sourcepath $(PRIVATE_SOURCE_PATH)$(addprefix :,$(PRIVATE_CLASSPATH)) \ 
      -d $(PRIVATE_OUT_DIR) \ 
      $(PRIVATE_CURRENT_BUILD) $(PRIVATE_CURRENT_TIME) \ 
      $(PRIVATE_DROIDDOC_OPTIONS) \ 
    && touch -f [email protected] 

Có gì về stub đúng là? Đừng lo lắng, hãy chú ý rằng có một biến PRIVATE_DROIDDOC_OPTIONS, và

PRIVATE_DROIDDOC_OPTIONS := $(LOCAL_DROIDDOC_OPTIONS) 

Nhiều file Android.mk trong AOSP, ví dụ như framework/base/Android.mk, chứa include $(BUILD_DROIDDOC) để tạo ra tài liệu. Trong framework/base/Android.mk, có một đoạn mã:

LOCAL_DROIDDOC_OPTIONS:=\ 
       $(framework_docs_LOCAL_DROIDDOC_OPTIONS) \ 
       -stubs $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android_stubs_current_intermediates/src \ 
       -api $(INTERNAL_PLATFORM_API_FILE) \ 
       -nodocs 

LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk 

LOCAL_UNINSTALLABLE_MODULE := true 

include $(BUILD_DROIDDOC) 

Các LOCAL_DROIDDOC_OPTIONS chứa một tùy chọn -stubs. Và cuối cùng nó sẽ được đưa vào lệnh javadoc được sử dụng bởi droiddoc.mk.

Tuy nhiên, chúng tôi có thể nhận thấy rằng javadoc không chứa bất kỳ tùy chọn nào như -stubs. Điều quan trọng là bạn có thể tùy chỉnh nội dung và định dạng của đầu ra của công cụ Javadoc bằng cách sử dụng các doclet. Công cụ Javadoc có một doclet "built-in" mặc định, được gọi là doclet chuẩn, tạo ra tài liệu API định dạng HTML. Bạn có thể sửa đổi hoặc phân lớp doclet chuẩn hoặc viết doclet của riêng bạn để tạo HTML, XML, MIF, RTF hoặc bất kỳ định dạng đầu ra nào bạn muốn.

Chúng tôi có thể sử dụng tùy chọn -doclet để chỉ định doclet tùy chỉnh của chúng tôi. Và lệnh javadoc trong droiddoc.mk sử dụng -doclet com.google.doclava.Doclava. Tài liệu đó nhận được tùy chọn -stubs.

Nhìn vào thực hiện Doclava dưới external/doclava/src/com/google/doclava/Doclava.java

else if (a[0].equals("-stubs")) { 
    stubsDir = a[1]; 
    } else if (a[0].equals("-stubpackages")) { 
    stubPackages = new HashSet<String>(); 
    for (String pkg : a[1].split(":")) { 
     stubPackages.add(pkg); 
    } 
    } 

Nó nhận được tùy chọn -stubs. Và đây là cách nó xử lý stubsDir.

// Stubs 
if (stubsDir != null || apiFile != null || proguardFile != null) { 
    Stubs.writeStubsAndApi(stubsDir, apiFile, proguardFile, stubPackages); 
} 

Và theo dõi việc triển khai Stubs.writeStubsAndApi, bạn có thể thấy lý do nội dung trong tệp gốc giống như vậy.

Bạn thậm chí có thể viết các tệp java của riêng mình và tạo các nhánh của bạn giống như trường hợp kiểm tra theo số build/tools/droiddoc/test.

+0

Cảm ơn bạn đã trả lời! Tệp AIDL có [mục đích khác] (http://developer.android.com/guide/components/aidl.html). Tôi không nghĩ rằng stubs được tạo ra từ các tập tin AIDL. Ví dụ, lưu ý rằng danh sách trên không bao gồm các tệp AIDL cho các lớp như các lớp thư viện chuẩn, hoạt động hoặc các lớp thư viện chuẩn của Java như java.lang.Object (tất cả đều xuất hiện trong android.jar). –

+0

Vậy chính xác thì bạn đang hỏi gì? Tệp stub không có nghĩa là tệp XXX.jar hoặc java.lang.Object hoặc bất kỳ tệp dịch vụ hoạt động nào nói chung. Trong hầu hết các trường hợp, khi chúng ta nói về tệp stub trong Android, chúng tôi có nghĩa là tệp java được tạo bởi công cụ aidl. Bạn có hỏi về cách android.jar được tạo ra không? – StarPinkER

+0

Có (theo cách nào đó). Có vẻ như android.jar được biên dịch từ các tệp .java nằm trong thư mục out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/src /. Tôi hỏi làm thế nào những tập tin .java được tạo ra. –