Как.java файлы в android заглушки текущий промежуточный каталог генерируется?
Процесс сборки Android генерирует(?) Заглушки Java для каждого из классов в android.jar, и хранит их в следующем каталоге:
./out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/src/
Например, подкаталог java/lang/
указанного выше каталога содержит .java файлы, соответствующие java.яз..* классы, и подкаталог "android/app/" содержит .java файлы, соответствующие android.апп.* учебные занятия. Эти.java-файлы не содержат реального кода, а только подписи с фиктивными телами.
Я предполагаю, что вот те .файлы java создаются из фактического исходного кода с помощью инструмента. Мой вопрос в том, что это за инструмент, и можно ли его использовать вне процесса сборки Android?
Я хочу использовать этот инструмент для создания заглушек для классов Java, отличных от Android.
1 ответ:
Заглушки здесь-это заглушки API фреймворка, созданные при запуске инструмента javadoc.
В большинстве случаев, когда мы говорим о stub-файле в Android, мы имеем в виду файл java, созданный инструментом aidl. Например, смотрите Как создать stub в android? - Переполнение Стека
В частности, система сборки Android содержит файл makefile с именем
droiddoc.mk
, который может использоваться для создания документации, заглушек API java и xml-файлов API, которые фактически вызывают документация Javadoc.droiddoc.mk
находится подbuild/core
. Вbuild/core/config.mk
есть переменная с именемBUILD_DROIDDOC
, чтобы облегчить включениеdroiddoc.mk
.Посмотрите на
droiddoc.mk
, он вызывает 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 $@
Нет ничего о заглушке, верно? Не волнуйтесь, обратите внимание, что есть переменная
PRIVATE_DROIDDOC_OPTIONS
иPRIVATE_DROIDDOC_OPTIONS := $(LOCAL_DROIDDOC_OPTIONS)
Многие Android.mk файлы в AOSP, например
framework/base/Android.mk
, содержатinclude $(BUILD_DROIDDOC)
для создания документов. Вframework/base/Android.mk
есть фрагмент кода: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
содержит параметр-stubs
. И это наконец-то введет в команду javadoc, используемую droiddoc.mk.Однако, мы можем заметить, что javadoc не содержит никакой опции, подобной
-stubs
. Ключ заключается в том, что вы можете настроить содержимое и формат выходных данных инструмента Javadoc с помощью доклетов. Инструмент Javadoc имеет по умолчанию "встроенный" doclet, называемый стандартным doclet, который генерирует документацию API в формате HTML. Вы можете изменить или подкласс стандартного doclet, или написать свой собственный doclet для создания HTML, XML, MIF, RTF или какой бы формат вывода вы ни выбрали.Мы можем использовать опцию
-doclet
для указания нашего настроенного doclet. И команда javadoc в droiddoc.mk используйте-doclet com.google.doclava.Doclava
. Этот Доклет получает опцию-stubs
.Посмотрите на реализацию Doclava под
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); } }
Он получает опцию-stubs. А вот как он обрабатывает стубсдир.
// Stubs if (stubsDir != null || apiFile != null || proguardFile != null) { Stubs.writeStubsAndApi(stubsDir, apiFile, proguardFile, stubPackages); }
И проследите реализацию
Stubs.writeStubsAndApi
, Вы можете увидеть, почему содержимое в заглушках файлов таково.Вы даже можете написать свои собственные файлы java и генерировать заглушки, как в тестовых случаях под
build/tools/droiddoc/test
.