Unity去除armv8目录
前些日子,因为项目中引用的某些aar包包含armv8的.so文件,所以在打包生成的apk包中会有armv8的目录,其实我们是不需要这个目录的。去除它可以减小包的体积。
首先,我们需要弄清楚apk下的libs这几个目录是干嘛的,其实每个目录对应的是一种CPU架构:
- armeabiv-v7a: 第7代及以上的 ARM 处理器。2011年15月以后的生产的大部分Android设备都使用它.
- arm64-v8a: 第8代、64位ARM处理器,很少设备,三星 Galaxy S6是其中之一。
- armeabi: 第5代、第6代的ARM处理器,早期的手机用的比较多。
- x86: 平板、模拟器用得比较多。
- 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的选择问题