Unity去除armv8目录

前些日子,因为项目中引用的某些aar包包含armv8的.so文件,所以在打包生成的apk包中会有armv8的目录,其实我们是不需要这个目录的。去除它可以减小包的体积。

首先,我们需要弄清楚apk下的libs这几个目录是干嘛的,其实每个目录对应的是一种CPU架构:

  1. armeabiv-v7a: 第7代及以上的 ARM 处理器。2011年15月以后的生产的大部分Android设备都使用它.
  2. arm64-v8a: 第8代、64位ARM处理器,很少设备,三星 Galaxy S6是其中之一。
  3. armeabi: 第5代、第6代的ARM处理器,早期的手机用的比较多。
  4. x86: 平板、模拟器用得比较多。
  5. x86_64: 64位的平板。

注意:这个是2016年的数据,现在armv8用的多不多,我也不清楚。不过,armv8是可以像下兼容的,也就是说,在armv8的机器上,我们使用armv7的.so包也完全可以。

arm64-v8a是可以向下兼容的,但前提是你的项目里面没有arm64-v8a的文件夹,如果你有两个文件夹armeabi和arm64-v8a,两个文件夹,armeabi里面有a.so 和 b.so,arm64-v8a里面只有a.so,那么arm64-v8a的手机在用到b的时候发现有arm64-v8a的文件夹,发现里面没有b.so,就报错了,所以这个时候删掉arm64-v8a文件夹,这个时候手机发现没有适配arm64-v8a,就会直接去找armeabi的so库,所以要么你别加arm64-v8a,要么armeabi里面有的so库,arm64-v8a里面也必须有

作者:green jim 
链接:http://www.zhihu.com/question/36893314/answer/78467097 
来源:知乎 
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

了解了这个之后,我们看Unity的Android BuildSetting中也有相应的选项供你过滤:

通常,我们只选择armv7,因为数据表明armv7的用户还是占大多数的:

可以看到在2016-09月的时候,x86的用户只有1.3%。对于绝大多数用户来说,Device Filter选择ARMv7可以减少.apk包体的大小,同时又不会影响绝大多数用户的使用。

 

但问题来了,unity并没有提供过滤armv8的选项,我们打出的包还是带armv8目录的。这可咋整?

经过博主苦苦搜索+实验,还是找出了解决办法的。

注:以下解决方案适用于打包方式为Gradle的项目,Internal打包方式博主并未测试。

在你的项目中找到Plugins\Android目录,新建一个mainTemplate.gradle文件,此文件对应gradle工程中的build.gradle文件,是gradle编译出包的配置文件。

在文件中,添加下面一条指令:

//只添加armeabi, armeabi-v7a的库
ndk {
    abiFilters 'armeabi', 'armeabi-v7a'
}

这样,我们就只有上面配置的两个目录,没有armv8的目录了。

但问题又来了,这样配置后,打包时Unity会报错:

Set “android.useDeprecatedNdk=true” in gradle.properties to continue using the current NDK integration.

不要怕,很好解决。在C:\Users\你的用户名\.gradle有一个gradle.properties文件,这是一个全局的gradle配置文件。如果没找到,就新建一个同名文件。

我们打开这个文件,添加一行android.useDeprecatedNdk=true即可。

你可能会问,为什么要修改全局的gradle配置文件呢,这样不就影响了其他gradle工程了吗?

其实我也不想这样,但Unity似乎并未提供针对特定工程配置gradle.properties的能力。

 

 

大功告成!

不过,这个方案并不完美,因为我们直接将x86的用户抛弃了。那有没有办法,既能减小包体积,又能兼顾多cpu架构呢?

答案是有的。针对不同架构用户分发不同的包即可,简称分包。

在最新版本的Unity 2019中,已经有了分包选项。在老版本Unity中,我们也可以自行分包,不过这两种方案博主均未实测,具体实现可参考https://blog.csdn.net/yypblog/article/details/51990254

 

 

参考链接:

【Unity3d基础】Unity中关于Device Filter的选择问题

按照cpu架构分别打包apk

studio android.useDeprecatedNdk=true解决ndk提示版本低不能自动编译jni

我的Android进阶之旅------>Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值