2019. 09. 23
컨퍼런스를 다니며 기억보단 기록을 하고자 합니다.
안녕하세요. 이번에는 Android Studio Build Talk 행사에 다녀왔습니다.
2019.09.22 Android Studio Build Talk
이번 행사는 Android Studio를 사용면서 필요했지만 듣거나 경험하기 어려운 난독화와 빌드에 대한 주제로 쿠팡에서 진행되었습니다.
이번에는 입구를 들어가기전에 티켓확인을 하고 입장하였습니다.
안드로이드 10 부터는 버전명칭이 디저트가 아닌 Android 10이 고유명칭으로 사용되었습니다.
그럼 이제 어떤 내용으로 발표가 진행되었는지 알아 보겠습니다.
● 안드로이드 빌드 : 설탕없는 세계(Recap) - 김용욱<카카오뱅크)
- 안드로이드 빌드 전반적인 개념을 다룬후 후처리 과정을 다룹니다.
- 구글이 어떻게 후처리를 하는지 살펴보고 후처리를 어떻게 활용할 수 있는지 가능성을 살펴 봅니다.
⊙ 발표에 앞서
- Post compilation를 메인으로 다룸
- Desugar : 개발자를 위한 편의를 빌드 과정에거 제거하는것
- 안드로이드 빌드과정 전체
- 빌드과정을 모른다고 가정하고 안드로이드 빌드의 특이성과 전체 과정부터 다루며, Post Compilation으로 이어감
- 이발표는 설탕이 없다. 딱딱하고 어려움
⊙ 후처리를 알면 무엇이 도움이 되나요?
○ 보안을 강화 할 수 있다.
- 프로가드, R8등의 보안 솔루션들이 안드로이드 빌드 후 처리 과정(Transform)동안 바이트 코드를 변조하고 난독화를 합니다.
○ 언어의 한계를 극복할 수 있습니다.
- 언어차원에서 지원하기 힘든 lazy evaluation을 구현 할 수 있습니다.
- 람다를 지원하지 못하는 JVM에서도 바이트코드 가공을통해 람다를 쓸수 있습니다.
○ APT의 한계도 극복 할 수 있습니다.
- APT는 완전히 새로운 클래스를 만들거나 상속받은 클래스를 만듭니다.
○ 반복적인 작업을 자동화를 할 수 있다.
- 어떤 리소스가 얼마나 쓰였는지 어디에서 안 쓰고 있는지를 확인할 수 있습니다.
- onResume, onPause 등 생명주기에 진입할 떄 코드의 변경없이 로그를 넣을 수 있습니다.
- DB, 네트워크 접속에 대한 로깅 코드를 추가 할수 있습니다.
- 모든 메서드가 호출될때마다 로깅하고 싶다면 그작업 역시 가능합니다.
- 이 모든 일들은 자바나 코틀린 코드를 그때그때 넣어 노가다로 해결할 수도 있지만 그렇지 하지 않아도 된다는 것이 후처리의 장점.
○ 교양을 쌓을 수 있습니다.
- 예상하지 못한 방향으로 언젠가 다른 방향에서 도움이 되기도 합니다.
⊙ 안드로이드 빌드의 특수성
- 자바 VM은 스택기반의 VM이다.
- 32비트 기반의 스택
- 상수의 종류를 구별하지 않는다.
- 자바는 특정 타입에 의존적이 명령이다 ( istore_1 , istore_2 …)
- 익숙해지면 기게어보다 쉽다
- 안드로이드는 레지스터방식의 ART
- DA DX를 이용하여 클래스 파일을 덱스파일로 변경함
○ 덱스파일이란?
- 자바는 클래스 별로 별도의 파일로 구성
- 상수 역시 클래스 별로 분리되어있음
- 자바 바이트코드로 작성됨
- 64K 메서드 단위로 여러 클래스가 하나의 파일에 합쳐져있음 (하나로 다 뭉쳐있다고 보면된다.)
- 상수들은 같은 DEX애네서 공유함.
- 달빅 바이트 코드를 사용
- 64k가 넘어가면 별도의 덱스파일로 분리되며 이런경우 공유 할 수 없다.
⊙ 안드로이드 빌드 과정
○ 그래들 플러그인
- 태스트를 추갛서 빌드 과정에 추가적인 일을 할 수 있다.
- 빌드를 위한 여러가지 설정들을 추가할 수 있다.
- 트랜스폼을 추가해서 여러 후처리를 할 수있다.
- 플러그인은 다음의 형태로 호출합니다. => apply plugin: 'com.android.application'
○ 안드로이드 빌드과정
1. 프로퍼티 파일에 지정된 플러그인을 실행 : 프로퍼티 파일은 implementation으로 설정할 수 있다.
2. Entry메서드인 apply 메서드를 실행 : apply가 사실상 main함라고 볼수 있다.
3. 트랜스폼과 환경설정
○ TaskManager
- createJavacTask
- createPostCompilationTasks : 구글이 만든것들을 수행, 빌드후 이루어질 작업을 수행, 써드파티 플러그인은 실행순서가 정해져있지 않다.
⊙ Transform 설정
○ Transform API
- 다양한 후처리를 표준화된 방식으로 Proguard, Desugar, ShrikResource등의 공식정인 Transform이 빌드툴에 포함
- Realm과 같은 써드파티도 바이트코드 변조를 Transform API에 의존
- 소비(consumed)
: getInputTypes와 getScopes로 지정된 inputs은 Transform에 전달후 사라짐
: Transform에서 변환된 파일을 만들어 outputProvider에 저장해야함.
: 참고만 할 내용은 ReferencedScopes로 지정해야함.
구글이 만든 Trasform : 구글이 트랜스폼API를 만든 것은 적극 적으로 사용자들이 참여 할수 있도록 하게 한것.
○ DesugarTransform
- 문법설탕등을 제거.
- transform메서드 : 결국 executor를 통해 DesugarWorkerItem의 DesugarAction을 호출하는 구조
- desugarAction : DESUGAR_MAIN을 통해 람다등의 코드를 변형, 많은 작업이 트랜스폼 내부가 아닌 외부코드에서 수행됨.
○ PoroguardTransform
- 난독화를 위한 트랜스폼
- trasform메서드 : Semaphore로 구현된 자체 워커에서 doMinification을 수행.
- workLimiter 메서드 : Semaphore로 구현된 자체 워커
- doMinification 메서드 : 프로가드를 위한 여러 설정을 한 후 runProguard호출
- runProguard 메서드 : Proguard객체에게 난독화를 요청.
○ ShrinkResourcesTransform
- 사용하지 않는 리소스 제거
- transform에서 입력 다루기
- 실제 BuildOutputs가공은 ResourceUsageAnalyzer
- ResourceUsageAnalyer의 분석 : 리소스값수집, 사용기록, 로그, 미사용찾음...
● R고써야 뒷탈 없는 R8 - 차영호<LINE> > 부제: R8 괴담
- 구글에서 만든 새로운 코드 최적/난독기 R8에 대해서 맛보는 시간을 가져봅니다.
- R8을 사용할때 알아두면 좋을 각종 팁, 설정구성 확인하기, proguard와의 살며시 다른 동작 방식등을 살펴볼 예정입니다.
1. D8 & R8
** D8/R8이란?
D8은 Android 스튜디오 및 Android Gradle 플러그인에서 프로젝트의 자바 바이트코드를 Android 기기에서 실행되는 DEX 바이트코드로 컴파일하는 명령줄 도구로, 이 도구를 사용하면 앱의 코드에 자바 8 언어 기능을 사용할 수 있습니다.
- 기존에는 DX라고하는 컴파일러를 이용했지만 Android Studio 3.1부터 D8로 변경되었습니다.
- D8의 중요한 점 하나는 Desugaring이다.
- Android Os의 런타임은 Java6 Java7 기반입니다.
- D8에서 Desugaring을 지원하면서 Java8의 언어적인 기능을 사용가능 합니다.
- 주의할점은 언어적인 기능만 제공하고 있고 Java8의 표준 라이브러리(ex. Nio, File Api등)은 여전히 예전 Android OS에서 사용할 수 없습니다.
R8은 이전의 Proguard를 대체하는 도구로, 디컴파일을 어렵게 하는 난독화와 사용하지 않는 클래스, 메소드, 그리고 리소스(이미지 등)을 제거(shrink) 해주는 도구입니다.
- D8은 R8안에 포함되어있다.
- 즉 R8은 D8에 최적화 기능이 추가된 컴파일러라고 이해하시면 됩니다.
- Proguard가 사용되지 않아서 proguard rule이 더이상 필요없을 것이라고 생각한다면 큰 오해입니다.
- R8에서는 여전히 proguard rule을 사용합니다. 따라서 gradle에 proguard rule를 지정해주셔야합니다.
- R8은 Android Studio 3.4부터 별다른 지정이 없으면 기본값으로 사용되게 됩니다.
Android Studio 3.6까지는 R8대신 Proguard를 강제로 사용할 수 있는 방법이 마련되어있지만 곧 Proguard를 사용할 수 있는 방법이 사라지고 R8만 사용되게 고정될 예정입니다.
2. ProGuard Rules
3. . How to track issues of R8
- R8에서 발생한 이슈나 해결괸 이슈를 확인 할때 R8버전 정보를 알아 두어야한다.
- 이슈트래커에 R8이슈를 등록하고 해결되면 R8의 특정 버전에서 해결되었다고 알려줍니다.
- 어떤 AGP버전에서 해결되었는지 알 수없습니다
- AGP 3.4까지는 R8이 수행될때 버전정보를 같이 출력해주었지만 3.5부터는 출력하지 않도록 변경되었습니다.
- com.android.tools.build:builder.jar#r8-version.properties에 sha정보가 R8의 git commit정보입니다.
- AGP와 R8의 버전 매핑 테이블 확인하면 도움이 될 수 있습니다.
4. Case studies
- case1 : Data Class With Gson
- case2 : Reflect.Proxy
- case3 : Method inlining on Release Build
https://developer.android.com/studio/releases#r8-default
● 안드로이드 앱 모듈화와 빌드 최적화 - 김필우<쿠팡>
- 쿠팡 안드로이드 팀의 기능(feature)기반 모듈화를 소개합니다.
- 모듈화 과정에서 겪었던 빌드 관련 문제들과 최적화 기법들도 함께 소개합니다.
듀플로?
1. AGP - Android Gradle Plugin
빌드 캐싱을 사용할때 AGP 버전에 따라 적용이 될수 있고 안될수 있다.
빌드할때 AGP버전이 중요함 (AGP 출시노트는 여기에서 확인 할 수 있습니다.)
2. DIP - dependency inversion principle
High-level modules should not depend on low-
level modules. Both should depend on
abstractions.
Abstractions should not depend on details.
Details should depend on abstractions.
3. OCP - open close principle
5. PBL - package by layer
6. PBF - package by feature
7. Multidex
- Sdk21 부터 멀티덱스를 만드는 태스크의 종류가 달라짐.
● Q&A
Q. 빌드 후 처리를 사용하여 실제 프로젝트에서 크게 이점을 얻은 사례를 들을수 있을까요? 저희 프로젝트에서는 이러한 빌드 후처리를 전혀 하지않고, 고려를 해본적이 없어서 그런 지점을 알게되면 좋을 것 같습니다.
A. Lazy valuation사례를 들수 있을것 같다. Facebook application에서는 후처리는 하지 않고 최적화를 했고, realm에서 후처리를 사용중
후처리이후 다른 난독화 과정을 거칠수 있다.
Q. R8도 난독화를 하는데, 왜 Proguard도 사용해야 하는지 궁금합니다.
호환성 문제가 있다. 그리고 곧 구글에서 프로가드를 없앨 예정이다.
Q. 일반 자바 프로젝트에서도 트랜스폼을 이용할 수 있을까요? 현재 수작업으로 프로가드, 쉬링크를 하고 있는데 자동으로 처리하신 경험이 있다면 공유해 주시길 부탁드립니다.
트랜스폼 api
Q. 후처리 내용을 코드 작성시점에 에디터에서 코드힌트 등과 연동하려면 어떻게 해야하는가도 궁금합니다.
바이트코드 변조에 대해서 ide에서 힌트를 줄수는 없을 것 같다. 현실적으로 어렵다.
● 마치며
이번 행사내용은 저에게 너무 어려웠던 내용이었습니다.ㅠㅠ 꾸준히 노력해서 실력을 키워야겠습니다.( Proguard가 Deprecate된다는 이야기를 들어서 한번 확인해 볼 필요가 있을 것같습니다...)
읽어 주셔서 감사합니다. 행사 사은품도 받았습니다.😁
감사합니다.
❤️
Love YourSelf
'컨퍼런스' 카테고리의 다른 글
[컨퍼런스] DevFest Pangyo 2019 : Fun Thing is Good! 후기 (0) | 2019.11.16 |
---|---|
[Hackathon] DODO 14회 참석 후기 (0) | 2019.09.28 |
[컨퍼런스] 제3회 99콘<이력서> 후기 (1) | 2019.09.21 |
[컨퍼런스] 안드로이드 탐구영역 (0) | 2019.09.01 |
[컨퍼런스] Kotlin/Everywhere Seoul 2019 후기 (0) | 2019.08.26 |