Android NDK之Strip裁减so库

Posted 新根

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android NDK之Strip裁减so库相关的知识,希望对你有一定的参考价值。

1.Strip基本介绍

strip

在类Unix和Unix的操作系统中,strip程序可对可执行二进制程序和对象文件中,删除不必要的信息,从而带来更好的性能和减少磁盘空间的使用。“不必要的信息”指的是正常执行功能过程中,不需要的二进制信息,比方调试和符号信息。但该命令裁剪的程度,取决于开发者对这部分代码的具体实现。

此外,使用strip可提高二进制文件在逆向工程中的安全性。如果没有二进制文件的信息和对象的名称,分析它将更加困难

常用的strip 命令

  • strip - s xxx.so : 移除所有符号信息(会覆盖原有带符号表的so)
  • strip - S xxx.so: 移除调试符号信息
  • strip - s xxx.so -o yyy.so: 移除所有符号信息,裁减好后,输出指定名字的so

不同架构的strip

android 手机中 cpu 架构是各不相同的,因此不同架构下要使用各自的strip 裁减对应的so库。

这里介绍下,主流适配是armv7和armv8 的ndk位置:

  • armv8的strip位于:xxx\\sdk\\ndk\\22.1.7171670\\toolchains\\aarch64-linux-android-4.9\\prebuilt\\windows-x86_64\\bin\\aarch64-linux-android-strip.exe
  • armv7的strip 位于:xxx\\sdk\\ndk\\22.1.7171670\\toolchains\\arm-linux-androideabi-4.9\\prebuilt\\windows-x86_64\\bin\\arm-linux-androideabi-strip.exe

简单介绍完strip命令后,还得先了解下符号表。

2.符号表(Symbol table)

在计算机科学中,符号表(Symbol table)是语言翻译程序(如编译器或解释器)所使用的数据结构,其中程序源代码中的每个标识符(即符号)都与源代码中的声明或外观相关的信息相关联。换句话说,符号表的条目存储与条目对应符号相关的信息。

在这里插入符号表的实际使用:

  • 在android开发中,集成了bugly 异常上报的小伙伴,可能比较熟悉。为了定位每个版本中出现的native crash的位置,应该上传对应版本的符号表(即带有符号表的so库)。
  • 使用ndk-stack 处理native crash ,也是需要使用到带符号表的so库。

3.使用Strip裁减so库

拿到对应架构的so库,比如这里是arm64-v8a的so库进行 移除全部符号表 ,指定输出新的so库。

先知道arm64-v8a对应的strip 所在目录,执行以下命令:

效果如下图:

这里插入点小知识:在android studio中通过c++代码编译出strip 的so库,可以在cmake-list中添加:

#set(CMAKE_C_FLAGS_RELEASE "$CMAKE_C_FLAGS_RELEASE -s")
#set(CMAKE_CXX_FLAGS_RELEASE "$CMAKE_CXX_FLAGS_RELEASE -s")

参考教程

  • http://blog.itpub.net/69912579/viewspace-2759124/

以上是关于Android NDK之Strip裁减so库的主要内容,如果未能解决你的问题,请参考以下文章

动态链接库.so和静态链接库.a

Android NDK 之CmakeList 笔记

Android NDK 之CmakeList 笔记

NDK交叉编译及so库导入Android项目

Android NDK系列- AS导入so三方库,使用C/C+方法

Android NDK系列- AS导入so三方库,使用C/C+方法