Android 하 도 급 MultiDex 정책 상세 설명
여기 서 먼저 MultiDex 의 생 성 배경 을 소개 합 니 다.
Android 시스템 이 응용 프로그램 을 설치 할 때 한 단 계 는 Dex 를 최적화 하 는 것 입 니 다.이 과정 은 DexOpt 라 는 전문 적 인 도구 가 있 습 니 다.DexOpt 의 실행 과정 은 Dex 파일 을 처음 불 러 올 때 실 행 됩 니 다.이 과정 에서 Optimised Dex 라 는 ODEX 파일 이 생 성 됩 니 다.ODex 를 실행 하 는 효율 은 Dex 파일 을 직접 실행 하 는 것 보다 훨씬 높 습 니 다.
그러나 초기 안 드 로 이 드 시스템 에서 DexOpt 에 문제 가 있 었 습 니 다.DexOpt 는 모든 유형의 방법 id 를 검색 하여 링크 구조 에 존재 합 니 다.그러나 이 링크 의 길 이 는 하나의 short 형식 으로 저장 되 어 있 기 때문에 방법 id 의 수량 은 65536 개 를 초과 할 수 없습니다.한 항목 이 충분 할 때,분명히 이 방법의 상한 선 은 부족 하 다.새 버 전의 Android 시스템 에서 DexOpt 가 이 문 제 를 복 구 했 음 에 도 불구 하고 저 버 전의 Android 시스템 을 호 환 해 야 합 니 다.
방법 수 초과 문 제 를 해결 하기 위해 서 는 이 dex 파일 을 두 개 이상 뜯 어야 한다.이 를 위해 구 글 은 공식 적 으로 multidex 호 환 패 키 지 를 내 놓 았 고 AndroidStudio 와 함께 APK 에 여러 dex 를 포함 하 는 기능 을 실현 했다.
Google 은 Android 개발 에서 App 코드 에 새로운 기능 을 추가 하고 새로운 라 이브 러 리 를 도입 합 니 다.제어 하지 않 으 면 편집기 IDE 에 오류 가 발생 합 니 다.
Error:Execution failed for task ':ttt:transformClassesWithDexForDebug'.
com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
이 오 류 는 안 드 로 이 드 응용 프로그램의 방법 총수 에 제한 이 있어 서 생 긴 것 이다.Android 플랫폼 의 Java 가상 머 신 Dalvik 은 DEX 형식의 Java 응용 프로그램 을 실행 할 때 DEX 파일 의 방법 을 네 이 티 브 형식 short 로 색인 합 니 다.이 는 하나의 DEX 파일 이 인 용 될 수 있 는 방법의 총 수 를 65536 으로 제한 한 다 는 뜻 이다.일반적으로 APK 는 classes.dex 파일 을 포함 하기 때문에 안 드 로 이 드 응용 방법 은 이 수량 을 초과 할 수 없습니다.이것 은 안 드 로 이 드 프레임 워 크,라 이브 러 리 와 자신 이 개발 한 코드 를 포함 합 니 다.이 문 제 는 하나의 DEX 파일 을 여러 개의 DEX 파일 로 나 누 어 해결 할 수 있다.
2.하 도 급 전략 실현
Gradle 설정:
defaultConfig {
applicationId "XXX"
minSdkVersion 14
targetSdkVersion 23
multiDexEnabled true
}
.......
dependencies {
compile 'com.android.support:multidex:1.0.0'
}
응용 프로그램 클래스 재 작성 방법:
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
3.하 도 급 효과 설명이상 의 설정 을 통 해 당신 의 응용 프로그램 은 이미 여러 개의 DEX 파일 을 실현 할 수 있 습 니 다.빌 드 를 사용 할 때 빌 드 도 구 는 첫 번 째 DEX 파일 에 어떤 종 류 를 두 어야 하 는 지,추가 DEX 파일 에 어떤 종 류 를 넣 을 수 있 는 지 분석 합 니 다.첫 번 째 DEX 파일 을 만 든 후에 필요 하 다 면 classes 2.dex,classes 3.dex 와 같은 추가 DEX 파일 을 계속 만 들 것 입 니 다.Multidex 지원 라 이브 러 리 는 첫 번 째 DEX 파일 에 포함 되 어 다른 DEX 파일 에 접근 할 수 있 도록 도 와 줍 니 다.
Google 이 전체 방법 수 제한 을 적용 하 는 문 제 를 해 결 했 지만 개발 자가 프로젝트 규 모 를 임의로 확대 할 수 있 는 것 은 아 닙 니 다.Multidex 는 여전히 약간의 제한 이 있 습 니 다.
DEX 파일 이 장치 에 설치 되 는 과정 은 매우 복잡 하기 때문에 두 번 째 DEX 파일 이 너무 크 면 응용 프로그램 이 응답 하지 않 을 수 있 습 니 다.이 때 는 ProGuard 를 사용 하여 DEX 파일 의 크기 를 줄 여야 합 니 다.
Dalvik linearAlloc 의 Bug 때문에 Android 4.0 이전 버 전에 서 응용 프로그램 을 시작 할 수 없습니다.이 버 전 을 지원 하려 면 테스트 를 많이 실행 해 야 합 니 다.
마찬가지 로 Dalvik linearAlloc 의 제한 으로 인해 대량의 메모 리 를 요청 하면 충돌 할 수 있 습 니 다.Dalvik linearAlloc 는 고정 크기 의 버퍼 입 니 다.응용 프로그램 을 설치 하 는 과정 에서 시스템 은 dexot 라 는 프로그램 을 실행 하여 현재 기종 에서 실 행 될 준 비 를 합 니 다.devot 는 LinearAlloc 를 사용 하여 응용 방법 정 보 를 저장 합 니 다.Android 2.2 와 2.3 의 버퍼 는 5MB 에 불 과 했 고,Android 4.x 는 8MB 또는 16MB 로 높 아 졌 다.방법 수량 이 너무 많 으 면 버퍼 를 초과 하 는 시간 이 많 으 면 dexopt 붕 괴 를 초래 할 수 있 습 니 다.
-Multidex 구축 도 구 는 첫 번 째 DEX 파일 에 포함 되 어야 하 는 종 류 를 지정 하 는 것 을 지원 하지 않 기 때문에 일부 라 이브 러 리(예 를 들 어 특정한 라 이브 러 리 는 네 이 티 브 코드 에서 자바 코드 를 방문 해 야 함)를 사용 할 수 없습니다.
4.개발 자 에 대한 조언
개발 자 는 13000 여 개의 방법 을 포함 하 는 Google Guava 와 같은 라 이브 러 리 를 사용 하 는 것 을 피해 야 합 니 다.
모 바 일 애플 리 케 이 션 을 위 한 Lite/Android 버 전 라 이브 러 리 를 사용 하거나,잭 슨 JSON 을 Google-gson 으로 교체 하 는 등 작은 라 이브 러 리 를 사용 합 니 다.Google Protocol Buffers 와 같은 데이터 교환 형식 은 자동 으로 많은 방법 을 생 성 합 니 다.Square Wire 의 실현 으로 이 문 제 를 잘 해결 할 수 있 습 니 다.
하 도 급 을 적용 한 후 저 버 전 휴대 전 화 를 사용 할 수 없고,고 버 전이 정상적으로 사용 되 는 문제 가 발생 했 을 때 하 도 급 의 설정 이 정확 한 지 확인 할 수 있다.
총결산
이상 은 바로 본 고 에서 안 드 로 이 드 하 도 급 MultiDex 전략 에 대해 상세 하 게 설명 한 모든 내용 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.관심 이 있 는 친 구 는 본 사이트 의 다른 관련 내용 을 계속 참고 할 수 있 습 니 다.부족 한 점 이 있 으 면 댓 글로 지적 해 주 십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.