Как.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 5

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.