android - 在 Android Studio 3.0 中构建 PIE 和非 PIE 可执行文件

标签 android android-studio gradle cmake android-ndk

我的 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,或仅当我显式传递 -DANDROID_PIE=ON 时才生成 pie 二进制文件cmake 的参数。

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

最佳答案

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

This hack does not work anymore on AS 3.0 and NDK r16 - it produces non-PIE binaries only as my minSdkVersion is set to 14, or PIE binaries only if I explicitly pass -DANDROID_PIE=ON argument to CMake.



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

或者,你可以撞到你的 minSdkVersion最多 16 个。这些天几乎没有剩下任何 ICS 设备,我怀疑剩下的很多设备只是用作闹钟和电视 Remote 。

关于android - 在 Android Studio 3.0 中构建 PIE 和非 PIE 可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47889888/

相关文章:

android - 在 BroadcastReceiver 中使用 IntentService 时如何传递上下文变量?

android - 恢复时间内存优化

java - Android 中的字节码操作

android - 是否可以在android中加密整个数据库?

android - 从 android studio 重新安装时未正确检测到应用程序安装时间

java - 没有互联网显示对话框

java - 如何避免调用 handler.postDelayed(Runnable run) ?

android - Gradle 中已弃用的 JaCoCo 扩展的替代品是什么?

当位于两个目录之一时,Gradle 无法解析 java 11 模块的包

java - 生成失败的评估根项目-Gradle