APK 파일에는DEX(Dalvik Executable)파일 형식의 실행 가능한 바이트코드 파일이 포함됩니다.
단일 DEX 파일 내에서 참조할 수 있는 메서드의 총 개수를 65,636으로 제한하며 이 DEX 파일에는 프레임워크 메서드, 라이브러리 메서드, 본인 앱에서 정의한 메서드가 모두 포함됩니다. 즉 앱 내의 모든 메서드가 65,536개를 넘어서 이러한 에러가 발생한 것입니다. 64 * 1024의 값과 동일하며 이 제한을 64K 참조 제한이라고 합니다.
안드로이드 L (롤리팝, 5.0 API 21 ) 미만의 플랫폼 버전에서는 앱 코드 실행을 위해 Dalvik 런타임을 사용합니다. APK당 하나의 classes.dex 바이트코드 파일로 앱을 제한합니다. 이러한 제한을 해결하기 위해multidex지원 라이브러리를 사용할 수 있습니다.
안드로이드 L (롤리팝 5.0 API 21) 이상에서는 Dalvik이 아닌 ART (Android Runtime)이라는 런타임을 사용합니다. 이 런타임은 APK 파일로부터 여러 개의 DEX 파일을 로드하는 것을 지원합니다. ART는 앱 설치 시에 사전 컴파일 수행하여classesN.dex파일들을 스캔하고, 안드로이드 기기가 실행할 수 있도록.oat파일로 컴파일 합니다.
그래서 minSdkVersion21이상이라면multidex지원 라이브러리가 필요없습니다. build.gradle에 간단하게 multiDexEnabled true만 추가하면 됩니다.
multidex 속도가 느린 이유?
각 DEX 파일들을 빌드할 때 빌드 툴(buildToolsVersion)은 주 DEX 파일에 어떤 클래스들을 포함할지 고르는 아주 복잡한 의사결정을 수행하게 됩니다. 이러한 과정이 없다면 앱 실행에 필요한 클래스들이 주 DEX에 포함되어있지않아 Crash가 나기때문입니다. 그래서 이러한 과정을 거치게되는데 시간이 상당히 오래걸립니다.
네이티브 코드가 주 dex에 포함이 안되는 경우?
네이티브 코드를 사용하는 라이브러리를 포함한다고 생각해 봅시다. 그 라이브러리에서 네이티브(JNI) 코드를 사용하게되면 의사결정 과정에서 라이브러리가 구동되기위해 필요한 클래스들이 주 DEX 파일에 포함되지 않을 수 있습니다. 그럴 경우에는 multiDexKeepFile,multiDexKeepProguard를 사용해서 주 DEX에 포함시키도록 해야합니다.
빌드 최적화
위에도 써놨듯이multidex는 복잡한 의사결정을 수행하면서 빌드 시간이 상당히 커질 수 밖에 없습니다. 빌드 시간을 줄이기 위해서 빌드 사이에 multidex를 재사용하는pre-dexing을 사용할 수도 있습니다. 하지만Android 5.0 롤리팝이상인ART환경에서만 가능합니다.
Android Studio 2.3이상인 경우는IDE에서 자동으로pre-dexing을 사용하기 때문에 별도로 작성할 것은 없습니다.android studio와gradle plugin은 최신버전으로 업데이트하면 빌드 속도를 최적화하는 기능들이 추가적으로 들어있기 때문에 항상 최신버전으로 유지하는 것이 좋습니다.
multidex의 알려진 문제들.
- 단말기에 DEX 파일들을 설치할 때, 두번째 DEX 파일이 클 경우에ANR(Android Not Responding)이 발생할 수 있습니다. 이를 막기 위해서ProGuard에서 코드축소(Code Shrinking)을 해야 합니다.
- Android 5.0 롤리팝 미만에서 실행할 경우 linearalloc limit (issue 78035)이슈를 완전히 막을 수 없습니다.
Sourcetree 3.3.6 with windows 10 not updating UI contents or not refreshing views. If you want to see updated view then you need to restart app. any solution for this?
WinSplit Revolution(윈스플릿 레볼루션)는 모니터 화면에 보이는 여러개의 창 위치와 크기를 관리해주는 프로그램이다. 단축키를 설정해서 사용할 수도 있고, 가상패드를 열어두고 클릭해서 사용해도 된다. 위치시키고자 하는 곳과 원하는 창크기를 한번 설정해두면, 단축키로 촤우측, 상하단 순식간에 이동시킬 수 있다.
▲ 화면을 위와 같이 쓰고 있는데,
▲ 위와 같이 정렬시키고 싶다면,
▲ WinSplit Revolution(윈스플릿 레볼루션)은 이를 손쉽게 해결해준다.
예를들어 1. 원하는 화면 위치에 (X, Y좌표값 설정) 2. 원하는 창사이즈로 크기를 조절하여 (width, height 설정) 3. 이동시킬 수 있다. (단축키 또는 가상패드)
▲ 숫자가 많이 보여 어려워 보일 수 있지만 직관적이고 단순하다.
위에 빨간색 동그라미 친부분을 해석하면 아래와 같다. - Down : 하단 위치 (구분짓기 위함인데 상단에 좌표를 두어도 무관하다) - 1, 2 : X Y 위치 좌표 값, width height 창크기 값 - Add, Edit, Delete : 설정에 대한 추가, 수정, 삭제 - Preview : 설정된 화면 미리보기
듀얼모니터를 사용한다면 단축키를 사용하여 창을 좌측화면으로 또는 우측화면으로 한번에 넘길 수도 있다.
윈도우 관리 프로그램으로 정말 최고다. 게다가 용량이 약 1MB로 가볍기까지 하다.
한번 사용해보면 여러 설명이 굳이 필요없다. 그리고 WinSplit Revolution 프로그램이 설치되있지 않은 컴퓨터에서 컴퓨터를 사용하려 한다면 답답함을 느끼게 될 것이다. 한번 빠져들면 헤어나오기 힘들다.
▶ WinSplit Revolution v 11.04 프로그램 다운로드 > 네이버 소프트웨어
Winsplit로 검색해도 프로그램이 나오긴 하는데, 2002년 업데이트 된 초기 Winsplit으로 v1.0.8 버전이다. WinSplit Revolution v 11.04를 다운 받아야 한다~
윈도우10 이후로 네이버웨일 브라우저나 이미지뷰어프로그램 등 WinSplit Revolution이 동작되지 않았다. 프로그램 에런가 했는데 알고보니 권한이 부여되지 않아 WinSplit Revolution이 창을 제어하지 못하는 이유였다. 아래와 같이WinSplit Revolution에 관리자 권한을 부여하면 이용하는데 문제가 없다.
WinSplit Revolution 실행 아이콘에 마우스 오른쪽 클릭 후 관리자 권한으로 실행하면 된다. 매번 관리자 권한으로 실행하는게 번거로우니 아래와 같이 속성에 들어가서 설정을 해두면 편리하다.
▲ 호환성 탭으로 이동 후, 아래에 관리자 권한으로 이 프로그램 실행에 체크를 해주면 된다.