일상&개발 로그

Dynamic APK Loading Research 본문

개발/안드로이드 개발

Dynamic APK Loading Research

dskim98 2017. 5. 10. 14:12

APK 동적 로딩 방법을 찾아보았습니다. 오픈소스로 공개된 라이브러리를 사용했으며 소스 출처는 아래와 같습니다.

DL: Dynamic Load Framework for Android - https://github.com/singwhatiwanna/dynamic-load-apk

Code Flow

  1. DexClassLoader를 이용해서 APK의 클래스를 로드
  2. Reflection을 이용해서 AssetManager에 Path를 추가한 뒤 AssetManager에서 APK의 Resources를 가져옴
  3. DexClassLoader로 CalleeActivity를 인스턴스화 한 뒤 ProxyActivity의 생명주기에 맞춰  CalleeActivity의 메소드에 맵핑
  4. ProxyActivity와 CalleeActivity를 연결할 때 Context, Resource, ClassLoader, PackageInfo를 넘겨줌
  5. 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
  • 무료로 상업적 활용 가능
  • 자유로운 수정 및 배포 & 라이선싱 & 특허신청 가능
  • 원저작자 명시
  • 수정내용을 구체적으로 기재해야 함


Comments