본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android] Lazy loading dex files

by 돼지왕 왕돼지 2019. 1. 30.
반응형

[android] Lazy loading dex files


https://medium.com/@Macarse/lazy-loading-dex-files-d41f6f37df0e


65k method limit, app cache dir, ClassLoader, final dex, installSecondaryDexes, jar, lazy dex loading, lazy load, multidex, pre dex tool, pre-dex, predex position, predexed, proguard, provided, [android] Lazy loading dex files


-

65K method limit 을 넘어서면 multi dex 가 필요하다.



-

LOS 이전에서 MultiDex 를 사용하면 startup time 에 delay 가 있었다.



-

MultiDex lib source code 를 보면, 거기서 하는 일은. classloader 를 이용하여 추가 dex file 를 app 시작 시 로드하도록 프로그래밍 되어 있다.

왜 app 시작시 로드를 할까? 예를 들어 payment 에 관련된 lib 이 있다면 이런 녀석들은 사용되지 않을 수도 있는데.. 사용해도 나중에 로드해도 될텐데 말이다.



-

lazy load 를 하고 싶다면 우선 lazy load 하고 싶은 jar 을 pre-dex 하는 것이 중요하다.

이것은 dx tool 을 통해서 가능하며 /adt-bundle-mac-x86_64/sdk/build-tools/22.0.1/dx 느낌의 위치에 위치해 있다.

dx --dex --output=/path/to/the/library.dex /path/to/the/library.jar


dex file 을 얻은 후에 assets folder 에 넣는다.


그리고 code 에 dependency 로 추가하기 위해서 provided 로 mark 를 한다.

dependencies {

    provided 'com.squareup.picasso:picasso:2.5.2'

}


provided 로 명시해주면 해당 dependency 는 final dex 에서 제거된다.



-

predexed 된 녀석을 로딩하려면 assets folder 에서 app cache dir 로 옮긴 후, installSecondaryDexes() 를 호출해주면 된다.



-

resource 가 있는 경우에는 jar 가 아닌 aars 가 되기 때문에 이 방법을 사용할 수 없다.

그리고 predexed 된 녀석을 상속하거나 구현한 경우에는 proguard 를 적용할 수 없다.


필자는 모든 device 에서 test 한 것도 아니고, 1개의 dependency 만 테스트 한 것이기 때문에 production 에서 사용하려면 충분한 테스트가 필요하다.




반응형

댓글