【问题标题】:Build PIE and non-PIE executables in Android Studio 3.0在 Android Studio 3.0 中构建 PIE 和非 PIE 可执行文件
【发布时间】:2017-12-19 15:09:13
【问题描述】:

我的 Android 项目应生成本机可执行文件作为构建的一部分,并支持 API 14 (Android 4.0) 的所有设备。 问题是 4.0 仅支持非 pie 可执行文件,而 Android > 5.0 仅支持 pie 可执行文件。这意味着我应该同时生成 pie 和非 pie 可执行文件,并且在我当前的设置(Android Studio 3.0、NDK r16、llvm-5.0)中找不到任何合适的方法来实现这一点。 我在我的 CMakeLists.txt 文件中对 Android Studio 2.3 和 NDK r15 使用了以下解决方法:

add_executable(hello
    src/main/cpp/main.cpp
    )

add_executable(hello-nonpie
    src/main/cpp/main.cpp
    )

target_compile_definitions(hello
    PRIVATE
    -DANDROID_PIE=ON
    )

target_compile_definitions(hello-nonpie
    PRIVATE
    -DANDROID_PIE=OFF
    )

此 hack 不再适用于 AS 3.0 和 NDK r16 - 它仅在我的 minSdkVersion 设置为 14 时生成非 pie 二进制文件,或者仅当我将 -DANDROID_PIE=ON 参数明确传递给 cmake 时才生成 pie 二进制文件。

我发现在一个构建中嵌入 pie 和非 pie 版本的唯一方法是创建两个相同的 Android 库模块,在它们的 build.gradle 文件中具有不同的 -DANDROID_PIE 参数值,并使应用程序模块依赖于它们。它确实有效,但减慢了配置和构建时间的两倍多,因为现在我没有一个而是三个项目(应用程序本身和两个模块)。 任何有关解决此问题的想法将不胜感激。

【问题讨论】:

    标签: android android-studio gradle cmake android-ndk


    【解决方案1】:

    我在我们的mailing list 上回答了,但为了完整起见,在此处包括:

    此 hack 不再适用于 AS 3.0 和 NDK r16 - 它仅在我的 minSdkVersion 设置为 14 时生成非 PIE 二进制文件,或者仅当我将 -DANDROID_PIE=ON 参数明确传递给 CMake 时才生成 PIE 二进制文件。

    我真的不明白你的方法是如何奏效的。 -DANDROID_PIE 作为预处理器定义没有任何改变。您想要做的是为 with-pie 可执行文件设置 -fPIE cflag 和 -pie ldflag。

    或者,您可以将minSdkVersion 增加到 16 个。这些天几乎没有剩下任何 ICS 设备,我怀疑剩下的很多设备只是用作闹钟和电视遥控器。

    【讨论】:

    • > 我真的不明白你的方法是如何工作的——你说得对,但它没有:我在让它“工作”之后将我的设置更新为 3.0 / r16——可能,我认为它在错误地闪烁。但是,您的方法似乎有效 - 非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2020-07-31
    • 2013-07-16
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多