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

时间:2017-12-19 15:09:13

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

我的Android项目应该生成本机可执行文件作为构建的一部分,并支持API 14(Android 4.0)中的所有设备。 问题是4.0仅支持非派可执行文件,Android> 5.0仅支持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参数传递给时才产生饼干二进制文件cmake的。

我发现在一个版本中嵌入饼图和非饼图版本的唯一方法是创建两个相同的Android库模块,在-DANDROID_PIE文件中使用不同的build.gradle参数值并制作应用模块依赖于他们。它确实有效,但减慢了配置和放大速度。现在构建时间超过两倍我只有三个项目(app本身和两个模块)。 任何解决这个问题的想法都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

我在我们的mailing list上回答,但包括完整性在内:

  

这个hack在AS 3.0和NDK r16上不再起作用 - 它只在我的minSdkVersion被设置为14时生成非PIE二进制文件,或者只有在我明确地将-DANDROID_PIE=ON参数传递给PIE二进制文件时才生成PIE二进制文件CMake的。

我真的不明白你的方法是如何运作的。 -DANDROID_PIE作为预处理程序定义不会改变任何内容。你想要做的是为with-pie可执行文件设置-fPIE cflag和-pie ldflag。

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