【问题标题】:Adding a prebuilt binary in Android source在 Android 源代码中添加预构建的二进制文件
【发布时间】:2012-06-13 12:20:50
【问题描述】:

我有一个本地二进制文件,我想将它包含到 Android 的源代码中,这样当我编译它时,我的二进制文件就会包含在 /system/bin 中。

我已将二进制文件复制到文件夹 /prebuilt/android-arm/my-binary 中,并创建了一个新的 Android.mk,其中包含以下内容:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES := my-binary
LOCAL_MODULE := my-binary
LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_MODULE_TAGS := optional
include $(BUILD_PREBUILT)

但是当我运行 make 时,我在日志中得到的唯一参考如下:

target Prebuilt: my-binary (out/target/product/generic/obj/EXECUTABLES/my-binary_intermediates/my-binary)

并且二进制文件根本没有安装到 system.img 中。 Installing a prebuilt binary on Android: "not found" 有一个几乎相同的问题,但提问者已经知道基本程序,根本没有解释。如果我运行 make my-binary,我会得到我发布的同一行。

我也尝试过运行 make out/target/product/generic/system.img my-binary,但它也不起作用。我的二进制文件显示在 out 子文件夹中,但不会包含在 system.imng

我错过了什么吗?有什么办法可以让我的二进制文件只运行 make -j# 就被包含在 /system/bin 中?

【问题讨论】:

    标签: android android-source android-build


    【解决方案1】:

    刚刚在我的模拟器上进行了测试,它可以正常工作。我在此文件夹中用作示例 gdbserver。我有一个为 android 交叉编译的 strace 并使用它嵌入到图像中。因此,说明将针对此可执行文件。

    1. 在 prebuilt/android-arm/strace 下创建文件夹
    2. 把你的二进制文件放在那里(在我的例子中是 strace)

    添加具有以下内容的 Android.mk 文件:

    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    
    LOCAL_SRC_FILES := strace
    LOCAL_MODULE := strace
    LOCAL_MODULE_CLASS := EXECUTABLES
    LOCAL_MODULE_TAGS := optional
    include $(BUILD_PREBUILT)
    
    
    prebuilt_files :=
    
    $(call add-prebuilt-files, EXECUTABLES, $(prebuilt_files))
    

    使用指令构建:mmm prebuilt snod -j4(如果您已经构建了图像)或者您当然也可以使用make -j4

    【讨论】:

    • 是的,我使用了在同一目录中的 gdbserver 中找到的 Android.mk 作为参考,但它不适用于某些阅读。我要试试mmmm;我马上回来... 编辑:mmm prebuilt snod -j 工作!我要做一个 make clean 看看从头开始重建所有东西是否也能正常工作......
    • 发生了一些非常奇怪的事情......直接从 repo(没有我的二进制文件)在源代码上运行 make 编译得很好。但是当我添加我的二进制文件时,我得到了奇怪的错误。最糟糕的是,即使我做了一个 make clean 并取出我的文件夹(它应该让源代码就像一开始一样,因为我没有接触其他任何东西),当我尝试编译它我仍然会得到编译错误。我正在释放空间并确保它与代码本身无关(我在 VMware 上运行 Ubuntu 10.04)
    • make clean 只需删除'out'文件夹。它不会将代码更改为默认值。你能用编译过程中得到的错误更新你的答案吗?
    • 没关系...我从 repo 重新下载了源代码,并在没有 cca​​che 的情况下使用纯 make 构建它,没有任何 -j4,它刚刚构建。无论如何,它仍然无法正常工作;在模拟器上使用 DDMS 时,我的二进制文件没有出现在 /system/bin 中。
    • 这很奇怪。我在我的模拟器中看到了这个文件 - 我刚刚检查过。
    【解决方案2】:

    如果您的二进制文件最终在 out 目录中但不在图像中,那是因为您没有将二进制文件包含在图像中的规则。

    device/<vendorname>/<devicename>/device.mk(或device.mk 包含的某些makefile 中)你需要有两个条目之一:

    PRODUCT_PACKAGES += my-binary
    

    或:

    PRODUCT_COPY_FILES += path/to/my-binary:/root/target/path/to/my-binary
    

    ...我建议使用PRODUCT_PACKAGES 方法; PRODUCT_COPY_FILES 更适合脚本和配置文件。

    注意:PRODUCT_PACKAGES 使用模块名称,PRODUCT_COPY_FILES 使用二进制文件的实际名称/位置。

    【讨论】:

      【解决方案3】:

      您也可以使用以下对我有用的方法 ...... LOCAL_MDULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES) ... 包括 $(BUILD_EXECUTABLE)

      【讨论】:

        猜你喜欢
        • 2017-05-28
        • 2020-01-29
        • 2013-03-06
        • 1970-01-01
        • 1970-01-01
        • 2015-05-26
        • 1970-01-01
        • 2016-12-11
        • 1970-01-01
        相关资源
        最近更新 更多