作家
登录

Android兼容性 | NDK工具集更新须知

作者: 来源: 2017-04-18 10:59:01 阅读 我要评论

NDK 的 platforms/android-API/usr/lib 下列出了所有的公共库。

解决筹划:确保所有所需的库仅由 SONAME 引用。最好让运行时链接器查找和加载这些库,因为库在不合设毕喔赡地位可能有所不合。

留意:SSL/crypto 是一种间谍作况,应用不得直接应用平台 libcrypto 和 libssl 库,即使在较早版本的平台上也弗成以。所有应用都应应用 GMS 安然供给法度榜样,以确保应用免遭已知马脚进击。

解决筹划:重写编译器使其与地位无关,以确保不须要任何文本重定位。有关具体信息,请查看 Gentoo 文档。

每个 ELF 文件的节标头中都包含附加信息。如今,文件中必须有这些节标头,因为动态链接器要应用它们来进行健全性检查。有些开辟者测验测验经由过程删除这些节标头对二进制文件进行混淆处理,防止遭到反向工程。(如许做实际上并没有效,因为可以应用对象来重建已删除的信息,而这类对象到处都有。)

  1. $ readelf --header libBroken.so | grep 'section headers' 
  2.   Start of section headers:          0 (bytes into file) 
  3.   Size of section headers:           0 (bytes) 
  4.   Number of section headers:         0 
  5.  

解决筹划:大年夜您的版本中移除用于删除节标头的额外步调。

文本重定位(大年夜 API 23 开端实施)

大年夜 API 23 开端,共享对象不得包含文本重定位。也就是说,必须按原样加载代码,不得对其进行修改。这种办法可缩短加载时光并进步安然性。

文本重定位的常见原因是应用了与非地位无关的手写编译器。这种情况并不常见。请应用我们的文档中所述的 scanelf 对象进一步诊断:

  1. $ scanelf -qT libTextRel.so 
  2.  
  3. libTextRel.so: (memory/data?) [0x15E0E2] in (optimized out: previous simd_broken_op1) [0x15E0E0] 
  4.  
  5. libTextRel.so: (memory/data?) [0x15E3B2] in (optimized out: previous simd_broken_op2) [0x15E3B0] 
  6.  
  7. [skipped the rest]  

如不雅您没有可用的 scanelf 对象,可以改用 readelf 进行根本检查,查找 TEXTREL 条目或 TEXTREL 标记。查找个一一项就已足够。(TEXTREL 条目对应的值可有可无且平日为 0,存在 TEXTREL 条目即注解 .so 包含文本重定位)。以下示例中同时存在这两种指导符:

缺乏节标头(大年夜 API 24 开端实施)

留意:大年夜技巧上来讲,可能存在带有 TEXTREL 条目/标记却不包含任何实际文本重定位的共享对象。NDK 中不会出现这种情况,但如不雅您要自行生成 ELF 文件,请确保不要生成声明包含文本重定位的 ELF 文件,因为 Android 动态链接器信赖该条目/标记。

无效的 DT_NEEDED 条目(大年夜 API 23 开端实施)

固然库依附项(ELF 标头中的 DT_NEEDED 条目)可所以绝对路径,但在 Android 平台上却毫无意义,因为您无法控制体系将在何处安装库。DT_NEEDED 条目应与所需库的 SONAME 雷同,将在运行时查找库的义务留给动态链接器。

在 API 23 之前,Android 的动态链接器在查找所需库时会忽视完全路径,仅应用根本名称(最后一个“/”之后的部分)。大年夜 API 23 开端,运行时链接器将完全遵守 DT_NEEDED,是以,如不雅设备的特定地位不存在库,链接器将无法加载响应库。

更糟的是,有些构建体系存在马脚,这会导致它们插入指向构建主机汕9依υ?件的 DT_NEEDED 条目,而在设备上却无法找到响应文件。

  1. $ readelf --dynamic libSample.so | grep NEEDED 
  2.  0x00000001 (NEEDED)                     Shared library: [libm.so] 
  3.  0x00000001 (NEEDED)                     Shared library: [libc.so] 
  4.  0x00000001 (NEEDED)                     Shared library: [libdl.so] 

      推荐阅读

      Android多线程的四种方式

    当我们启动一个App的时刻,Android体系会启动一个Linux Process,该Process包含一个Thread,称为UI Thread或Main Thread。平日一个应用的所有组件都运行在章一?Process中,当然,你可以>>>详细阅读


    本文标题:Android兼容性 | NDK工具集更新须知

    地址:http://www.17bianji.com/lsqh/34819.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)