首页
社区
课程
招聘
[原创]NDK入门一:关于设备的ABI(小白白文,做好心理准备)
发表于: 2021-4-27 10:17 10074

[原创]NDK入门一:关于设备的ABI(小白白文,做好心理准备)

2021-4-27 10:17
10074

跟着肉师傅学习逆向已经来到了第二个月,这个月只要是Native开发相关的内容,分享下,记录下自己学会的姿势。这是一篇小小小白白白白白白文,希望各位爱看不看。

不同的 Android 设备使用不同的 CPU,而不同的 CPU 支持不同的指令集。CPU 与指令集的每种组合都有专属的应用二进制接口 (ABI)。
那么我们自己手上的设备支持什么ABI呢?
ABI官方文档

uname -a 或者 getprop ro.product.cpu.abi

AArch64是ARMv8 架构的一种执行状态。这说明我手机架构是arm64-v8a

查看Android API官方文档可知,SUPPORTED_ABIS包含了我们想要的信息
图片描述

An ordered list of ABIs supported by this device. The most preferred ABI is the first element in the list.
此设备支持的abi的有序列表。最常用的ABI是列表中的第一个元素。

从官方文档中得知 我们想要的信息存在类Build的域中

可以看到该设备支持3类ABI,其中最常用的是arm64-v8a

我们已经知道了自己的手机的CPU架构、所能支持的ABI。那么如何让我们创建的Android项目编译出指定架构的.so文件呢?
ABI官方文档中可以看到,可以通过以下方式,指定abi构建
图片描述

我添加上所有的系统架构

将手机与studio断开,构建项目。

将生成的APP解包。在lib目录下发现了4个文件夹,每个文件夹下都有一个libnative-lib.so文件

查看arm64-v8a/libnative-lib.so

将该APP安装到设备上后,并进入到该APP目录下的lib文件夹下,发现有一个叫arm64的文件夹,里面有个libnative-lib.so的文件
图片描述
那么问题来了,这个so文件会是原本项目中编译出来那4个中的那一呢?

通过MD5计算,发现该文件的结果等于源项目中arm64-v8a/libnative-lib.so文件。 这也正验证官方文档上面说的,最常用的是arm64-v8a

图片描述
解包发现只生产了3种架构的so文件
图片描述
将APP安装并查看设备上的so文件
图片描述
发现,此so文件就是armeabi-v7a下面的so文件

图片描述
将apk解包,依旧看到对应的生产的so文件
图片描述但是这个APP是安装不到我的手机上的
图片描述

图片描述
项目默认生成了所有类型的so
图片描述
那么如果安装到设备生后,肯定是对应的arm64-v8a
图片描述

首先感谢您能看到这里!
您要是问我看了这篇文章,您能干什么,其实,您不能多干些什么惊天地泣鬼神的事情。只是您可能会明白怎样让您开发的NDK项目去适配不同架构的设备。

MacBook-Pro-3 ॐ  ~:
4329 ◯  adb shell
walleye:/ $ uname -a
Linux localhost 4.4.88-g3acf2d53921d #1 SMP PREEMPT Thu May 17 20:37:50 UTC 2018 aarch64
walleye:/ $ adb shell getprop ro.product.cpu.abi
/system/bin/sh: adb: not found
127|walleye:/ $ getprop ro.product.cpu.abi
arm64-v8a
walleye:/ $
MacBook-Pro-3 ॐ  ~:
4329 ◯  adb shell
walleye:/ $ uname -a
Linux localhost 4.4.88-g3acf2d53921d #1 SMP PREEMPT Thu May 17 20:37:50 UTC 2018 aarch64
walleye:/ $ adb shell getprop ro.product.cpu.abi
/system/bin/sh: adb: not found
127|walleye:/ $ getprop ro.product.cpu.abi
arm64-v8a
walleye:/ $
 
Log.d("abi", Arrays.toString(Build.SUPPORTED_ABIS)); //显示出支持的指令集类型
Log.d("abi", Arrays.toString(Build.SUPPORTED_ABIS)); //显示出支持的指令集类型
┌──(rootkali)-[~]
└─# objection -g com.example.myeasymd5 explore
Using USB device `Google Pixel 2`
Agent injected and responds ok!
 
     _   _         _   _
 ___| |_|_|___ ___| |_|_|___ ___
