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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在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。

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

以上是关于在Android Studio 3.0中构建PIE和非PIE可执行文件的主要内容,如果未能解决你的问题,请参考以下文章

从 Android Studio 3.0 构建时如何克服应用未安装错误?

3.0Android Studio构建和运行应用

3.0Android Studio构建和运行应用

Ionic 3.0版本构建 - 取代Android Studio内置的现有Google Play应用

为啥 Android Studio 不会在 Android Pie (9.0) 上运行应用程序?

Android Studio 3.0 任务执行失败:无法合并 dex