【问题标题】:Dynamically linking to a shared Java Library in Android动态链接到 Android 中的共享 Java 库
【发布时间】:2012-05-18 17:55:35
【问题描述】:

我正在尝试将多个 Android“服务”使用的 Java 库分离为一个动态或共享库,这些库可以由这些独立服务加载,而无需将该库包含在每个服务的 APK 中。

我知道有不同的方法可以做到这一点,例如创建 Android 服务或使用 DexLoader 和反射,但我试图避免更改库的源。相反,我正在尝试构建它并将其安装在我的设备上(本质上扩展了提供的 android API)。

以下是一个非常相似的问题,但仍未得到解答: Create Android apps in Eclipse sharing common library

我知道这是 Google 不想透露的,因此在线查找信息非常困难。

到目前为止,我已经尝试在 frameworks 目录下放置一个简单的“Hello World”程序并构建它,它成功地为我的程序创建了一个 jar。然后我在 product/core.mk 中添加了我的包,并在 api/10.xml 下添加了我的包定义,之后我运行“make sdk”,导致以下错误消息:

******************************
You have tried to change the API from what has been previously released in
an SDK.  Please fix the errors listed above.
******************************
make: *** [out/target/common/obj/PACKAGING/checkapi-last-timestamp] Error 38

作为一种解决方法,我将我的包添加到 out 目录内的“public_api.xml”文件中,该文件是在构建过程中以某种方式动态创建的。使用这种解决方法,SDK 构建时没有错误(尽管如果我再次清理,我将不得不再次修改 public_api.xml,因为它将因清理而被删除)。但是,当我尝试在任何地方导入和使用我的包时,它仍然说我的包“不存在”

任何帮助将不胜感激!谢谢!

【问题讨论】:

  • 为什么不在应用程序之间使用 AIDL 进行 RPC?
  • 如果您的包因为不属于官方 API 列表而被忽略,可能您需要在构建配置中找到该列表并添加它。递归 grep 用于查找包含的小东西的名称可能会帮助您找到尚未添加的地方。但是,你真的要这样做吗?框架修改仅适用于运行您定制的 android 构建的设备。
  • @KristopherMicinski - 我试图避免修改源代码并试图研究这种特殊方法。 chris - 我的设备已经在运行我自己定制的 android 版本,所以我很好。是的,这正是我试图在构建配置中找到的,但谷歌让它很难做到。
  • 您是否尝试过在 Eclipse 中创建“Android 库”项目,然后通过 AndroidManifest.xml 中的“uses-library”加载创建的 APK 库?那应该做你想做的(图书馆用户没有代码更改)。
  • 是的,但这会将它静态添加到 APK 中,这是我试图避免的。

标签: android sdk shared-libraries dynamic-library


【解决方案1】:

终于明白了。解决办法原来很简单!

将您的库放在 frameworks/base 文件夹中,并确保所有源代码都在 java 目录下,如下所示:

../frameworks/base/HelloWorld/java/<source files and folders>

编辑 build/target/product/ 下的 core.mk 文件以将您的包包含在列表中。这会将 HelloWorld 库添加到框架中:

PRODUCT_PACKAGES := \
    bouncycastle \
    :
    :
    DefaultContainerService \
    Bugreport \
    HelloWorld

编辑位于 build/core/ 下的 pathmap.mk 文件以将您的目录包含在列表中。这会将 HelloWorld 库添加到 android.jar

FRAMEWORKS_BASE_SUBDIRS := \
    $(addsuffix /java, \
        core \
        graphics \
        location \
        media \
        opengl \
        sax \
        telephony \
        wifi \
        vpn \
        keystore \
        voip \
        HelloWorld \
     )

完成。重建android,它不应该抱怨并将你的库添加到framework.jar

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2017-05-17
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多