Gradle 使用技巧 (二) - SO/NDK 过滤

本贴最后更新于 2306 天前,其中的信息可能已经水流花落

引言

作为一个 Android 开发人员,so 对于我们来讲是极其常见的,各种大厂的 SDK 中都包含着各种各样的 so,而 so 也是 apk 瘦身的重要一环,减少 so 平台的数量,可以极大限度的减少 apk 的大小。

Android 中的 so

先看一张官方的图:

ABI

可以将 so 分为以下几种:

  • armeabi: ARM v5 这是相当老旧的一个版本,缺少对浮点数计算的硬件支持,在需要大量计算时有性能瓶颈
  • armeabi-v7a: ARM v7 目前主流版本
  • arm64-v8a: 64 位支持
  • mips / mips64 极少用于手机,可以直接忽略
  • x86 / x86_64: x86 架构的手机都会包含由 Intel 提供的称为 Houdini 的指令集动态转码工具,实现对 arm .so 的兼容,再考虑 x86 1% 以下的市场占有率,x86 相关的两个 .so 也是可以忽略的

Android Studio 中如何引用 so

  1. 在 main 目录下创建 jniLibs 文件夹,将相应的 so 库存放进去。

jinLibs

  1. 在相应的 module 下的 gradle 中进行配置
android{
	repositories {
			flatDir {
				dirs 'libs'
			}
		}
}

同步项目即可。

如何选择 so

先不说原理,我们可以看看大厂是怎么做的。

先看看 TIM

Tim

再看看淘宝

淘宝

从 Tim 和淘宝的 apk 包中可以看到,两个都只是保留了 armeabi 平台的 lib,所以我们也可以直接参照大厂的做法只保留 armeabi 平台,其它的暂时可以不考虑,因为我们也做不到兼容全平台。

如何过滤

直接在 gradle 中配置即可

buildTypes{
	release{
		...
		ndk {
                abiFilters "armeabi" // 保留这种架构的CPU
            }
		...
	}
}

过滤 so

一般情况下是在打包的时候指定 so,但是也有特殊情况,需要 debug 模式下过滤,同上,直接在 debug 中配置即可。

ndk {
	abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}

后续敬请期待!
免为其难的关注一下公众号吧!!

生活实在是太苦啦

FullScreenDeveloper

  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3454 回帖 • 189 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    334 引用 • 323 回帖 • 3 关注
  • Gradle
    41 引用 • 20 回帖 • 2 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...