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

不飞则已,一飞冲天;不鸣则已,一鸣惊人。这篇文章主要讲述在Android Studio 3.0中构建PIE和非PIE可执行文件相关的知识,希望能为你提供帮助。
我的android项目应该生成本机可执行文件作为构建的一部分,并支持API 14(Android 4.0)中的所有设备。问题是4.0仅支持非派可执行文件,而Android> 5.0仅支持派对可执行文件。这意味着我应该生成饼和非饼可执行文件,我找不到任何合适的方法来实现我当前的设置(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参数传递给cmake时才产生饼干二进制文件。
我发现在一个版本中嵌入饼图和非饼图版本的唯一方法是创建两个相同的Android库模块,在-DANDROID_PIE文件中使用不同的build.gradle参数值,并使app模块依赖于它们。它确实有效,但是配置和构建时间减慢了两倍以上我现在只有三个项目(app本身和两个模块)。任何关于解决这个问题的想法都将不胜感激。
答案我回答了我们的mailing list,但包括完整性:
这个hack在AS 3.0和NDK r16上不再起作用 - 它只在我的minSdkVersion被设置为14时产生非PIE二进制文件,或者只有在我明确地将-DANDROID_PIE=ON参数传递给CMake时才产生PIE二进制文件。
我真的不明白你的方法是如何运作的。 -DANDROID_PIE作为预处理器定义没有任何改变。您想要做的是为with-pie可执行文件设置-fPIE cflag和-pie ldflag。
【在Android Studio 3.0中构建PIE和非PIE可执行文件】或者,你可以将你的minSdkVersion提升到16级。这些天几乎没有任何ICS设备,我怀疑剩下的很多只是用作闹钟和电视遥控器。

    推荐阅读