안드로이드 64K 메소드 한계 돌파

29314 단어 안드로이드 여행
안드로이드 플랫폼의 끊임없는 발전과 확대에 따라 시장에서 크고 완전한 응용이 비일비재하고 제품 수요의 변경과 UI 상호작용의 극치 추구는 Resources 파일의 증가를 제외하고 안드로이드 프로젝트에서 의존하는 Library와 자신이 쓴 자바 코드도 점점 많아질 것이다.이러한 변화로 인해 패키지화된 APK 파일이 점점 커지는 것을 제외하고 프로젝트에 포함된 java 코드의 메소드 수(method count)가 피크 값을 초과하면 컴파일 과정에서 다음과 같은 오류가 발생합니다.
이전 버전의 컴파일 시스템에서 다음과 같은 오류가 발생했습니다.
1
2
Conversion to Dalvik format failed:
Unable to execute dex: method ID not in [0, 0xffff]: 65536

최신 버전의 컴파일 시스템에서 다음과 같은 오류가 발생했습니다.
1
2
3
trouble writing output:
Too many field references: 131000; max is 65536.
You may try using --multi-dex option.

비록 서로 다른 버전의 컴파일링 시스템에 나타난 오류 내용은 모두 같지 않지만 구체적인 숫자를 언급했다. 즉 본고가 말하고자 하는 핵심 내용인 안드로이드 64K Method Counts Limit의 최고치이다.자세한 내용은 홈페이지 이용자 안내서: Configure Apps with Over 64K Methods 참조
Android 64K Method Counts Limit
Android Project는 컴파일링을 통해 자바 코드(Library 포함)가 DEX 형식의 바이트 파일로 바뀌었습니다. 이것은 안드로이드 5.0 이전의 Dalvik 가상기에서 결정된(5.0 이후 ART 가상기 포함)이고 short 형식으로 DEX 파일의 method를 인용한 것입니다. 이것은 method 수량의 최고치 크기에 위험을 묻었습니다.short 유형이 표시할 수 있는 최대치는 65536이다. 즉, 한 DEX 파일 중 최대 65536개의method만 인용할 수 있다. 코드가 일부분을 초과한method 인용을 실행하면 methodNotFound 등 오류가 발생할 수 있다.1K는 102465536과 마침 64K로 호칭과 사용에 편리하도록 이 제한을 64K 방법수의 인용제한이라고 통칭한다.
64K 방법수 제한 문제를 해결하기 위해 프로젝트에서 multidex 설정을 사용할 수 있습니다. 프로젝트의 방법수 (안드로이드 프레임워크, library, 우리가 직접 쓴 코드 포함) 가 64K를 초과할 때 컴파일링 시스템은 자동으로 여러 개의 DEX 파일을 컴파일합니다.
Multidex Support
안드로이드 5.0 이전에 안드로이드 시스템은 Dalvik 가상 기기를 사용했는데 JIT기술(Just-in-time compilation, 즉각적으로 컴파일하고 실행할 때 DEX 바이트 파일을 컴파일하는 것을 사용했다. 이것은 예전에 안드로이드 휴대전화 사용자들이 iOS 시스템보다 안드로이드 시스템이 카드를 실행하는 것을 자꾸 비난하는 이유이기도 하다. 모든 APK 파일에는 DEX 파일classes.dex만 포함할 수 있도록 제한했다.Google은 이 제한을 벗어나기 위해 multidex support library 호환 패키지를 제공합니다. 프로그램이 여러 개의 DEX 파일을 불러올 수 있도록 도와주고, 이 호환 패키지는 프로그램의 주 DEX 파일로 관리자의 다른 DEX 파일에 접근합니다.
주의: Instant Run 메커니즘이 multidex 원리를 이용하기 때문에 프로젝트minSdkVersion의 매개 변수를 20 또는 더 작게 설정하고 안드로이드 4.4(API level 20) 또는 더 낮은 버전의 장치에서 실행할 때Instant Run는 효력을 상실합니다.
안드로이드 5.0 이후 안드로이드 시스템은 ART 가상 기기(Android RunTime)를 사용했다. OAT 기술(Ahead-of-time, 사전 컴파일링을 사용하고 응용 프로그램을 설치할 때 응용 프로그램의 모든 DEX 파일을 스캔하여 .oat 형식의 파일로 컴파일하여 안드로이드 기기에서 실행할 수 있기 때문에 Dalvik 가상 기기의 응용에 비해 설치 시간이 길다).따라서 ART 가상 머신에 있는 안드로이드를 사용하면 APK 파일의 여러 DEX 로드가 자동으로 지원된다는 의미로 해석된다.
참고: Instant Run를 사용할 때 프로젝트의 minSdkVersion 매개 변수가 21 이상으로 설정되면 Android Studio 컴파일링이 실행될 때 응용 프로그램이 멀티덱스를 지원하도록 자동으로 설정됩니다.그러나 Instant Run debug 버전에만 적용되기 때문에 64K 방법의 제한을 피하기 위해release 버전에 멀티덱스를 설정해야 한다.
Config for Multidex With Gradle
Android Gradle 플러그인은 Android SDK Build Tools 21.1 및 더 높은 버전의 컴파일 도구에서 multidex를 컴파일 설정의 일부로 지원하기 때문에 Android SDK Build Tools tools가 21.1 이상으로 업데이트되었는지 확인한 다음 응용 프로그램의 multidex 부분을 설정합니다.
첫 번째 단계에서는 프로젝트가 multidex를 사용할 수 있도록 app/build.grale 파일을 수정합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
android {

    compileSdkVersion 21
    buildToolsVersion "21.1.0"

    defaultConfig {
        ...

        // Enabling multidex support.
        multiDexEnabled true
    }
    ...
}

dependencies {
  compile 'com.android.support:multidex:1.0.0'
}

2단계, 수정AndroidManifest.xml 파일, 참조MultiDexApplication 클래스:
1
2
3
4
5
6
7
8
9

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.yifeng.mdstudysamples">
    <application
        ...
        android:name="android.support.multidex.MultiDexApplication">
        ...
    application>
manifest>

이 설정을 추가하면 컴파일러 도구는 주 DEX 파일 (classes.dex) 과 다른 DEX 파일 (classes2.dex,classes3.dex 등, 필요하면) 을 구축하고 컴파일러 시스템은 그들을 APK 파일로 포장합니다.
주의: 일반적으로 프로젝트에서 계승된 Application 클래스를 사용자 정의할 것입니다. 이 경우 다시 쓰기 attachBaseContext() 방법이 필요하며, 이 방법에서 MultiDex.install(this) 를 호출해서 멀티덱스를 지원합니다. 참고: MultiDex Application:
Optimizing Multidex Development Builds
multidex 설정에서의 응용은 컴파일링 시스템이 복잡한 DEX 분할 연산을 거쳐야 하기 때문에 프로젝트의 컴파일링 시간을 증가시켜 개발자의 개발 효율에 영향을 미친다.우리는 제품Flavors를 사용하여 개발 환경과 정식 환경의 서로 다른 flavors를 구축하여 멀티덱스의 장시간 컴파일 문제를 최적화할 수 있다.
development flavor의 경우 설정minSdkVersion 값이 21이고 안드로이드 5.0 이상의 버전에서 실행되는 장치에서는 ART-supported 형식으로 멀티덱스를 생성하는 속도가 훨씬 빠르다.release flavor의 경우 minSdkVersion 값은 실제 지원되는 버전을 적용하는 것으로 설정되며, 컴파일 시스템은 다중 장치에 적합한 multidex APK 파일을 생성하는 데 시간이 오래 걸립니다.예:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
android {
    productFlavors {
        // Define separate dev and prod product flavors.
        dev {
            // dev utilizes minSDKVersion = 21 to allow the Android gradle plugin
            // to pre-dex each module and produce an APK that can be tested on
            // Android Lollipop without time consuming dex merging processes.
            minSdkVersion 21
        }
        prod {
            // The actual minSdkVersion for the application.
            minSdkVersion 14
        }
    }
          ...
    buildTypes {
        release {
            runProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                                                 'proguard-rules.pro'
        }
    }
}
dependencies {
  compile 'com.android.support:multidex:1.0.0'
}

이렇게 하면 개발 단계에서 devDebug 유형의 변종 앱을 사용하여 혼동을 없애고 multidex를 지원하며 5.0 및 이상 버전의 장치에서 실행하여 컴파일 과정을 가속화할 수 있다.flavors에 대한 정보는 예전에 안드로이드는Gradle을 이용하여 앱의 환경 분리를 실현하고 더 많은 정보는 영문 매뉴얼:Gradle Plugin User Guide, 중국어 버전에 대응하는 번역문:Gradle 안드로이드 플러그인 사용자 안내서 번역을 참고할 수 있습니다.
Methods Count Statistics
비록 안드로이드 시스템이multidex를 지원하지만 우리는 우리의 응용을 분석하고 각 부분의 방법수를 살펴보며 불필요한 방법을 줄이는 것을 배워야 한다.여기에 몇 가지 도구를 추천해서 우리가 분석하는 것을 돕는다.
Library Methods count
온라인으로 안드로이드 리브레리 방법수를 집계하는 사이트는 안드로이드 분야에서 흔히 볼 수 있는 리브레이스 방법수, JAR 파일과 DEX 파일의 크기를 집계하고 다양한 버전을 선택해 그래프 형식으로 보여준다.
이 웹 사이트에서는 Android Studio의 플러그인을 제공하여 프로젝트에서 의존하는 libraries의 방법 수를 그림과 같이 분석합니다.
Apk Method Count
온라인으로 APK 파일 메소드 수를 집계하는 오픈 소스 항목으로, 분석할 APK 파일을 여기에 끌어다 올리기만 하면 다음과 같은 분석 결과를 얻을 수 있습니다.
Android Studio APK Analyzer
마지막으로 안드로이드 스튜디오가 자체로 가지고 있는 APK Analyzer를 강력하게 추천합니다. 기능이 완비되고 사용이 편리하기 때문에 안드로이드 개발자가 분석 응용을 하는 데 있어서 두 가지 선택이 없습니다.Android Studio APK Analyzer 를 사용하면 최소한 다음과 같은 작업을 수행할 수 있습니다.
APK 압축 파일의 각 하위 파일 크기(예: DEX 및 resource 파일) 보기DEX 파일의 구조 이해APK 파일의 버전 정보를 신속하게 보기AndroidManifest.xml 두 APK 파일의 내용을 시각적으로 비교개발 단계에서 Android Studio를 사용하여 프로젝트를 열 때 APK Analyzer 도구를 사용하는 세 가지 방법이 있습니다.
APK 파일을 Android Studio 편집 창으로 직접 드래그항목 디렉토리app/build/outputs/apk/에서 APK 파일 열기를 두 번 클릭합니다.
메뉴 표시줄Build->Analyse APK...을 클릭하고 APK 파일을 선택합니다.

좋은 웹페이지 즐겨찾기