【错误解决】Android APK 方法数量限制

错误:# Cannot fit requested classes in a single dex file (# methods: 74519 > 65536)

最近开发安卓程序遇到以下错误:

Cannot fit requested classes in a single dex file (# methods: 74519 > 65536)

翻译:
无法将请求的类放入单个dex文件(#方法:74519>65536)

大致意思是Android App中的方法数超过65535,如果往下兼容到低版本设备时,就会报编译错误,尤其在引入一些jar包之后容易出现这个错误,因为一些Android系统定义单个dex的总方法数的最大值是65535,当你引入一些jar包后方法超过65535个方法。一个dex已经装不下了,需要个多个dex,也就是multidex。

解决方案

1.配置依赖

在app目录下的build.gradle文件里的dependencies下添加如下依赖:

implementation 'com.android.support:multidex:1.0.3'

然后在android下的defaultConfig添加以下配置:

multiDexEnabled true

配置好后我的文件内容如下:
build.gradle

plugins {  
  id 'com.android.application'  
}  
  
android {  
  compileSdkVersion 30  
  buildToolsVersion "30.0.2"  
  
  defaultConfig {  
  applicationId "minuy.android.nlecloud"  
  minSdkVersion 16  
  targetSdkVersion 30  
  versionCode 1  
  versionName "1.0"  
  
  testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"  
  
  multiDexEnabled true  
  }  
  
  buildTypes {  
  release {  
  minifyEnabled false  
  proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'  
  }  
 }  
  compileOptions {  
  sourceCompatibility JavaVersion.VERSION_1_8  
  targetCompatibility JavaVersion.VERSION_1_8  
  }  
}  
  
dependencies {  
  
  implementation 'androidx.appcompat:appcompat:1.2.0'  
  implementation 'com.google.android.material:material:1.2.1'  
  implementation 'androidx.constraintlayout:constraintlayout:2.0.2'  
  implementation project(path: ':nlecloud-sdk')  
    testImplementation 'junit:junit:4.+'  
  androidTestImplementation 'androidx.test.ext:junit:1.1.2'  
  androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'  
  implementation("com.squareup.okhttp3:okhttp:4.9.0")  
  
    implementation 'com.android.support:multidex:1.0.3'  
}

2.自定义Application子类

新建一个Java类并继承自Application
覆盖onCreate方法。
onCreate方法里加入如下语句:

MultiDex.install(this);

我的Java类内容如下:
MainApplication.java

package minuy.android.nlecloud;  
  
import android.app.Application;  
import androidx.multidex.MultiDex;  
  
public class MainApplication extends Application {  
    @Override  
  public void onCreate() {  
        super.onCreate();  
        MultiDex.install(this);  
    }  
}

3.配置AndroidManifest.xml

application下加入如下语句:

android:name=".{$刚刚新建的类名}"

例如我的:

android:name=".MainApplication"

配置好后,我的AndroidManifest.xml文件内容如下:
AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>  
<manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  package="minuy.android.nlecloud">  
  
    <uses-permission android:name="android.permission.INTERNET" />  
  
    <application  
  android:name=".MainApplication"  
  android:allowBackup="true"  
  android:icon="@drawable/ic_launcher_icon"  
  android:label="@string/app_name"  
  android:roundIcon="@drawable/ic_launcher_icon"  
  android:supportsRtl="true"  
  android:theme="@style/Theme.NleCloud">  
        <activity android:name=".StartActivity">  
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" />  
  
                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
        </activity>   
    </application>  
  
</manifest>

问题解决!

参考:

https://blog.csdn.net/m0_37707561/article/details/84983184

posted @ 2020-11-03 21:24  清风来叙  阅读(663)  评论(0编辑  收藏  举报