한국의 개발자들을 위한 Google for Developers 국문 블로그입니다.
Android Studio 2.2의 APK 패키징 이해하기
2016년 12월 28일 수요일
수많은 새로운 기능과 향상된 기능
을 갖춘 Android Studio 2.2가 최근에 출시되었습니다. 새롭게 다시 작성된 통합 APK 패키징 및 서명 단계와 같이, 일부 사항은 Android Gradle 플러그인에서 눈에 띄지 않게 변경되었으므로 놓치기 쉽습니다.
APK Signature Scheme v2
Android 7.0 Nougat에
APK Signature Scheme v2
를 새로 도입하면서, 저희는 Android Gradle 플러그인에서 APK를 어셈블하는 작업 방식을 다시 쓰기로 결정했습니다. 인내심을 가지고 이
문서
에 설명되어 있는 v2 서명에 대한 매우 상세한 기술 정보를 모두 읽어볼 수도 있겠지만, 여기서는 Android 앱 개발자로서 알아둬야 할 정보만 요약해서 빠르게 파악할 수 있도록 간략히 설명하겠습니다.
무결성을 확인하는 데 사용되는 APK의 암호화 서명이 지금은 ZIP Central Directory 바로 앞에 있습니다.
v1에서는 보관처리된 각 파일의 콘텐츠를 압축 해제한 것과 반대로, 여기서는 서명이 계산된 후 전체 APK 파일의 바이너리 콘텐츠에 대해 인증됩니다.
APK는 v1 서명과 v2 서명으로 모두 동시에 서명될 수 있으므로, 이전 Android 릴리스와도 호환됩니다.
Android가 APK를 인증하는 방법에 이런 변경 사항을 적용하는 이유는 무엇일까요? 첫째로는 이 새로운 서명 형식의 보안과 확장성을 강화하고, 둘째로는 성능 향상을 위해서입니다. 이 새로운 서명은 기기에서 인증하는 시간이 크게 단축되므로(비용이 많이 드는 압축 해제 불필요) 앱 설치 시간이 더 빨라집니다.
하지만 이 새로운 서명 구성표로 인해 APK 생성 프로세스에 새로운 제약 조건이 적용됩니다. v1에서는 압축되지 않은 파일 콘텐츠만 인증되었으므로, APK 서명 후에도 상당히 많은 콘텐츠를 수정할 수 있었습니다. 즉, 파일을 이리저리 옮기거나 심지어 다시 압축할 수도 있었죠. 실제로, 빌드 프로세스에 포함된 zipalign 도구가 정확히 그런 작업을 수행했습니다. 이 도구는 런타임 성능 향상을 위해 알맞은 바이트 경계에 ZIP 항목을 맞추는 데 사용되었습니다.
v2 서명은 애플리케이션 패키지를 구성하는 파일을 개별로 인증하지 않고 패키지 자체를 통째로 인증하므로, 서명 후에는 zipalign을 더 이상 실행할 수 없습니다. 그게 바로 압축, 정렬 및 서명 작업이 지금은 단 하나로 통합된 빌드 프로세스 단계에서 이루어지는 이유입니다.
빌드 프로세스에 어떠한 식으로든 APK 파일을 변조하거나 후처리하는 사용자 설정 작업이 있는 경우에는 해당 작업을 중지하세요. 그렇지 않으면 v2 서명이 무효화되어 APK가 Android 7.0 이상 버전과 호환되지 않을 위험이 있습니다.
개발자들이 (명령줄 등을 통해) 수동으로 서명하고 정렬하는 방식을 선택한다고 가정하고 Android SDK에
apksigner
라는 새로운 도구를 제공합니다. 이 도구는 v1 및 v2 APK 서명 및 인증 기능을 모두 제공합니다. 참고로, v2 서명을 사용하는 경우 apksigner를 실행하기 전에 zipalign을 실행해야 합니다. 또한, JDK에서 제공되는 jarsigner 도구는 Android v2 서명과 호환되지 않으므로 v2 서명을 유지하려면 이 도구를 사용해 APK를 다시 서명할 수 없다는 점에 유의하세요.
Android Gradle 플러그인을 사용하여 빌드할 때 v1 또는 v2 서명을 추가하지 못하게 하려는 경우에는 build.gradle의
signingConfig
섹션에 다음 줄을 추가하면 됩니다.
v1SigningEnabled false
v2SigningEnabled false
참고: 두 가지 서명 구성표는 모두 Android Gradle 플러그인 2.2에서 기본적으로 사용됩니다.
더 작은 APK를 위한 릴리스 빌드
저희는 이번 기회에 패키지 작성 도구를 다시 작성할 때 릴리스 APK의 크기를 일정 수준 최적화했으며, 이에 따라 Play Store에서 다운로드 속도를 높이고
델타 업데이트 크기를 줄여
기기에서 낭비되는 공간을 줄이는 성과를 얻었습니다. 다음은 저희가 수행한 몇 가지 변경 사항입니다.
애플리케이션 패키지 내 파일들이 정렬되어 APK간의 차이가 최소화됩니다.
모든 파일 타임스탬프와 메타데이터는 0으로 처리됩니다.
레벨 6 및 레벨 9 압축이 모든 파일에 대해 병렬로 검사되어 가장 적합한 압축 레벨이 사용됩니다. 즉, L9이 크기 면에서 거의 이점이 없다면 성능 향상을 위해 L6가 선택될 수 있습니다.
네이티브 라이브러리가 압축되지 않고 페이지가 정렬된 상태로 APK에 저장됩니다. 이에 따라 Android 6.0 Marshmallow의 android:extractNativeLibs="false" 옵션이 지원되며, 이를 통해 애플리케이션은 기기에서 더 적은 공간을 사용할 뿐만 아니라 Play Store에서는 더 작은 업데이트를 생성할 수 있습니다.
Play Store 업데이트 알고리즘을 더욱 효과적으로 지원하기 위해 Zopfli 압축은 사용되지 않습니다. Zopfli로 APK를 다시 압축하지 않는 것이 좋습니다. 여전히 프로젝트에서 PNG 파일과 같은 개별 리소스를 사전에 최적화하는 것이 좋습니다.
이렇게 변경함으로써 사용자가 속도가 연결 속도가 느리거나 성능이 떨어지는 기기를 사용하는 상황에서도 정상적으로 앱을 다운로드하고 업데이트할 수 있도록 릴리스를 가능한 한 작게 만드는 데 도움이 됩니다. 하지만 디버그 빌드는 어떨까요?
설치 속도를 높이기 위한 디버그 빌드
앱을 개발할 때는 반복 주기, 즉 코드를 변경하여 빌드하고 연결된 기기나 에뮬레이터에 배포하는 과정을 빠르게 유지하고 싶으실 겁니다. Android Studio 2.0부터는 이 모든 단계를 최대한 빠르게 진행할 수 있도록 노력하고 있습니다. Instant Run을 통해 이제는 런타임 중에 변경된 코드와 리소스만 업데이트할 수 있으며, 그와 동시에 새 에뮬레이터는 멀티프로세서를 지원하고 더욱 빠른 APK 전송과 설치가 가능하도록 ADB 속도를 높여 줍니다. 빌드 기능 개선을 통해 그 시간을 훨씬 더 단축할 수 있으며, Android Studio 2.2에서 디버그 빌드를 위한 증분식 패키징과 병렬 압축 기능을 도입할 예정입니다. 대상 기기 밀도와 ABI를 위한 선택적인 리소스 패키징 등의 다른 기능과 더불어, 이 기능 덕분에 훨씬 더 빠르게 개발 작업을 수행할 수 있을 것입니다.
주의: Instant Run용으로 생성되었거나 디버그 빌드를 호출하여 생성된 APK 파일은 Play Store에 배포할 수 없습니다! 이 파일에는 Instant Run을 위한 추가 기기 코드가 포함되어 있으며 빌드를 시작할 때 연결되어 있던 기기를 제외한 기타 기기 구성의 리소스는 빠져 있습니다. Android Studio의
Generate Signed APK 명령어
나 assembleRelease Gradle 작업을 사용하여 생성할 수 있는 APK의 릴리스 버전만 배포해야 합니다.
게시자:
Wojtek Kaliciński
, Android 디벨로퍼 어드보케
▶
원문 링크
Contents
ML/Tensorflow
Android
Flutter
Web/Chrome
Cloud
Google Play
Community
Game
Firebase
검색
Tag
인디게임페스티벌
정책 세미나
창구프로그램
AdMob
AI
Android
Android 12
Android 12L
Android 13
Android 14
Android Assistant
Android Auto
Android Games
Android Jetpack
Android Machine Learning
Android Privacy
Android Studio
Android TV
Android Wear
App Bundle
bootcamp
Business
Chrome
Cloud
Community
compose
Firebase
Flutter
Foldables
Game
gdg
GDSC
google
Google Developer Student Clubs
Google Play
Google Play Games
Interview
Jetpack
Jetpack Compose
kotlin
Large Screens
Library
ma
Material Design
Material You
ML/Tensorflow
mobile games
Now in Android
PC
Play Console
Policy
priva
wa
wear
Wearables
Web
Web/Chrome
Weeklyupdates
WorkManager
Archive
2024
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2023
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2022
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2021
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2020
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2019
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2018
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2017
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2016
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2015
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2014
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2013
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2012
12월
11월
10월
9월
8월
7월
6월
5월
3월
2월
1월
2011
12월
11월
Feed