2013-04-18 22 views
5

Android oluşturma işlemi aşağıdaki dizinde Java android.jar sınıfların her biri için koçanları ve saklar oluşturur: Örneğinandroid_stubs_current_intermediates dizinindeki .java dosyaları nasıl oluşturulur? (?)

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

yukarıda dizinin alt dizin java/lang/ java.lang. * sınıflarına karşılık gelen .java dosyalarını içerir ve alt dizini android/app/'android.app. * sınıflarına karşılık gelen .java dosyalarını içerir. Bu .java dosyaları gerçek kodu içermez, ancak kukla gövdelerle sadece imzalar.

Bu .java dosyalarının bir araç kullanarak gerçek kaynak kodundan üretildiğini kabul ediyorum. Sorum şu, bu araç hangisi, ve Android oluşturma sürecinin dışında kullanılabilir mi?

Android olmayan sınıflar için stub oluşturmak için bu aracı kullanmak istiyorum.

+0

http://stackoverflow.com/questions/1264530/how-to-generate-stub-in-android?rq=1 Bazı cevaplar olabilir, emin değilim bu konuda çok fazla bilmiyorum. –

+0

Sorumum farklı. Saplamalarla, özellikle Android'in yapım sürecinin bir parçası olarak yukarıda belirtilen dizinde üretilen .java dosyalarını kastediyorum. –

cevap

9

Burada "saplamalar", javadoc aracını çalıştırarak oluşturulan çerçeve API'sıdır.

Çoğu durumda, Android'de stub dosyası hakkında konuştuğumuzda, yardım aracı tarafından oluşturulan java dosyasını kastediyoruz. Örneğin Özellikle How to generate stub in android? - Stack Overflow

görüntülemek için Android inşa sistemi aslında javadoc çağıran, dokümantasyon, java API koçanları ve API xml dosyaları oluşturmak için kullanılabilecek droiddoc.mk denilen bir makefile içerir.
droiddoc.mk, build/core'un altındadır. build/core/config.mk'da droiddoc.mk'u daha kolay dahil etmek için BUILD_DROIDDOC adlı bir değişken vardır.

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] 

saplama hakkına ilişkin hiçbir şey yoktur: droiddoc.mk de

Bak, bu javadoc çağırır? Merak etmeyin, örneğin framework/base/Android.mk için, dokümanlar üretmek için include $(BUILD_DROIDDOC) içerirler, AOSP içinde

PRIVATE_DROIDDOC_OPTIONS := $(LOCAL_DROIDDOC_OPTIONS) 

Birçok Android.mk dosyaları bir PRIVATE_DROIDDOC_OPTIONS değişken olduğunu fark ve

.

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) 

LOCAL_DROIDDOC_OPTIONS bir -stubs seçeneği içerir: framework/base/Android.mk yılında kodu parçasıdır yoktur. Ve sonunda droiddoc.mk tarafından kullanılan javadoc komutuna girecektir. Ancak, javadoc'un -stubs gibi herhangi bir seçenek içermediğini fark edebiliriz. Anahtar, docad'ları kullanarak Javadoc aracının çıktısının içeriğini ve biçimini özelleştirebilmenizdir. Javadoc aracında standart biçimlendirilmiş olarak adlandırılan ve HTML formatlı API belgelerini oluşturan varsayılan "yerleşik" bir belge vardır. Standart doclet'i değiştirebilir veya alt sınıflara yazabilir veya HTML, XML, MIF, RTF veya istediğiniz çıktı biçimini oluşturmak için kendi doclet'inizi yazabilirsiniz. Özelleştirilmiş dokümanı belirtmek için -doclet seçeneğini kullanabiliriz.

Ve droiddoc.mk'deki javadoc komutu -doclet com.google.doclava.Doclava'u kullanır. Bu doclet, -stubs seçeneğini alır. 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); 
    } 
    } 

Bu -stubs seçeneği alır altında Doclava uygulanmasını

bak. Ve işte işte bu, işte nasıl işliyor? saplama dosyalarında içeriği böyledir neden

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

Ve Stubs.writeStubsAndApi uygulanmasını izlemek görebilirsiniz.

Kendi java dosyalarınızı yazabilir ve build/tools/droiddoc/test altındaki test durumları gibi uzantılarınızı oluşturabilirsiniz.

+0

Yanıtladığınız için teşekkür ederiz! AIDL dosyalarının [farklı bir amacı] vardır (http://developer.android.com/guide/components/aidl.html). AQUL dosyalarından bu uzantıların üretildiğini düşünmüyorum. Örneğin, yukarıdaki listenin, Etkinlik, Hizmet veya Java'nın java.lang.Object gibi standart kitaplık sınıfları (tümü android.jar'da görünür) gibi sınıflar için AIDL dosyaları içermediğine dikkat edin. –

+0

O zaman tam olarak ne soruyorsunuz? Saplama dosyası, XXX.jar veya java.lang.Object veya genel olarak herhangi bir etkinlik hizmeti dosyası anlamına gelmez. Çoğu durumda, Android'de stub dosyası hakkında konuştuğumuzda, yardım aracı tarafından oluşturulan java dosyasını kastediyoruz. Android.jar'ın nasıl oluşturulduğunu soruyor musunuz? – StarPinkER

+0

Evet (bir bakıma). Görünüşe göre android.jar,/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/src/dizinindeki .java dosyalarından derlenmiştir. Bu .java dosyalarının nasıl oluşturulduğunu soruyorum. –

İlgili konular