[android] .dex 파일의 메소드 참조 수는 64k API 17을 초과 할 수 없습니다
SugarORM Library로 앱을 빌드하고 있지만 API 17 용 프로젝트를 빌드하려고하면 (다른 사람을 확인하지 않은 경우) 빌드 오류가 표시됩니다.
Information:Gradle tasks [:app:assembleDebug]
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:checkDebugManifest
:app:preReleaseBuild UP-TO-DATE
:app:prepareComAndroidSupportAnimatedVectorDrawable2330Library UP-TO-DATE
:app:prepareComAndroidSupportAppcompatV72330Library UP-TO-DATE
:app:prepareComAndroidSupportCardviewV72330Library UP-TO-DATE
:app:prepareComAndroidSupportDesign2330Library UP-TO-DATE
:app:prepareComAndroidSupportMediarouterV72300Library UP-TO-DATE
:app:prepareComAndroidSupportRecyclerviewV72330Library UP-TO-DATE
:app:prepareComAndroidSupportSupportV42330Library UP-TO-DATE
:app:prepareComAndroidSupportSupportVectorDrawable2330Library UP-TO-DATE
:app:prepareComAndroidVolleyVolley100Library UP-TO-DATE
:app:prepareComGithubSatyanSugar14Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServices840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAds840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAnalytics840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppindexing840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppinvite840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppstate840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAuth840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesBase840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesBasement840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesCast840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesDrive840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesFitness840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesGames840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesGcm840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesIdentity840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesLocation840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesMaps840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesMeasurement840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesNearby840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesPanorama840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesPlus840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesSafetynet840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesVision840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesWallet840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesWearable840Library UP-TO-DATE
:app:prepareMeDrakeetMaterialdialogLibrary131Library UP-TO-DATE
:app:prepareDebugDependencies
:app:compileDebugAidl UP-TO-DATE
:app:compileDebugRenderscript UP-TO-DATE
:app:generateDebugBuildConfig UP-TO-DATE
:app:generateDebugAssets UP-TO-DATE
:app:mergeDebugAssets UP-TO-DATE
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources UP-TO-DATE
:app:mergeDebugResources UP-TO-DATE
:app:processDebugManifest UP-TO-DATE
:app:processDebugResources UP-TO-DATE
:app:generateDebugSources UP-TO-DATE
:app:compileDebugJavaWithJavac
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
:app:compileDebugNdk UP-TO-DATE
:app:compileDebugSources
:app:prePackageMarkerForDebug
:app:transformClassesWithDexForDebug
Error:The number of method references in a .dex file cannot exceed 64K.
Learn how to resolve this issue at https://developer.android.com/tools/building/multidex.html
Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2
Information:BUILD FAILED
Information:Total time: 21.663 secs
Information:2 errors
Information:0 warnings
Information:See complete output in console
그러나 안드로이드 v5.0 이상을 위해이 프로젝트를 빌드하면 정상적으로 작동합니다. SugarORM gradle 의존성을 제거하면 장치 v4.2.2 및 v5.0 모두에서 잘 작동합니다.
답변
방법이 너무 많습니다. dex 에는 65536 메소드 만있을 수 있습니다 .
제안한대로 멀티 덱스 지원을 사용할 수 있습니다 .
이 줄을 다음에 추가하십시오 module/build.gradle
.
android {
defaultConfig {
...
// Enabling multidex support.
multiDexEnabled true
}
...
}
dependencies {
implementation 'com.android.support:multidex:1.0.3' //with support libraries
//implementation 'androidx.multidex:multidex:2.0.1' //with androidx libraries
}
또한 멀티 덱스 지원 라이브러리에서 애플리케이션 요소로 클래스를 Manifest
추가하십시오.MultiDexApplication
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.multidex.myapplication">
<application
...
android:name="android.support.multidex.MultiDexApplication">
<!-- If you are using androidx use android:name="androidx.multidex.MultiDexApplication" -->
<!--If you are using your own custom Application class then extend -->
<!--MultiDexApplication and change above line as-->
<!--android:name=".YourCustomApplicationClass"> -->
...
</application>
</manifest>
자신의 Application
클래스를 사용하는 경우 상위 클래스를에서 Application
로 변경하십시오 MultiDexApplication
.
그렇게 할 수 없다면 Application 클래스에서 다음 attachBaseContext
과 같이 메소드를 재정의하십시오 .
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(newBase);
MultiDex.install(this);
}
또 다른 해결책은 ProGuard로 사용하지 않는 코드를 제거 하는 것입니다.- ProGuard 를 실행하도록 앱 의 ProGuard 설정을 구성하고 릴리스 빌드에 대해 축소가 활성화되어 있는지 확인하십시오.
답변
android / app / build.gradle에서
android {
compileSdkVersion 23
buildToolsVersion '23.0.0'
defaultConfig {
applicationId "com.dkm.example"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
multiDexEnabled true
}
이것을 defaultConfig 안에 넣으십시오.
multiDexEnabled true
그것은 나를 위해 작동
답변
내 프로젝트에서 프로젝트 자동 업데이트 컴파일 버전을 코딩하는 동안이 오류 메시지가 나타납니다 build.gradle
.
android {
...
buildToolsVersion "23.0.2"
...
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support:design:23.4.0' }
버전을 수정하여 해결하십시오.
android {
...
buildToolsVersion "23.0.2"
...
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.android.support:design:23.0.1'
}
답변
이것이 나를 위해 일한 것입니다.
사용하지 않는 메소드가 너무 많기 때문에 발생합니다. 이러한 방법의 대부분은 build.gradle에 포함 된 라이브러리에서 제공됩니다.
축소 및 축소 리소스를 사용하여 gradle 로이 문제를 해결하고 동시에 코드를 정리하십시오.
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled true
shrinkResources true
}
}
답변
앱 레벨 build.gradle을 변경하십시오.
android {
compileSdkVersion 23
buildToolsVersion '23.0.0'
defaultConfig {
applicationId "com.dkm.example"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
multiDexEnabled true
}
그것은 나를 위해 일했다.
답변
이 오류는 afew 만 사용할 때 모든 Google Play 서비스 API를로드 할 때 발생할 수도 있습니다.
google에서 언급 한대로 : “6.5 이전의 Google Play 서비스 버전에서는 전체 API 패키지를 앱으로 컴파일해야했습니다. 경우에 따라 앱에 여러 메소드를 유지하기가 더 어려웠습니다 ( 65,536 한도 미만의 프레임 워크 API, 라이브러리 메서드 및 자체 코드).
6.5 버전부터 Google Play 서비스 API를 앱에 선택적으로 컴파일 할 수 있습니다. “
예를 들어 앱에 play-services-maps, play-services-location이 필요한 경우 아래와 같이 앱 수준에서 build.gradle 파일에 두 개의 API 만 추가하면됩니다.
compile 'com.google.android.gms:play-services-maps:10.2.1'
compile 'com.google.android.gms:play-services-location:10.2.1'
대신에:
compile 'com.google.android.gms:play-services:10.2.1'
답변
앱 참조가 65,536 개의 메소드를 초과 하면 앱이 Android 빌드 아키텍처의 한계에 도달했음을 나타내는 빌드 오류가 발생합니다.
안드로이드 5.0 이전의 멀티 덱스 지원
Android 5.0 (API 레벨 21) 이전의 플랫폼 버전은 Dalvik 런타임을 사용하여 앱 코드를 실행합니다. 기본적으로 Dalvik은 앱을 APK 당 단일 classes.dex 바이트 코드 파일로 제한합니다. 이 한계를 극복하기 위해 멀티 덱스 지원 라이브러리를 프로젝트에 추가 할 수 있습니다.
dependencies {
implementation 'com.android.support:multidex:1.0.3'
}
Android 5.0 이상에 대한 멀티 덱스 지원
Android 5.0 (API 레벨 21) 이상은 APK 파일에서 여러 DEX 파일로드를 기본적으로 지원하는 ART라는 런타임을 사용합니다. 따라서 minSdkVersion이 21 이상이면 멀티 덱스 지원 라이브러리 가 필요 하지 않습니다 .
64K 제한을 피하십시오
- ProGuard로 사용하지 않는 코드 제거-코드 축소 사용
에 대한 앱에서 멀티 덱스 구성
minSdkVersion이 21 이상으로 설정되어 있으면 모듈 수준 build.gradle 파일에서 multiDexEnabled를 true로 설정하기 만하면됩니다.
android {
defaultConfig {
...
minSdkVersion 21
targetSdkVersion 28
multiDexEnabled true
}
...
}
minSdkVersion이 20 이하로 설정된 경우 멀티 덱스 지원 라이브러리를 사용해야합니다
android {
defaultConfig {
...
minSdkVersion 15
targetSdkVersion 28
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.3'
}
Application 클래스를 재정의하고 다음과 같이 MultiDexApplication 을 확장하도록 변경하십시오 (가능한 경우).
public class MyApplication extends MultiDexApplication { ... }
매니페스트 파일에 추가
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<application
android:name="MyApplication" >
...
</application>
</manifest>