Как использовать внешнюю банку, такую ​​​​как библиотека jsoup, в java-файлах Android Framework [AOSP] (НЕ Android Studio или Java IDE)

Я хочу использовать библиотеку jsoup в проекте Android с открытым исходным кодом. Для этого я сделал две вещи:

Шаг 1:

  1. Сделал общий каталог jsoup следующим образом: [android]prebuilts/misc/common/jsoup/
  2. В эту папку jsoup я добавил jsoup-1.13.1.jar, загруженный с: https://jsoup.org/download
  3. В эту же папку jsoup я добавил еще один файл Android.mk {так как это имя и код ниже:}

    LOCAL_PATH := $(call my-dir)  
    include $(CLEAR_VARS)  
    LOCAL_MODULE := jsoup
    LOCAL_MODULE_TAGS := optional
    LOCAL_SRC_FILES := jsoup-1.13.1.jar
    LOCAL_MODULE_CLASS := JAVA_LIBRARIES
    LOCAL_MODULE_SUFFIX := $(COMMON_JAVA_PACKAGE_SUFFIX)
    LOCAL_DEX_PREOPT := false
    include $(BUILD_PREBUILT)

Шаг 2:

  1. Перейдите к другому файлу make следующим образом: [android]/frameworks/base/Android.mk
  2. В этот файл Android.mk я добавил следующую строку, показанную ниже (после установки переменной LOCAL_JAVA_LIBRARIES): LOCAL_STATIC_JAVA_LIBRARIES += jsoup

Проблема:

  1. Я добавил файл sample.java следующим образом: [android]frameworks/base/services/core/java/com/android/server/am/sample.java
  2. В этом файле sample.java у меня есть операторы импорта следующим образом:
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.select.Elements;
  1. Когда я создаю весь этот модифицированный код Android, я получаю следующую ошибку, и сборка завершается ошибкой:
frameworks/base/services/core/java/com/android/server/am/sample.java:48: error: package org.jsoup does not exist  
frameworks/base/services/core/java/com/android/server/am/sample.java:49: error: package org.jsoup.nodes does not exist  
frameworks/base/services/core/java/com/android/server/am/sample.java:50: error: package org.jsoup.select does not exist
  1. Я даже пытался использовать метод с упоминанием Android.bp вместо Android.mk, но та же ошибка сборки.
  2. Также я запутался в именовании файла jar, поскольку оператор импорта включает org.jsoup... но сам файл jar - это просто jsoup. (Нужно ли мне изменить оператор импорта, например import jsoup... или изменить имя файла jar на org.jsoup...)
  3. Любой другой метод, кроме Android.mk или Android.bp, также вполне приемлем.

Пожалуйста, я понятия не имею о включении внешних JAR-файлов в AOSP. В противном случае код отлично работает локально в IntelliJ IDE Java. Любая помощь приветствуется. Заранее спасибо.


person Aditya Gupta    schedule 31.10.2020    source источник


Ответы (2)


Вы можете основывать свое решение на какой-либо другой банке, уже добавленной в AOSP.
Например, см. ZXING Android.bp библиотеки в external/zxing/:

java_import {
    name: "zxing-core-1.7",
    host_supported: true,
    installable: false,
    jars: ["core.jar"],
}

Затем посмотрите использование на другом Makefile: :

LOCAL_STATIC_JAVA_LIBRARIES := \
    androidx-constraintlayout_constraintlayout-solver \
    androidx.lifecycle_lifecycle-runtime \
    androidx.lifecycle_lifecycle-extensions \
    guava \
    jsr305 \
    carsettings-contextual-card-protos-lite \
    carsettings-log-bridge-protos-lite \
    carsettings-logtags \
    statslog-settings \
    zxing-core-1.7

Наконец, судя по пути файла, который вы добавляете frameworks/base/services/core/java/com/android/server/am/sample.java, вы добавляете библиотеку не в тот make-файл.

Тот, который вы изменили (frameworks/base/Android.mk), предназначен для создания framework.jar, а вы пытаетесь добавить класс в services.jar.

Правильный make-файл для изменения: frameworks/base/services/core/Android.bp

person Rick Sanchez    schedule 01.11.2020
comment
Большое спасибо @RickSanchez за руководство и исправление поста, который был первым на Stack Overflow. Основываясь на вашем ответе, я смог найти правильное решение и успешную сборку, которую я опубликую в теме ниже. - person Aditya Gupta; 02.11.2020
comment
Пожалуйста. Рад, что проблема решилась. Но добавить свой собственный ответ (который почти такой же, как этот) и принять его вместо этого — дурной тон. Кроме того, вы не получите оценку ++ за свой собственный ответ. - person Rick Sanchez; 02.11.2020
comment
Я понимаю ваш запрос и учусь в процессе. Я исправил свою ошибку как в принятии решения, так и в изменении моего сообщения с ответом, указав реальное решение. Приносим извинения за доставленные неудобства и благодарим за помощь. - person Aditya Gupta; 03.11.2020
comment
Ваше решение работает. Но: в моем случае я добавляю зависимость x (.jar), которая также зависит от других зависимостей. Например, зависимость y и z. Итак, мне нужно назвать все эти (x, y, z), как в вашем примере? В моем случае, следуя вашему примеру, он строится без ошибок, но во время выполнения выдает сообщение об ошибке, в котором говорится, что зависимость y отсутствует/не найдена. - person icouldin; 11.01.2021

Основываясь ПОЛНОСТЬЮ на ответе, предоставленном @RickSanchez, я выполнил следующие шаги, руководствуясь его ответом, чтобы создать успешную сборку:

  1. Создан каталог: [android]prebuilts/misc/common/jsoup/
  2. В эту папку каталога jsoup я включил файлы схемы Android.bp и jsoup-1.13.1.jar, загруженные с https://jsoup.org/download
  3. С помощью описаний Blueprint Soong Flag информация здесь, я создал свой Android.bp, о котором говорилось выше, следующим образом:

Android.bp

    java_import {
    name: "jsoup-1.13.1",
    host_supported: true,
    installable: false,
    jars: ["jsoup-1.13.1.jar"],
    }
  1. Следующей задачей было передать ссылку на созданный выше файл Local Blueprint Android.bp, присутствующему в frameworks/base/services/core/Android.bp.

  2. Для этого я внес следующие изменения: в Android.bp либо добавьте следующий блок, если он есть, либо измените следующий блок:

     static_libs: [
     "jsoup-1.13.1", /*use jsoup lib */
     "android.hardware.authsecret-V1.0-java",
     ....
     ....
     ],
    
  3. Теперь сборка выполнена успешно, и sample.java успешно может использовать библиотеку jsoup.

person Aditya Gupta    schedule 02.11.2020