APK 파일 크기를 줄이기 위한 Android 개발자를 위한 팁
게시 됨: 2015-10-281) 프로가드
ProGuard와 같은 코드 축소 도구는 APK 파일 크기를 크게 줄여줍니다. 이 도구는 sourceforge에서 사용할 수 있습니다. 때때로 응용 프로그램 동작을 변경할 수 있으므로 ProGuard를 적용한 후 모든 응용 프로그램을 다시 테스트하는 것이 매우 중요합니다. ProGuard가 응용 프로그램 기호를 대체하므로 코드를 읽기 어렵게 만들려면 기호 매핑을 유지하는 것이 중요하므로 응용 프로그램의 충돌을 조사해야 하는 경우 스택 추적을 원래 기호로 다시 변환할 수 있습니다.
2) 디버그 정보 제거
응용 프로그램에서 모든 디버그 관련 기능을 제거하는 것이 좋습니다. 애플리케이션은 일반적으로 이 데이터를 보거나 사용하지 않으며 Android 운영 체제에서는 애플리케이션을 실행하는 데 데이터가 필요하지 않습니다. 따라서 디버그 정보는 공간만 낭비하므로 제거해야 합니다.
이를 수행하려면 모든 디버그 관련 기능을 아래와 같이 조건부 블록으로 묶어야 합니다.
정적 최종 디버그 = false; if (디버그) { v(TAG, "디버그 ...") }
컴파일러가 모든 디버그 기능을 완전히 제거할 수 있으려면 디버그 플래그가 컴파일 시간에 설정되는 것이 중요합니다(즉, 정적 최종으로 선언됨). myDebugPrint()에 대한 호출이 조건부 블록으로 묶여 있지 않기 때문에 아래와 같은 고유한 디버그 메서드를 만드는 것은 좋은 생각이 아닙니다. 즉, 컴파일러는 호출 클래스에서 myDebugPrint()에 대한 정보를 유지해야 합니다.
공개 무효 myDebugPrint() if(디버그) v(TAG, "디버그 ..."); } } … myDebugPrint()
3) 네이티브 라이브러리에서 디버그 기호 제거 디버그 기호를 사용하는 것은 애플리케이션이 아직 개발 중이고 여전히 디버깅이 필요한 경우 의미가 있습니다. 그러나 릴리스 빌드를 컴파일할 때 디버그 기호가 계속 나타나는 경우 디버그 기호를 제거하려면 네이티브 라이브러리(.so 파일)에서 디버그 기호를 제거하는 것이 좋습니다. 이것은 Android NDK에서 arm-eabi-strip 명령을 사용하여 수행됩니다.
4) 권장 미디어 형식 응용 프로그램이 이미지, 오디오 또는 비디오에 크게 의존하는 경우 APK 파일 크기를 줄이는 또 다른 방법은 특정 미디어 형식을 사용하는 것입니다. 이미지, 오디오 및 비디오에 대해 다음 미디어 형식을 사용하는 것이 좋습니다.
- 비디오: H264 AVC를 사용합니다. 대상 장치의 화면 해상도(알고 있는 경우)보다 크지 않은 해상도로 비디오를 인코딩합니다.
- 오디오 : 모든 오디오 리소스에 AAC 오디오를 권장합니다. AAC는 mp3 또는 Ogg Vorbis에 비해 주어진 품질에서 더 나은 압축을 달성합니다. WAV와 같은 원시 형식은 절대 사용해서는 안 됩니다. WAV 형식을 사용하는 일반적인 이유는 압축된 오디오 스트림을 디코딩하는 것은 일반적으로 재생 시 높은 대기 시간을 의미한다는 것입니다. 그러나 Android는 애플리케이션이 높은 대기 시간에 대한 불이익 없이 압축된 오디오 스트림을 사용할 수 있도록 하는 Sound Pool API를 제공합니다.
- 이미지 : PNG 또는 JPEG. PNG를 사용하십시오. 무손실 형식이기 때문에 압축으로 인한 시각적 인공물이 없기 때문에 텍스처와 아트워크에 매우 적합합니다. 공간 제약이 있는 경우 JPEG 또는 PNG와 JPEG의 조합을 사용하십시오. 고품질 JPEG 이미지는 JPEG 압축 방식이 최적화된 사실적인 대형 이미지에 적합할 수 있습니다.
- 품질 저하 없이 PNG 크기 최적화
PNG 형식을 사용하면 PNG 이미지의 품질을 잃지 않고 파일 크기를 줄일 수 있습니다. 이렇게 하려면 OptiPNG 또는 PNGCrush와 같은 도구를 사용하십시오. 둘 다 이미지 품질을 유지하면서 PNG 파일 크기를 줄이는 데 좋습니다. PNGcrush는 PNG 필터 및 zlib(Deflate) 매개변수를 반복하고, 각 매개변수 구성을 사용하여 이미지를 반복적으로 압축하고, 가장 작은 압축(IDAT) 출력을 생성하는 구성을 선택하는 오픈 소스 프로그램입니다. 반면에 OptiPNG는 메모리에서 시도를 완전히 수행하고 최종 출력 파일만 디스크에 씁니다. 또한 사용자에게 여러 최적화 사전 설정을 제공합니다.
5) 사용하지 않는 리소스 제거 APK 파일에서 제거하기 위해 고려해야 할 또 다른 잠재적인 공간 낭비 그룹은 사용하지 않는 레이아웃, 드로어블 및 색상과 같이 res 디렉토리의 사용되지 않는 리소스입니다. APK에서 제거할 수 있는 사용하지 않는 리소스를 감지하려면 android-unused-resources 도구를 사용하세요. Android Unused Resources는 프로젝트에서 사용하지 않는 리소스를 검색하는 Java 애플리케이션입니다.
6) 중복 방지 애플리케이션에 중복 기능이나 중복 자산이 없는지 확인하는 것은 APK에 불필요한 파일이 포함되지 않도록 하는 확실한 방법입니다. 사용하는 Android API와 각 API가 제공하는 전체 기능을 이해하는 것이 중요합니다. 하나의 Android API가 이미 다른 API의 작업을 수행하고 있을 수 있습니다. 복제된 자산(문자열, 비트맵 등)도 공간 낭비이며 쉽게 피할 수 있습니다. 덜하지만 중복된 코드는 전달된 바이너리의 크기를 불필요하게 증가시킵니다.
7) 메소드 수 줄이기 Avid Android 개발자는 오랫동안 자신의 앱에서 골치 아픈 문제에 직면해 왔습니다. 앱이 가질 수 있는 메소드의 수는 제한되어 있습니다. 글쎄, 그것은 제한적이었습니다. 마침내 지난 10월 Google의 좋은 사람들이 솔루션을 제공했지만 이상적이지는 않았습니다. 구현하기는 매우 쉽지만 multidex 솔루션은 복잡하고 컴파일 시간이 상당히 길어집니다. 가만히 있지 않고 Lollipop(Android 5.0)부터 전체 Android 가상 머신이 혁신되어 일반 컴파일 시간보다 훨씬 더 오래 지속되는 솔루션을 제공했습니다. 그러나 당분간 Lollipop 솔루션도 이상적이지 않습니다. 개발자는 Lollipop에 대해서만 개발해야 하며, 이는 대부분의 앱이 더 넓은 범위의 사용자와 호환되기를 원하고 이전 Android 버전에서 사용할 수 없는 기능을 사용하는 것을 두려워할 수 있기 때문에 문제가 될 수 있습니다. 따라서 현재로서는 Lollipop 솔루션이 훌륭한 미래형 Android 솔루션이지만 현재로서는 큰 영향을 미치지 않을 수 있습니다. 그럼 그 동안에 무엇을 할 수 있습니까? 우리 모두는 65K 제한에 도달하지 않기 위해 기능을 포기해서는 안 된다는 데 동의합니다. 그러나 가장 좋은 방법은 여전히 적용 방법 수를 줄이는 것입니다. 그렇다면 어떻게 하면 앱을 특별하게 만드는 작은 불꽃을 잃지 않고 메서드 수를 줄이려고 할 수 있을까요?
간략한 개요: "이 모든 방법은 어디에서 왔습니까?"
메서드 수 제한은 대략 65K 메서드(정확히 65,536개)입니다. 그것은 엄청난 숫자처럼 들립니다. Android 초보 개발자라면 "도대체 어떻게 그렇게 많은 앱이 이 수치에 이렇게 빨리 도달할 수 있습니까?"라고 생각할 수 있습니다. 당신은 아마 어느 정도 맞을 것입니다. 혼자서 이렇게 많은 메소드를 작성하는 것은 쉽지 않습니다. 그러나 앱 개발자는 전체 앱을 스스로 작성하지 않습니다. 앱 개발자는 점점 더 많은 타사 라이브러리(SDK – 소프트웨어 개발 키트)를 사용하고 있으며, 이를 통해 스스로 완전히 개발해야 하는 특정 목표와 기능을 달성할 수 있습니다. 광고에서 GUI 향상, 소셜 네트워크, 충돌 보고 등에 이르기까지 SDK는 귀중한 개발 시간을 절약하고 앱을 더 빨리 출시할 수 있도록 도와주는 광범위한 기능과 API를 제공합니다. 그러나 각 SDK는 메소드 수에 추가되며 일부 SDK는 귀하가 협상한 것 이상을 수행합니다. 물론 반드시 나쁜 것은 아닙니다. 그러나 쿠데타는 구글 자체에서 나왔다. 그들의 Google Play 서비스 키트는 28,000개 이상의 메서드가 포함된 대규모 SDK입니다. 한도가 65K이므로 그 숫자는 정확히 낮지 않습니다. 그리고 많은 앱 개발자는 이 SDK를 사용하고 싶어합니다. 이 SDK가 앱에 많은 가치를 더하는 마법 같은 Google 왕국의 문을 열어주기 때문입니다. 이 게시물에서는 Google Play 서비스 패키지를 선택적으로 사용하는 방법을 설명할 뿐만 아니라 이러한 각 패키지가 앱에 추가하는 방법의 수에 대한 정보도 제공합니다. 그러니 자리를 지키세요. 험난한 여정이 될 것입니다.
구글 플레이 서비스 플레이 그라운드
그렇다면 Google Play 서비스는 실제로 몇 가지 방법을 추가합니까? 글쎄요, 인생의 모든 것과 마찬가지로, 이것은 단순한 수치보다 훨씬 더 복잡합니다. 그러나 한 번에 한 걸음씩 나아가자. Google Play 서비스 SDK에는 실제로 19개의 서로 다른 SDK가 포함되어 있습니다. Gradle을 사용하면 사용할 항목을 선택적으로 선택할 수 있습니다. 앱 모듈의 build.gradle 파일에 다음 종속성을 추가하기만 하면 됩니다.
종속성 { 'com.google.android.gms:play-services:7.5.0' 컴파일 }
7.5.0은 현재 출시된 최신 GPS 버전입니다. Android SDK Manager 내에서 버전 25로 레이블이 지정됩니다. 특정 패키지를 선택하려면 다음 줄을 원하는 만큼 종속성 줄로 바꾸고 특정 패키지를 지정합니다. 예를 들어 Google Plus, Google 게임, Google Ads 및 Google 지도만 원한다고 가정해 보겠습니다.
종속성 { 컴파일 'com.google.android.gms:play-services-plus:7.5.0' 컴파일 'com.google.android.gms:play-services-games:7.5.0' 컴파일 'com.google.android.gms:play-services-ads:7.5.0' 컴파일 'com.google.android.gms:play-services-maps:7.5.0' }
그다지 어렵지는 않지만 여기 첫 번째 캐치가 있습니다. 영광스러운 19개의 SDK 중 하나는 play-services-base입니다. Google Play 서비스 패키지를 포함하면 자동으로 추가됩니다. 기본 패키지에는 몇 개의 메소드가 포함되어 있습니까? 거의 8,000개(정확한 숫자는 아래).
그리고 여기 두 번째 캐치가 있습니다. 위의 예에는 3개의 패키지만 포함하지 않았습니다. 기본 패키지도 포함하면 4개만 포함하지 않았습니다. 사실 저는 5개의 패키지를 포함했습니다. 왜요? Google 게임 패키지는 Google 드라이브 패키지를 사용하므로 가져오기도 했습니다(실제로 Google Ads에는 태그 관리자라는 패키지도 포함되어 있지만 여기서는 '선택 가능한' 패키지만 계산함).
이제 Google Play 서비스의 각 패키지가 앱에 추가하는 메서드의 수를 계산하는 것이 왜 조금 더 어려운지 이해하기 시작했습니다. 하나의 패키지를 포함한다고 해서 반드시 다른 패키지를 제외하는 것은 아닙니다.
그래서 여기에 어떤 패키지를 추가할 수 있는지, 얼마나 많은 방법을 추가하고 어떤 패키지를 가져와 파티를 중단시킬 수 있는지에 대한 정보가 있습니다. 데이터는 최신 버전의 Google Play 서비스(7.5.0 / 버전 25)를 나타냅니다.
총 방법 수: 28,175.이 숫자 중 일부는 인정해야 합니다. 정말 가혹합니다. 파노라마 패키지만 원하면 9가지 방법을 얻을 수 없고 거의 8,000가지를 얻어야 합니다. 너무 많은 앱이 65K 제한에 근접하거나 초과하는 것은 당연합니다.
이 숫자 중 일부는 합산하려고 하면 약간 일치하지 않는 것처럼 보일 수 있습니다. 다시 말하지만 Google Play 서비스의 논리가 눈에 보이는 것보다 약간 까다롭기 때문입니다. 예를 들어 Google Analytics에는 계정의 광고 ID를 가져오기 위한 Google Ads의 단일 방법이 포함되어 있습니다.
각 패키지가 앱에 추가되는 양을 계산할 때 두 배를 제외해야 합니다(예: 기본 패키지를 두 번 이상 계산하지 마십시오).
모든 것을 선택적으로 추가할 수는 없습니다
그리고 여기에 마지막 찌르기가 있습니다. Google Play 서비스에는 선택적으로 추가할 수 없는 두 개의 작은 패키지가 있습니다. 검색 패키지(Google Now API에 대한 액세스 권한 제공)에는 22개의 메서드만 포함되어 있습니다. 사용하고 싶다면 28,000개 이상의 전체 메소드, 전체 Google Play 서비스를 추가할 수 밖에 없습니다. 바라건대, 이것은 이후 버전에서 수정될 것입니다.
(또 다른 "접근할 수 없는" 패키지는 111개 메서드를 포함하는 appstate 패키지이지만 현재 google-play-games 패키지에 포함된 SavedGames 를 위해 더 이상 사용되지 않습니다.)