| . | . | | -_|  _|  _| | . |   |
|___|___| |___|___|_| |_|___|_|_|
      |___|(object)inject(ion) v1.8.4
 
     Runtime Mobile Exploration
        by: @leonjza from @sensepost
 
[tab] for command suggestions
com.example.myeasymd5 on (google: 8.1.0) [usb] # plugin load /root/.objection/plugins/Wallbreaker                         
Loaded plugin: wallbreaker
com.example.myeasymd5 on (google: 8.1.0) [usb] # plugin wallbreaker classdump android.os.Build                            
 
package android.os
 
class Build {
 
        /* static fields */
        static String BOARD; => walleye
        static String BOOTLOADER; => mw8998-002.0069.00
        static String BRAND; => google
        static String CPU_ABI; => arm64-v8a
        static String CPU_ABI2; =>
        static String DEVICE; => walleye
        static String DISPLAY; => OPM4.171019.021.Q1
        static String FINGERPRINT; => google/walleye/walleye:8.1.0/OPM4.171019.021.Q1/4820346:user/release-keys
        static String HARDWARE; => walleye
        static String HOST; => abfarm087
        static String ID; => OPM4.171019.021.Q1
                .
                .
                .
        static String[] SUPPORTED_32_BIT_ABIS; => armeabi-v7a,armeabi
        static String[] SUPPORTED_64_BIT_ABIS; => arm64-v8a
        static String[] SUPPORTED_ABIS; => arm64-v8a,armeabi-v7a,armeabi
                .
                .
                .
 
}
┌──(rootkali)-[~]
└─# objection -g com.example.myeasymd5 explore
Using USB device `Google Pixel 2`
Agent injected and responds ok!
 
     _   _         _   _
 ___| |_|_|___ ___| |_|_|___ ___
| . | . | | -_|  _|  _| | . |   |
|___|___| |___|___|_| |_|___|_|_|
      |___|(object)inject(ion) v1.8.4
 
     Runtime Mobile Exploration
        by: @leonjza from @sensepost
 
[tab] for command suggestions
com.example.myeasymd5 on (google: 8.1.0) [usb] # plugin load /root/.objection/plugins/Wallbreaker                         
Loaded plugin: wallbreaker
com.example.myeasymd5 on (google: 8.1.0) [usb] # plugin wallbreaker classdump android.os.Build                            
 
package android.os
 
class Build {
 
        /* static fields */
        static String BOARD; => walleye
        static String BOOTLOADER; => mw8998-002.0069.00
        static String BRAND; => google
        static String CPU_ABI; => arm64-v8a
        static String CPU_ABI2; =>
        static String DEVICE; => walleye
        static String DISPLAY; => OPM4.171019.021.Q1
        static String FINGERPRINT; => google/walleye/walleye:8.1.0/OPM4.171019.021.Q1/4820346:user/release-keys
        static String HARDWARE; => walleye
        static String HOST; => abfarm087
        static String ID; => OPM4.171019.021.Q1
                .
                .
                .
        static String[] SUPPORTED_32_BIT_ABIS; => armeabi-v7a,armeabi
        static String[] SUPPORTED_64_BIT_ABIS; => arm64-v8a
        static String[] SUPPORTED_ABIS; => arm64-v8a,armeabi-v7a,armeabi
                .

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2021-4-27 11:03 被网虫Spider编辑 ,原因: 修改图片,修改语句
收藏
免费 2
支持
分享
最新回复 (3)
雪    币: 864
活跃值: (5124)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
吃瓜群众路过
2021-4-28 14:44
0
雪    币: 116
活跃值: (1012)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
支持一下
2021-4-29 12:12
0
雪    币: 416
活跃值: (255)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
卧槽,竟然看到你在水贴?喵了喵了
2022-2-22 19:51
0
游客
登录 | 注册 方可回帖
返回
//