2013-04-18 17 views
5

Il processo di generazione di Android genera stub Java per ciascuna delle classi nel android.jar, e li memorizza nella seguente directory (?):Come vengono generati i file .java nella directory android_stubs_current_intermediates?

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

Per esempio, la sottodirectory java/lang/ della directory di cui sopra contiene i file .java corrispondenti alle classi java.lang. *, e la sottodirectory `android/app/'contiene i file .java corrispondenti alle classi android.app. *. Questi file .java non contengono codice reale, ma solo firme con corpi fittizi.

Suppongo che quei file .java vengano generati dal codice sorgente corrente utilizzando uno strumento. La mia domanda è, quale è questo strumento ed è utilizzabile al di fuori del processo di build di Android?

Desidero utilizzare questo strumento per generare stub per classi Java non Android.

+0

http://stackoverflow.com/questions/1264530/how-to-generate-stub-in-android?rq=1 potrebbero avere alcune risposte, non so se non ne so molto. –

+0

La mia domanda è diversa. Per stub, in particolare intendo i file .java che sono prodotti nella suddetta directory come parte del processo di build di Android. –

risposta

9

Gli "stub" qui sono lo stub dell'API framework generato eseguendo lo strumento javadoc.

Nella maggior parte dei casi, quando si parla di file stub in Android, si intende il file java generato dallo strumento aidl. Per esempio vedi How to generate stub in android? - Stack Overflow

In particolare, il sistema di generazione di Android contiene un makefile chiamato droiddoc.mk che può essere usato per generare la documentazione, stub API Java e file XML API, che in realtà chiama javadoc.
droiddoc.mk è sotto build/core. In build/core/config.mk c'è una variabile denominata BUILD_DROIDDOC per semplificare l'inclusione dello droiddoc.mk.

sguardo al droiddoc.mk, chiama 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] 

Non c'è nulla di destra stub? Non ti preoccupare, notare che c'è una variabile PRIVATE_DROIDDOC_OPTIONS e

PRIVATE_DROIDDOC_OPTIONS := $(LOCAL_DROIDDOC_OPTIONS) 

Molti file Android.mk in AOSP, ad esempio, la framework/base/Android.mk, contiene il include $(BUILD_DROIDDOC) per generare documenti. In framework/base/Android.mk, c'è un pezzo di codice:

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) 

Il LOCAL_DROIDDOC_OPTIONS contiene un'opzione -stubs. E infine verrà inserito nel comando javadoc utilizzato da droiddoc.mk.

Tuttavia, potremmo notare che javadoc non contiene alcuna opzione come -stubs. La chiave è che è possibile personalizzare il contenuto e il formato dell'output dello strumento Javadoc utilizzando doclet. Lo strumento Javadoc ha un doclet predefinito "incorporato", chiamato doclet standard, che genera documentazione API in formato HTML. È possibile modificare o sottoclasse il doclet standard o scrivere il proprio doclet per generare HTML, XML, MIF, RTF o qualsiasi formato di output desiderato.

Possiamo usare l'opzione -doclet per specificare il nostro doclet personalizzato. E il comando javadoc in droiddoc.mk usa lo -doclet com.google.doclava.Doclava. Quel doclet riceve l'opzione -stubs.

Guardate l'attuazione Doclava sotto 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); 
    } 
    } 

Riceve l'opzione -stubs. Ed ecco come processa lo stubsDir.

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

e tracciare l'attuazione del Stubs.writeStubsAndApi, si può capire perché il contenuto dei file stub sono così.

È anche possibile scrivere i propri file java e generare i propri stub come i casi di test con build/tools/droiddoc/test.

+0

Grazie per aver risposto! I file AIDL hanno uno [scopo diverso] (http://developer.android.com/guide/components/aidl.html). Non penso che gli stub siano generati dai file AIDL. Ad esempio, si noti che l'elenco precedente non include i file AIDL per classi come Attività, Servizio o classi di librerie standard di Java come java.lang.Object (che appaiono tutte in android.jar). –

+0

Allora cosa stai chiedendo esattamente? Il file stub non significa XXX.jar o java.lang.Object o qualsiasi file di servizio attività in generale. Nella maggior parte dei casi, quando parliamo di file stub in Android, intendiamo il file java generato dallo strumento aidl. Stai chiedendo come viene generato android.jar? – StarPinkER

+0

Sì (in un modo). Sembra che android.jar sia compilato da file .java che si trovano nella directory out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/src /. Sto chiedendo come vengono generati quei file .java. –

Problemi correlati