传统的java程序,java的源文件或者kt文件,经过编译会生成class文件,最终运行在java虚拟机上。但是android的手机内存有限,所以针对手机,android把class文件重新经过翻译解释打包等过程,打包成dex文件,dex文件包括了多个class文件,包括class文件的常量池等,可以理解为对原有的class文件做了压缩,去冗余,使得dex文件更小,运行起来更快,更适用于移动设备
区别于传统的JAVA程序,android程序的编译过程:
一个简单的安卓程序,编译生成apk的时候,默认的apk结构是:
|-- AndroidManifest.xml
|-- assets/
|-- res/
|-- META-INF/
|-- resources.arsc
|-- classes.dex
原生的编译过程,只会生成一个dex文件,但是由于工程的扩展,我们经常会遇到65536的错误,意思是dex文件中的方法超限了。为啥是65536呢:
|-- classes.dex -- 结构 -- .dex file
header
constant pool ---------method id 方法索引,它是一个USHORT类型
class defination1
...
class defination n
data
在dex文件中,所有的方法通过一个USHORT类型的索引进行索引,而USHORT的长度是0~65535,所以当方法超过这个限制的时候,就会报这个错误,如果规避这个错误呢?android提供了一个方案 : Muti - dex
defaultConfig {
minSdkVersion 21
targetSdkVersion 28
multiDexEnabled true
defaultConfig {
minSdkVersion 14
targetSdkVersion 28
multiDexEnabled true
build.gradlew中minisdkversion支持兼容的最新的sdk版本小于21,说明需要支持5.0以下的版本,此时需要手动的添加依赖
dependencies {
implementation 'androidx.multidex:multidex:2.0.1'
}
需要将应用的application和MultiDexApplication进行绑定,绑定方式有三种:
(1)androidmanifest 中直接定义
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<application 直接使用support下的MultidexApplication
android:name="com.xxx.MultidexApplication" >
...
</application>
</manifest>
(2)自定义的application直接继承MultidexApplication
public class MyApplication extends MultidexApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
(3)如果application已经继承了自定义的application,此时需要在attachBaseContext中,install
public class MyApplication extends SomeOtherApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
采用multidex的方式,最后生成的apk,会有多个dex
本文地址:https://blog.csdn.net/xing_827/article/details/107355275
如对本文有疑问, 点击进行留言回复!!
Mybatis PersistenceException异常:Error building SqlSession The error may exist in SQL Mapper Configur
MyBatis——动态SQL语句——if标签和where标签复合使用
网友评论