如何在 android 框架 [AOSP] java 文件中使用像 jsoup 库这样的外部 jar(不是 Android Studio 或 Java IDE)

How to use external jar like jsoup library in android framework [AOSP] java files (NOT Android Studio or Java IDE)

我希望在 Android 开源项目中使用 jsoup 库。 为此我做了两件事:-

第 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 文件的命名感到困惑,因为 import 语句包含 org.jsoup... 但 jar 文件本身只是 jsoup。 (我是否必须更改导入语句,如 import jsoup ... 或将 jar 文件的名称更改为 org.jsoup...)
  3. 除涉及 Android.mk 或 Android.bp 之外的任何其他方法也是高度可接受的。

拜托,我不知道在 AOSP 中包含外部 jar 文件。该代码在 IntelliJ IDE Java 中本地运行良好。非常感谢任何帮助。提前致谢。

您可以将您的解决方案基于已添加到 AOSP 中的其他一些 jar。
例如,在 external/zxing/:

中查看 ZXING 库的 Android.bp
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,您将库添加到错误的 makefile。

您更改的那个 (frameworks/base/Android.mk) 是为了制作 framework.jar,而您试图在 services.jar

上添加一个 class

要修改的正确生成文件是:frameworks/base/services/core/Android.bp

基于 ENTIRELY 根据 @RickSanchez 提供的答案,我按照他的答案的指导进行了这些步骤,提出了一个构建成功:

  1. 创建目录:[android]prebuilts/misc/common/jsoup/
  2. 在此目录 jsoup 文件夹中,我包含了从 https://jsoup.org/download
  3. 下载的蓝图文件 Android.bpjsoup-1.13.1.jar
  4. 借助 Blueprint Soong Flag 描述信息 here, 我创建了上面提到的 Android.bp 如下:

Android.bp

    java_import {
    name: "jsoup-1.13.1",
    host_supported: true,
    installable: false,
    jars: ["jsoup-1.13.1.jar"],
    }
  1. 下一个任务是将上面创建的本地蓝图文件的引用提供给 frameworks/base/services/core/Android.bp

    中的 Android.bp
  2. 为此,我做了以下编辑: 在 Android.bp 中添加以下内容(如果存在)或修改以下块 -

     static_libs: [
     "jsoup-1.13.1", /*use jsoup lib */
     "android.hardware.authsecret-V1.0-java",
     ....
     ....
     ],
    
  3. 现在构建成功,sample.java 可以成功使用 jsoup 库