在 android.mk 中包含 .so 文件以用于 Android 系统应用程序。

3

我有一个包含Java代码和一些.so文件的APK。我已经在Android Studio中构建了该APK,并且现在需要将其作为自定义ROM中/system/app/文件夹的一部分。

Java代码+ .so = APK

为了将其包含在system/app/中,我在Android.mk文件中拥有以下构建脚本,并从device.mk文件中调用它。

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := utility
LOCAL_MODULE_CLASS := APPS
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := utility.apk
include $(BUILD_PREBUILT)

构建镜像后,我发现我的APK崩溃了,日志显示“无法链接可执行文件”,所有.so文件似乎都丢失了。 然而,如果我使用adb install utility.apk,APK可以正常工作。
有人能告诉我在构建脚本中缺少什么导致.so文件不可用吗?
附注:我在/data/data/com.org.utility/和/system/lib/文件夹中搜索过,但没有找到.so文件。 但是,如果我使用adb install,.so文件将被找到在/data/data/com.org.utility/lib/x86/文件夹中。
1个回答

1

我不记得在L或M中,构建系统中存在一个错误。

被构建到system/app或system/priv-app中的apk中的so文件无法释放到系统中。但是第三方应用程序可以通过PackageManagerService释放它们的库。

一种解决方案: 1. 手动发布apk中的so文件。 2. 在Android.mk中添加相关的so文件,例如:

    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE := test
    LOCAL_SRC_FILES := libtest.so
    include $(PREBUILT_SHARED_LIBRARY)
  1. 将此模块名称添加到PRODUC_PACKAGES微调中。

这样,在您的应用程序中,它将被构建到系统/ lib或lib64中。

祝你好运。


如果我们可以访问代码库,这种方法是可行的。但对于第三方APK被包含在系统/应用程序中,该解决方案无法应用。 - user3022690
@user3022690,你可以自己从第三方APK中提取所有的**.so文件。毕竟,它只是一个签名的ZIP文件。我相信你甚至不需要重新打包这个APK,过时的.so**文件也不会有影响。 - Alex Cohn
1
  1. 如果您可以通过Android.mk制作apk,那么您也可以这样做。
  2. 如果您无法访问源代码,并且需要将您的apk放置在system/app中,您需要获取root权限,在这种情况下,您可以释放so,并将它们放置在system/lib中。
  3. 如果您没有root权限,您必须通过adb或其他方法安装apk,PMS将释放您的库,这个问题就不会发生。
- lemac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接