- 原因分析
- eclipse解决方案
- eclipse 导入Androidstudio解决方案
原因分析:
在安卓4.4及以下的系统中,安卓限制整个app包的方法数不能超过65535(即64K),而随着现在App功能的增大,方法数远超65535。这就导致早期的安卓系统(4.4以下)出现方法找不到问题。当然,谷歌也自身有提供一套解决方案,即(multidex拆分包)。但是之前聚合虽然意识到这个问题,但是解决方案却是错误的。
eclipse工程的解决方法:
eclipse Android工程方法超过65535,一般使用MultiDex库进行分包处理。
而eclipse中使用multidex库一般分为以下步骤:
- 下载android-support-multidex.jar
- 在eclipse上导入android-support-multidex.jar包
- 配置MultiDexApplication
- 配置AndroidManifest.xml
android-support-multidex.jar下载
百度下载android-support-multidex.jar放置在主工程使用
下载链接:https://pan.baidu.com/s/1dfstShtHSFVGqqc6m8XDFA
在eclipse上导入android-support-multidex.jar包
这里就要将android-support-multidex.jar导入eclipse,跟导入其他jar包一样。
MultiDexApplication
有两种方案配置Application,目前我们聚合的Application大都没有去继承MultiDexApplication,如果父类没有继承MultiDexApplication ,就用第二种方法就可以。
- 直接继承
public class MogeApplication extends MultiDexApplication { ... }
- 重写attachBaseContext方法
或者,如果替换了 Application 类,但无法更改基本类,则可以改为替换 attachBaseContext() 方法并调用 MultiDex.install(this) 来启用 Dalvik 可执行文件分包:
public class MogeApplication extends LeyouApplication{
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
配置AndroidManifest.xml
编辑清单文件,按如下方式设置 <application> 标记中的 android:name:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<application
android:name="android.support.multidex.MogeApplication" >
...
</application>
</manifest>
注意点
不得不说,其实以上步骤只是集成了MultiDex,但是并没有做拆分包的操作,关于拆分包的操作,在打包的时候,炳元已经用python有做相应处理了,这里就可以不用处理拆分包。也就是说,以上的步骤只适用于聚合渠道打包。
eclipse项目导入到AndroidStudio解决方案
由于谷歌官方并没有支持在eclipse项目上添加MultiDex。所以上面操作eclipse集成MultiDex只是集成了这个类库,但Eclipse并没有对生成的包进行分包,所以如果真的需要完成支持MultiDex,还是要在AndroidStudio上集成MultiDex。其实谷歌把拆分包操作集成在Gradle打包工具里了,添加分包操作用Gradle很简单,只要配置:defaultConfig 下添加 multiDexEnabled true就可以。
具体步骤如下:
- 导入eclipse工程到AndroidStudio
- 修改build.gradle文件
- 集成MultiDex
- 添加MultiDex支持
- 配置AndroidManifest.xml
导入eclipse工程到AndroidStudio
导入工程到AndroidStudio是很简单,但是导入后就会有各种问题,先看下导入步骤。
-
file->new->Import Project...
1.png -
选择eclipse工程,注意,选择的是工程的根目录。
2.png -
选择转换成androidstudio项目后,要保存的位置。
3.png - 后面直接点下一步,完成。
- 要修改的地方。由于我们用的eclipse项目都很早,所以不在转换成androidstudio项目后,gradle版本不建议用最新的,建议用2.14.1版本,具体要改的地方如下:
- dt1/build.gradle
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.3'//版本要用2.2.3
}
}
- dt1\gradle\wrapper\gradle-wrapper.properties
gradle版本要改成2.14.1
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
- 可选操作,Build Tools版本改成常用版本,具体步骤是把所有Build Tools版本号,改成常用版本号。
集成MultiDex
- 在defaultConfig中添加multiDexEnabled true这个配置项。
- 在dependencies中添加multidex的依赖:
implementation ‘com.android.support:multidex:1.0.2’
android {
defaultConfig {
...
multiDexEnabled true
...
}
dependencies {
...
compile 'com.android.support:multidex:1.0.2'
...
}
}
添加MultiDex支持
这一步跟elipse一样的。同样有两种方案配置Application,目前我们聚合的Application大都没有去继承MultiDexApplication,如果父类没有继承MultiDexApplication ,就用第二种方法就可以。
- 直接继承
public class MogeApplication extends MultiDexApplication { ... }
- 重写attachBaseContext方法
或者,如果替换了 Application 类,但无法更改基本类,则可以改为替换 attachBaseContext() 方法并调用 MultiDex.install(this) 来启用 Dalvik 可执行文件分包:
public class MogeApplication extends LeyouApplication{
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
配置AndroidManifest.xml
编辑清单文件,按如下方式设置 <application> 标记中的 android:name:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<application
android:name="android.support.multidex.MogeApplication" >
...
</application>
</manifest>
接下来编译运行,OK了。
问题分析与汇总
-
如下所示,在聚合过程中,被继承的xxApplication有正确重写attachBaseContext,但是在安卓4.4下却依然无法加载分包。这是因为attachBaseContext必需要在继承于Application的xxApplication或者多继承一级,太多级继承,往往就不生效了。这些点是要多注意的。
添加了attachBaseContext后依然没有成功安装multidex.png
网友评论