2013-04-18 10 views
5

Das Android-Build-Prozess erzeugt Java Stubs für jede der Klassen in der android.jar und speichert sie im folgenden Verzeichnis (?):Wie werden .java-Dateien im Verzeichnis android_stubs_current_intermediates generiert?

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

Zum Beispiel das Unterverzeichnis java/lang/ des oben genannten Verzeichnis enthält .java-Dateien, die java.lang. * -Klassen entsprechen, und das Unterverzeichnis `android/app/'enthält .java-Dateien, die android.app. * -Klassen entsprechen. Diese .java-Dateien enthalten keinen tatsächlichen Code, sondern nur Signaturen mit Dummy-Körpern.

Ich gehe davon aus, dass diese .java-Dateien aus dem eigentlichen Quellcode mit einem Werkzeug generiert werden. Meine Frage ist, welches ist dieses Tool, und ist es außerhalb des Android-Build-Prozesses nutzbar?

Ich möchte dieses Tool verwenden, um Stubs für Nicht-Android-Java-Klassen zu generieren.

+0

http://stackoverflow.com/questions/1264530/how-to-generate-stub-in-android?rq=1 kann einige Antworten haben, nicht sicher, obwohl ich nicht viel darüber weiß. –

+0

Meine Frage ist anders. Mit Stubs meine ich speziell die .java-Dateien, die im oben genannten Verzeichnis als Teil des Build-Prozesses von Android produziert werden. –

Antwort

9

Die "Stubs" sind hier der Framework-API-Stub, der beim Ausführen von javadoc tool generiert wird.

In den meisten Fällen, wenn wir über Stub-Datei in Android sprechen, meinen wir die Java-Datei, die von aidl tool generiert wird. Zum Beispiel How to generate stub in android? - Stack Overflow

Insbesondere sehen, das Android-Build-System enthält ein Makefile droiddoc.mk genannt, die verwendet werden können, um zu generieren Dokumentation, Java API Stubs und API XML-Dateien, die tatsächlich ruft javadoc.
droiddoc.mk ist unter build/core. In build/core/config.mk gibt es eine Variable mit dem Namen BUILD_DROIDDOC, um es einfacher zu machen, die droiddoc.mk aufzunehmen.

Blick auf die droiddoc.mk, ruft 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] 

Es gibt nichts über den Stub richtig? Keine Sorge, feststellen, dass es eine ist PRIVATE_DROIDDOC_OPTIONS variabel und

PRIVATE_DROIDDOC_OPTIONS := $(LOCAL_DROIDDOC_OPTIONS) 

Viele Android.mk Dateien in AOSP, zum Beispiel der framework/base/Android.mk, enthält die include $(BUILD_DROIDDOC) zu docs zu erzeugen. In framework/base/Android.mk gibt es ein Stück Code:

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) 

Die LOCAL_DROIDDOC_OPTIONS enthält eine -stubs Option. Und es wird schließlich in den Javadoc-Befehl von droiddoc.mk verwendet werden.

Allerdings können wir feststellen, dass das Javadoc keine Option wie -stubs enthält. Der Schlüssel ist, dass Sie den Inhalt und das Format der Ausgabe des Javadoc-Tools mithilfe von Doclets anpassen können. Das Javadoc-Tool verfügt über ein standardmäßiges "integriertes" Doclet, das so genannte Standard-Doclet, das HTML-formatierte API-Dokumentation generiert. Sie können das Standard-Doclet ändern oder eine Unterklasse erstellen oder ein eigenes Doclet schreiben, um HTML, XML, MIF, RTF oder ein anderes gewünschtes Ausgabeformat zu generieren.

Wir können die Option -doclet verwenden, um unser angepasstes Doclet anzugeben. Und der Javadoc-Befehl in droiddoc.mk verwendet die -doclet com.google.doclava.Doclava. Dieses Doclet erhält die Option -stubs.

Blick auf die Doclava Implementierung unter 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); 
    } 
    } 

Es empfängt die -stubs Option. Und hier ist, wie es das StubsDir verarbeitet.

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

und verfolgt die Umsetzung der Stubs.writeStubsAndApi, können Sie sehen, warum der Inhalt in den Stub-Dateien so sind.

Sie können sogar Ihre eigenen Java-Dateien schreiben und Ihre Stubs erzeugen wie die Testfälle unter build/tools/droiddoc/test.

+0

Danke für die Antwort! AIDL-Dateien haben einen [anderen Zweck] (http://developer.android.com/guide/components/aidl.html). Ich glaube nicht, dass Stubs aus den AIDL-Dateien generiert werden. Beachten Sie beispielsweise, dass die obige Liste keine AIDL-Dateien für Klassen wie Activity, Service oder Javas Standardbibliotheksklassen wie java.lang.Object enthält (die alle in android.jar angezeigt werden). –

+0

Was genau fragen Sie dann? Die Stub-Datei bedeutet nicht das XXX.jar oder java.lang.Object oder irgendeine Aktivitätsdienstdatei im Allgemeinen. In den meisten Fällen, wenn wir über Stub-Datei in Android sprechen, meinen wir die Java-Datei, die von aidl tool erzeugt wird. Fragen Sie, wie android.jar generiert wird? – StarPinkER

+0

Ja (in gewisser Weise). Anscheinend wird android.jar aus .java-Dateien kompiliert, die sich im Verzeichnis out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/src/befinden. Ich frage, wie diese .java-Dateien generiert werden. –