无法在单个 dex 文件中容纳请求的类(# 方法:86965 > 65536)

问题描述 投票:0回答:4

*更新:运行 ProGuard 来减少我的资源后,ProGuard 似乎正在删除重要的代码: 错误:在 org.gradle.api.Project 类型的根项目“Google 地图演示”上找不到参数 [build_7b52k4yyeks9l2efdeec28zeo$_run_closure2@6cc7c31f] 的方法 android()。 更新了 build.gradle 代码:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        google()
        jcenter()
        mavenLocal()

    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.0'
        classpath 'com.google.gms:google-services:4.3.2'


        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        maven { url 'https://maven.fabric.io/public' }
        maven {
            url "https://maven.google.com"
        }
    }
}

android {
    buildTypes {
        release {
            // Enables code shrinking, obfuscation, and optimization for only
            // your project's release build type.
            minifyEnabled true

            // Enables resource shrinking, which is performed by the
            // Android Gradle plugin.
            shrinkResources true

            // Includes the default ProGuard rules files that are packaged with
            // the Android Gradle plugin. To learn more, go to the section about
            // R8 configuration files.
            proguardFiles getDefaultProguardFile(
                    'proguard-android-optimize.txt'),
                    'proguard-rules.pro'
        }
    }

}


task clean(type: Delete) {
    delete rootProject.buildDir
}

我正在使用 Android Studio 使用 Android 的编码教程(https://www.youtube.com/watch?v=eiexkzCI8m8)来实现 Google 地图 api。我在 Java 编译器中收到“D8 错误”错误和两个错误。 错误 #1:“由 com.android.tools.r8.CompilationFailedException 引起:编译未能完成”

错误 #2:“由 com.android.tools.r8.utils.AbortException 引起:错误:null,无法在单个 dex 文件中容纳请求的类(# 方法:86965 > 65536)”

有人看到问题了吗?

这是我的java代码:

public class MainActivity extends FragmentActivity implements OnMapReadyCallback{

    GoogleMap map;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        map = googleMap;

        LatLng Brockton = new LatLng(42.0895988,-70.9798322);
        map.addMarker(new MarkerOptions().position(Brockton).title("Brockton"));
        map.moveCamera(CameraUpdateFactory.newLatLng(Brockton));
    }
}
java android google-maps
4个回答
4
投票

解决方案:

打开应用程序级别的 build.gradle 文件。只需在 android->defaultConfig->

multiDexEnabled true

中写入即可

代码以便更好地理解。

android {
    defaultConfig {
        multiDexEnabled true
    }

1
投票

这不是你的代码的错误,而是因为你对谷歌地图的依赖。

这为您的应用程序添加了很多方法,突破了每个 dex 文件 64k 的限制。解决办法有两种:

使用MultiDex:https://developer.android.com/studio/build/multidex Android Studio会生成多个dex文件,所以没有达到限制。

使用 ProGuard 删除未使用的方法:https://developer.android.com/studio/build/shrink-code 未调用的方法不会添加到您的 dex 文件中。与混淆相结合,这始终是一个好主意。


1
投票

写:

multiDexEnabled true

在 build.gradle(app) 文件中


1
投票

在android>app>build.gradle中添加defaultConfig:

defaultConfig {
    
    multiDexEnabled true

    }
© www.soinside.com 2019 - 2024. All rights reserved.