일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 27 | 28 | 29 |
30 | 31 |
- 물걸레로봇청소기추천
- Google App Engine
- 가상화
- 구글 앱 엔진
- 증강현실
- 멤버십
- 패턴 인식
- 빅데이터
- 파이썬
- BAM
- 하이퍼바이저
- 동아리
- Friendship
- NarwalFreo
- 신경망
- 인공지능
- hopfield network
- 삼성소프트웨어멤버십
- 물걸레자동세척로봇청소기
- 삼성전자 소프트웨어멤버십 SSM
- 삼성
- Bidirectional Associative Memory
- 패턴인식
- 신경회로망
- SSM
- 고려대학교
- Neural Network
- Python
- 나르왈프레오
- 갤럭시탭S8울트라
- Today
- Total
정보공간_1
[4기 신촌 박영웅] Android Application Stealth Update (2) 본문
[4기 신촌 박영웅] Android Application Stealth Update (2)
알 수 없는 사용자 2013. 12. 2. 00:52안녕하세요. 신촌 멤버십 22-2기 박영웅입니다.
지난 글에 이어 Android Application의 Stealth Update 구현과 관련된 내용을 설명드리겠습니다.
이번 글에서 설명드릴 부분은 DexClassLoader의 사용입니다.
간단한 예를 통해 알아볼까요?
어플리케이션의 일부분에서 특정 항목에 대한 점수를 계산하는 기능이 있습니다.
하지만 점수 환산법이 주기적으로 변경될 것이라 예상되고있습니다.
때문에 점수를 매기는 기능을 수행하는 클래스는 주기적으로 변경되어야 하며
잦은 업데이트를 초래할 수 밖에 없는 상황입니다.
우선 현재는 일반적인 평균을 적용하는 부분을 최대 최소를 제외한 값의 평균으로 수정할 예정이고
이마저도 마땅치 않다고 생각되면 다른 방식의 평균 환상 방식을 계속해서 변경해야할 것으로 예상됩니다.
이와같은 상황에서 Run-time Dynamic Class Loading 기법을 활용하면 어플리케이션의 전체 업데이트를 피할 수 있습니다.
우선 다음과 같이 점수 계산을 수행하는 Grader 클래스가 존재할 것입니다.
Grader 클래스 내에서는 double형 가변인자 받아
모든 인자들에 대한 평균을 계산하여 double 형으로 반환하는 getAvg() 메서드가 존재합니다.
다만 첫번째 코드에서는 일반적인 평균을 두번째 코드에서는
최대 최소를 제외한 인자들에 대한 평균을 구하는 방식의 차이가 있을 뿐입니다.
이제 이 코드를 어플리케이션에 적용하는 방식에 대해 알아보겠습니다.
이름 자체가 DexClassLoader이기 때문에 .dex 형태로 따로 빌드해주어야 될 것만 같지만
실제로 DexClassLoader는 classes.dex가 포함된 .apk .jar 파일에 대한 Class Loading을 지원하므로
위의 클래스들은 일반적인 안드로이드 어플리케이션 패키징 과정과 동일한 과정을 통하여
.apk 파일을 생성해주시면 됩니다.
.apk 파일이 준비되었다면 적절한 위치에 해당 파일을 위치시킵니다.
DexClassLoader를 사용할 때 가장 많이 일어나는 실수는 경로 문제입니다.
.apk 파일은 반드시 어플리케이션이 readable한 경로에 위치시키고
optimizedDirectory는 최적화된 Dex파일을 임시 저장하는 경로이므로
반드시 writable한 경로를 지정해 주어야합니다.
(IOException 발생시 이 부분을 가장 먼저 확인해주세요.)
이를 주의하셔서 DexClassLoader 객체를 생성해 주셨다면 이 객체를 통하여 클래스를 로드할 차례입니다.
DexClassLoader 객체의 loadClass() 메서드에 문자열 형태의 Class명을 입력하시면 해당 클래스를 로드할 수 있습니다.
여기서 주의하실 점!
반드시 전체 클래스명(패키지명+클래스명)을 적어주셔야 합니다.
클래스를 로드하는데 문제가 없으셨다면 클래스 생성자를 통해 객체를 생성합니다.
자, 이제 getAvg() 메서드를 얻어서 메서드를 수행시켜야 하는데요.
유의하실 점은 getMethod() 메서드의 두번째 인자인
인자형이 다르게 입력된다면 첫번째 인자인 메서드명이 올바르게 입력되었어도
해당 메서드로 인식하지 못하고 NoSuchMethodException이 일어나게 된다는 점입니다.
따라서 인자형을 반드시 올바르게 입력해주어야합니다.
(Grader 클래스의 getAvg() 메서드의 경우 인자가 double형 가변인자이기 때문에 내부적으로는 double 배열로 취급됩니다.)
메서드 객체가 제대로 생성되었다면 메서드 객체의 invoke 메서드를 통하여 해당 메서드를 수행할 수 있습니다.
반환형의 경우 기본적으로 Object형이기 때문에 알맞게 캐스팅해주시면 됩니다.
DexClassLoader의 사용법에 대해서는 위의 코드를 통하여 충분히 설명된 것 같네요.
하지만 Stealth Update을 직접적으로 구현하는 것에 대해서는 아직 감이 잡히지 않으신 분들도 있을 것 같아
다음 글에 이어 실질적으로 변경된 클래스에 대한 로드를 스위칭하는 방법에 대하여 이야기 해보겠습니다.
'IT 놀이터 > Elite Member Tech & Talk' 카테고리의 다른 글
[4기 수원 전낙현] 안드로이드 기반 디바이스의 디지털 포렌식 #1 (0) | 2013.12.02 |
---|---|
[4기 강북 송용길] Unit test with JUnit(3) (0) | 2013.12.02 |
[4기 강남 안태형] Java Class Loader #2 (0) | 2013.12.01 |
[4기 강남 안태형] Java Class Loader #1 (0) | 2013.12.01 |
[4기 대구 박병권] 데이터베이스 EXPLAIN을 활용한 슬로우 쿼리 검색 (0) | 2013.12.01 |