Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 음량표준화
- android network
- so파일 동적로딩
- Intent String 변환
- ArrayMap
- corePoolSize
- lufs
- convert Intent to string
- gitignore작성법
- Service관리
- gitignore
- 오픈소스라이선스
- 네트워크 디버깅
- enum performance
- java callstack
- RxJava 스터디
- print callstack
- callstack 출력
- MediaDataSource
- APK로딩
- RxJava Programming
- convert string to intent
- BlockingQueue Capacity
- mitmproxy
- Service 팁
- APK 동적로딩
- Dagger2란
- Replaygain
- HashMap vs ArrayMap
- android enum
Archives
- Today
- Total
일상&개발 로그
Dynamic APK Loading Research 본문
APK 동적 로딩 방법을 찾아보았습니다. 오픈소스로 공개된 라이브러리를 사용했으며 소스 출처는 아래와 같습니다.
DL: Dynamic Load Framework for Android - https://github.com/singwhatiwanna/dynamic-load-apk
Code Flow
- DexClassLoader를 이용해서 APK의 클래스를 로드
- Reflection을 이용해서 AssetManager에 Path를 추가한 뒤 AssetManager에서 APK의 Resources를 가져옴
- DexClassLoader로 CalleeActivity를 인스턴스화 한 뒤 ProxyActivity의 생명주기에 맞춰 CalleeActivity의 메소드에 맵핑
- ProxyActivity와 CalleeActivity를 연결할 때 Context, Resource, ClassLoader, PackageInfo를 넘겨줌
- CalleeActivity에서는 넘겨받은 변수를 이용하여 동작함
Pros & Cons
Pros.
- 해당 Library 사용 시 적용이 간단하고 편리함.
- 기능 업데이트 시 앱 업데이트가 아니라 APK 다운로드만 받으면 됨.
- 여러 앱에서 한 APK에 접근해서 사용 가능함.
Cons.
- 구글 앱 업데이트 정책 중 '악의적 행위'에 해당할 가능성(구글 플레이를 통한 배포가 불가능할 가능성)
https://play.google.com/intl/ko/about/privacy-security/malicious-behavior/ - 보안이슈 발생 가능(공용 디렉토리에 APK를 위치해야 할 경우)
- 소스에 Receiver에 대한 구현이 없어서 Receiver모듈을 추가개발 해야 함.
- 로드 할 APK에 대한 검증 시간이 필요하고 또 Dynamic Class Loading, Reflection을 사용하기 때문에 호출 시간이 비교적 오래걸린다.
- Callee Activity/Service에서 APK내부의 다른 Activity/Service를 호출하는 것이 어렵다.
- Android Framework 소스에 대한 Reflection을 사용하기 때문에 Framework소스 변경이 이루어지면 수정이 필요하다.
Issues
APK 로딩을 통해 정상 동작하도록 구현 완료최신 단말에서 Compiletime Class와 Runtime Class의 구조가 다르다는 오류메시지 출력됨
- ProxyActivity와 CalleeActivity가 상속하는 Class의 구조가 다른 문제
- 현재 실행중인 Application과 APK간에 상속할 추상클래스를 공유해야 함(ClassLoader와 Resource주입을 위해)
- abstract class 상속이 아닌 interface를 구현하도록 수정
- Class상속을 Interface구현으로 변경해서 해결.so파일 문제로 정상적으로 실행되지 않는 이슈 발생
- AiCloud 라이브러리가 32bit so파일 밖에 없기 때문에 wrapper앱은 무조건 32bit으로 실행되어야 함
- wrapper앱은 so파일을 가지고 있지 않기 때문에 64bit 단말에서는 default인 64bit로 실행됨
- wrapper앱이 32bit dummy so파일을 가지고 있도록 수정
Library License
- Apache 2.0 license
- 무료로 상업적 활용 가능
- 자유로운 수정 및 배포 & 라이선싱 & 특허신청 가능
- 원저작자 명시
- 수정내용을 구체적으로 기재해야 함
'개발 > 안드로이드 개발' 카테고리의 다른 글
[PerformancePatterns] Service 올바르게 사용하기 (0) | 2017.05.18 |
---|---|
Gradle 라이브러리 충돌 시 대처방법 (0) | 2017.05.12 |
AsyncTask 특징 (0) | 2017.04.24 |
Intent를 String으로 변환하기 (0) | 2017.04.19 |
CallStack출력하기 (0) | 2017.02.08 |
Comments