首页 > 编程知识 正文

multi中文意思,multipy

时间:2023-05-04 09:25:07 阅读:163646 作者:2283

1 .在生成1.MultiDex的背景Android系统上安装APP时,第一步是优化Dex。 这个过程有一个叫做DexOpt的专用工具。 DexOpt的执行过程在第一次加载Dex文件时执行。 该过程生成ODEX文件,即优化的dex。 运行ODex比直接运行ODex文件更高效。 但是,在早期的安卓系统中,DexOpt存在问题。 DexOpt搜索每个类的方法id,并存在于链表结构中。 但是,由于此链表的长度保存为一个短类型,因此方法id的数量不能超过65536个。 当一个项目足够大时,显然这种方法数量的上限是不够的。 在新版本的Android系统上,DexOpt修复了此问题,但需要与旧版本的Android系统兼容。

为了解决方法过多的问题,必须将其dex文件分割为两个以上。 因此,谷歌正式推出了multidex兼容包,与AndroidStudio合作实现了在一个APK中包含多个dex的功能。 如需详细资讯,请参阅。

2.MultiDex的简单原理假设APK有两个dex文件,第二个dex文件是classes2.dex。

1、兼容软件包在Applicaion实例化后,检查系统版本是否支持multidex,是否需要安装classes2.dex。

2、如果需要安装,从APK中解压缩classes2.dex,并将其复制到APP应用程序的沙箱目录中。

3、通过反射将classes2.dex注入到当前的classloader中。

3 .使用3.MultiDex一、修复APP应用程序:

如果引入了multidex兼容包并定制了APP应用程序类,则从MultiDexApplication继承。 否则,将Android : name=" Android.support.multi dex.multidexapplication "添加到manifest文件的application标签中

二.修改生成脚本:

AndroidStudio使用的构建工具是gradle,而我们使用的是ant,因此需要在当前ant脚本中添加对multidex的支持。 步骤如下。

1、更新AndroidSDK,确认build-tools版本为21.1.2,proguard为4.10或更高版本,并将其添加到系统环境变量中。

2、运行dxhelp将产生以下结果:

; margin-bottom:15px; padding-top:0px; padding-bottom:0px; lin t-size:16px">

–multi-dex选项,开始认为只要将它打开就可以了,但打完包启动后会崩溃,查看log发现有的类在Application类初始化的时候没有被加载,这些类被打包在了第二个dex文件中。

继续看上面的选项列表,–multi-dex选项后面有两个可选的选项。

–main-dex-list=<file>:参数是一个类列表的文件,在该文件中的类会被打包在第一个dex中。

–minimal-main-dex:只有在–main-dex-list文件中指定的类被打包在第一个dex,其余的都在第二个dex文件中。

我们只需要使用–main-dex-list,将Application初始化所需要的类放在一个文件中即可。

3、 生成main-dex-list列表:</br>Android SDK的build-tools中有一个mainDexClasses脚本。

该脚本要求输入一个文件组(包含编译后的目录或jar包),然后分析文件组中的类并写入到–output所指定的文件中,如classes_to_kepp_in_main_dex文件。

4、 –set-max-idx-number:这个选项没有被列出,其能够限定每个dex文件中最大的方法数,这里设置每个dex的最大方法数为52900。

5、 将第二个dex打包到APK中:使用aapt命令,aapt add 。

综上所属,修改后的脚本如下:

<condition property="multi-dex-ospath" value="${basedir}${outdir}" else="${basedir}/${outdir}" ><os family="windows"/></condition><condition property="mainDexClasses" value="${android-build-tools}/mainDexClasses.bat" else="${android-build-tools}/mainDexClasses" ><os family="windows"/></condition><path id="commonjars"> <fileset dir="${external-libs}"> <include name="android-support-*.jar"></include> <include name="imageloader_*.jar"></include> <include name="clientupdate_*.jar"></include> <include name="MaRuntime_*.jar"></include> <include name="pushservice-*.jar"></include></fileset></path><target name="multidex" depends="compile"><echo>dex:Converting compiled files and external libraries into ${outdir}...</echo><path id="inputdir"> <pathelement location="${outdir-classes}"/> <path refid="commonjars"/></path><property name="files" refid="inputdir"/><condition property="realfiles" value=""${files}"" else="${files}" ><os family="windows"/></condition><exec executable="${mainDexClasses}" failonerror="true" > <arg line="--output ${multi-dex-ospath}/classes_to_kepp_in_main_dex"/> <arg value="${realfiles}"/> </exec><apply executable="${dx}" failonerror="true" parallel="true"><arg value="--dex" /><arg value="--multi-dex" /> <arg value="--main-dex-list=${multi-dex-ospath}/classes_to_kepp_in_main_dex"/> <arg value="--set-max-idx-number=52900" /><arg value="--output=${multi-dex-ospath}" /><arg path="${outdir-classes}" /><fileset dir="${external-libs}" includes="*.jar"/><fileset dir="${appsearch-ui-path}/libs" includes="*.jar"> <exclude name="android-support-v4.jar"/></fileset></apply></target><property name="second_dex" value="classes2.dex" /><property name="second_dex_path" value="${multi-dex-ospath}/${second_dex}" /><target name="seconddex-check"> <condition property="has-second"> <available file="${second_dex_path}" /> </condition></target>

打包后运行,程序正常启动。

4. 遇到的问题

1、 mainDexClasses脚本在windows和linux下文件组的参数形式不同。 在windows下,脚本中的shift会将文件分隔符“;”替换成空格,导致参数获取错误,在文件组外部增加双引号,解决了该问题。

2、 生成文件组的jar包通配符问题,使用path和fileset解决了该问题。

3、 multidex兼容包创建目录失败的问题,参见:https://code.google.com/p/android/issues/detail?id=79388&q=multidex%20Failed%20to%20create%20dir&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。