作者:陳小勳2502936731 | 来源:互联网 | 2023-09-23 23:53
不得不说,安卓开发中的坑太多了!!!!!!!!新进的公司以前的项目都是在Eclipse上开发的,这几天项目不太紧,所以就尝试着重构项目到Studio上,并将项目组件化,顺便引入了R
不得不说,安卓开发中的坑太多了!!!!!!!!
新进的公司以前的项目都是在Eclipse上开发的,这几天项目不太紧,所以就尝试着重构项目到Studio上,并将项目组件化,顺便引入了Rxjava,ButterKnife,Retrofit,等第三方开源库,项目的代码方法数暴增,超过了65535,没办法只有开启MultiDex分包了,然而..却给自己挖了一个大坑.
在开启Multidex后,发现Log4j总是抱classNotFound的错误,原先以为是组件化开发的锅,经过各种折腾后发现并不是,奇怪的是将一些第三方库拿掉以后该问题就解决了.于是我灵机一动,是不是分包以后没有将Log4j的包放在第一个dex中,于是开始着手制定log4j相关的包放在第一个dex文件中,按照这个方案尝试:
将指定的类打包到主dex文件中
发现太麻烦而且暂时搞不定,于是搁置了下来,直到今天再来一次,发现了老罗(发现他的csdn关了,就指定微博吧)这篇文章:
Building Apps with Over 65K Methods — 你可能会遇到的Class Not Found问题,真的解决了问题,原理我也不多说了,就将他讲的三个解决办法贴出来吧,哎,发现真的是懒得打字写文章呀:
官方提供了Multidex方案,即将APK的方法打包在不同的Dex文件中,具体方法可以参考官方文档:https://developer.android.com/tools/building/multidex.html。其中,用于启动APK的Dex称为Main Dex,其余的Dex称为AdditionalDex。
使用了Multidex的APK运行在Android5.0之前的设备上时,还需要配合support库里面的MultiDex.install接口才行。有三种方法使用MultiDex.install接口:
1. 如果没有自定义自己的Application,那么在AndroidManifest.xml将APK的Application指定为MultiDexApplication。
>
2. 如果自定义了自己的Application,那么将自己的Application继承于MultiDexApplication。
>
3. 如果不想继承于MultiDexApplication,那么重写父类Applicatio的成员函数attachBaseContext,并且在该成员函数中调用MultiDex.install接口。