欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Unity去除armv8目录

程序员文章站 2022-04-19 08:51:43
...

前些日子,因为项目中引用的某些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中也有相应的选项供你过滤:

Unity去除armv8目录

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

Unity去除armv8目录

可以看到在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文件兼容问题