앱 크기 축소
컬렉션을 사용해 정리하기
내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.
작은 앱 크기는 다운로드 성공과 직접적인 관련이 있습니다. 네트워크 기기 연결 상태가 좋지 않거나 네트워크 속도가 느린 신흥 시장에서 특히 그렇습니다. 이런 경우 앱 사용률이 줄어들 수 있으며 잠재고객의 범위와 도달범위가 낮아집니다. 하지만 여러 방법으로 앱 크기를 줄일 수 있습니다.
권장사항
앱을 Android App Bundle로 업로드
Google Play에 게시할 때 앱 크기를 즉시 줄일 수 있는 가장 쉬운 방법은 앱을 Android App Bundle로 업로드하는 것입니다. Android App Bundle은 앱의 컴파일된 코드와 리소스가 모두 포함되어 있지만 APK 생성 및 Google Play 서명은 보류하는 새로운 게시 형식입니다.
런타임 코드 크기 줄이기
대형 클래스 또는 자동 생성된 코드와 같이 런타임 시 앱에서 사용되지 않는 코드를 확인합니다. R8 같은 코드 옵티마이저는 코드 크기를 최적화 및 축소하는 데 도움이 될 수 있지만 런타임 상수로 보호되는 코드를 처리할 수는 없습니다. 다양한 최적화 도구를 최대한 활용하려면 확인 플래그를 컴파일 시간 상수로 바꿉니다.
Gradle 구성 파일에서 코드 및 리소스 축소를 사용 설정할 수 있습니다.
android {
buildTypes {
getByName("release") {
isMinifyEnabled = true
isShrinkResources = true
}
}
}
불필요한 레이아웃 삭제
사용하지 않는 레이아웃을 소규모 UI 변경사항과 병합하고 불필요한 레이아웃을 삭제하여 전반적인 앱 코드 크기를 줄입니다. 또한 가능한 경우 레이아웃과 뷰를 동적으로 렌더링할 수 있습니다. 이렇게 하면 정적 템플릿을 그리지 않고 기술 오버헤드 없이 대체 레이아웃을 적용할 수 있습니다.
자주 사용되지 않는 기능 재평가
특히 일일 활성 사용자(DAU) 측정항목이 낮은 기능을 사용 중지하여 Android(Go 버전)에 맞게 최적화합니다. 예를 들면 복잡한 애니메이션, 대용량 GIF 파일 또는 앱 성공에 불필요한 기타 미학적 추가사항을 제거할 수 있습니다.
Dynamic Delivery 활용
Play Feature Delivery는 App Bundle의 고급 기능을 사용하여 앱의 특정 기능을 조건부로 전송하거나 주문형으로 다운로드할 수 있도록 합니다. 맞춤 전송에 기능 모듈을 사용할 수 있습니다. 기능 모듈의 고유한 이점은 Android 5.0(API 수준 21) 이상을 실행하는 기기에 앱의 다양한 기능을 다운로드하는 방법 및 시기를 맞춤설정할 수 있다는 점입니다.
변환 가능한 문자열 크기 줄이기
Android Gradle resConfigs
속성을 사용하여 앱에 필요하지 않은 대체 리소스 파일을 삭제할 수 있습니다. 언어 리소스가 포함된 라이브러리(예: AppCompat 또는 Google Play 서비스)를 사용 중인 경우, 앱은 앱 번역과 관계없이 라이브러리 메시지의 모든 번역된 언어 문자열을 포함합니다. 앱에서 공식적으로 지원하는 언어만 유지하려면 resConfig
속성을 사용하여 언어를 지정할 수 있습니다. 지정되지 않은 언어의 리소스는 모두 삭제됩니다.
언어 리소스를 영어와 프랑스어로 제한하려면 아래와 같이 defaultConfig
를 수정하면 됩니다.
android {
defaultConfig {
...
resConfigs "en", "fr"
}
}
선택적 번역 사용
앱 UI에 표시되지 않는 특정 문자열은 번역할 필요가 없습니다. 디버깅용 문자열, 예외 메시지 또는 URL은 리소스가 아닌 코드의 문자열 리터럴이어야 합니다.
예를 들어 URL은 번역할 필요가 없습니다.
<string name="car_frx_device_incompatible_sol_message">
This device doesn\'t support Android Auto.\n
<a href="https://support.google.com/androidauto/answer/6395843">Learn more</a>
</string>
<
및 >
는 <
및 >
의 이스케이프 문자이므로 인식할 수도 있습니다. 이 태그가 필요한 이유는 <a>
태그를 <string>
태그 안에 배치하려고 할 때 Android 리소스 컴파일러에서 태그가 인식되지 못해 태그가 삭제되기 때문입니다. 하지만 이는 HTML 태그와 URL을 78개 언어로 번역한다는 의미입니다. 대신 다음과 같이 HTML을 삭제할 수 있습니다.
<string name="car_frx_device_incompatible_sol_message">
This device doesn\'t support Android Auto.
</string>
네이티브 바이너리와 공통 종속 항목 결합
앱에 공통 기본 종속 항목이 있는 여러 자바 네이티브 인터페이스(JNI) 구현이 있는 경우 다양한 바이너리가 중복 구성요소로 APK 크기를 늘리고 있습니다. 여러 JNI 바이너리를 하나의 JNI 바이너리 파일로 결합하는 동시에 자바 파일과 JNI 파일을 분리할 수 있습니다.
이를 통해 APK 크기를 크게 줄일 수 있습니다.
이 페이지에 나와 있는 콘텐츠와 코드 샘플에는 콘텐츠 라이선스에서 설명하는 라이선스가 적용됩니다. 자바 및 OpenJDK는 Oracle 및 Oracle 계열사의 상표 또는 등록 상표입니다.
최종 업데이트: 2025-07-27(UTC)
[[["이해하기 쉬움","easyToUnderstand","thumb-up"],["문제가 해결됨","solvedMyProblem","thumb-up"],["기타","otherUp","thumb-up"]],[["필요한 정보가 없음","missingTheInformationINeed","thumb-down"],["너무 복잡함/단계 수가 너무 많음","tooComplicatedTooManySteps","thumb-down"],["오래됨","outOfDate","thumb-down"],["번역 문제","translationIssue","thumb-down"],["샘플/코드 문제","samplesCodeIssue","thumb-down"],["기타","otherDown","thumb-down"]],["최종 업데이트: 2025-07-27(UTC)"],[],[],null,["# Reduce app size\n\nSmall app size is directly related to download success, particularly in\nemerging markets with poor network device connections or low network\nspeeds. This can result in lower app usage rates, which in turn lowers the\nscope and reach of your audience. However, there are multiple ways to help\nreduce the size of your app.\n\nBest practices\n--------------\n\n### Upload app as Android App Bundle\n\nThe easiest way to gain immediate app size savings when publishing to Google\nPlay is by uploading your app as an [Android App Bundle](/guide/app-bundle),\nwhich is a new publishing format that includes all your app's compiled code and\nresources, and defers APK generation and signing to Google Play.\n\n### Reduce runtime code size\n\nCheck for code that your app doesn't use at runtime, for example any large\nclasses or auto-generated code. Code optimizers like\n[R8](/studio/build/shrink-code) can help optimize and shrink code size, but\nthey can't deal with code guarded by runtime-constants. Replace the check\nflags with compile-time constants to make the best use of various optimization\ntools.\nYou can enable code and resource shrinking in your gradle configuration file: \n\n android {\n buildTypes {\n getByName(\"release\") {\n isMinifyEnabled = true\n isShrinkResources = true\n }\n }\n }\n\n### Remove unnecessary layouts\n\nMerge unused layouts with small UI changes and remove any unnecessary\nlayouts to reduce overall app code size. Additionally, you can dynamically\nrender layouts and views wherever possible. This lets you avoid drawing static\ntemplates and apply alternate layouts without the technical overhead.\n\n### Re-evaluate infrequently used features\n\nSpecifically optimize for Android (Go edition) by disabling features that\nhave low daily active user (DAU) metrics. Examples of this include removing\ncomplex animations, large GIF files, or any other aesthetic additions not\nnecessary for app success.\n\n### Utilize dynamic delivery\n\n[Play Feature Delivery](/guide/playcore/feature-delivery) uses advanced\ncapabilities of app bundles, allowing certain features of your app to be\ndelivered conditionally or downloaded on demand. You can use feature modules\nfor custom delivery. A unique benefit of feature modules is the ability to\ncustomize how and when different features of your app are downloaded onto\ndevices running Android 5.0 (API level 21) or higher.\n\n### Reduce translatable string size\n\nYou can use the Android Gradle `resConfigs` property to remove\nalternative resource files that your app doesn't need. If you're using a\nlibrary that includes language resources (such as AppCompat or Google Play\nServices), then your app includes all translated language strings for library\nmessages, regardless of app translation. If you'd like to keep only the\nlanguages that your app officially supports, you can specify those languages\nusing the `resConfig` property. Any resources for languages not specified are\nremoved.\n\nTo limit your language resources to just English and French, you can edit\n`defaultConfig` as shown below: \n\n\n android {\n defaultConfig {\n ...\n resConfigs \"en\", \"fr\"\n }\n }\n\n### Use selective translation\n\nIf a given string isn't visible in the app's UI, then you don't have to\ntranslate it. Strings for the purpose of debugging, exception messages,\nor URLs should be string literals in code, not resources.\n\nFor example, don't bother translating URLs. \n\n \u003cstring name=\"car_frx_device_incompatible_sol_message\"\u003e\n This device doesn\\'t support Android Auto.\\n\n <a href=\"https://support.google.com/androidauto/answer/6395843\">Learn more</a>\n \u003c/string\u003e\n\nYou may recognize `<` and `>`, as these are escape characters for\n`\u003c` and `\u003e`. They're needed here because if you were to put an `\u003ca\u003e` tag inside\nof a `\u003cstring\u003e` tag, then the Android resource compiler drops them since it\ndoesn't recognize the tag. However, this means that you're translating the HTML\ntags and the URL to 78 languages. Instead, you can remove the HTML: \n\n \u003cstring name=\"car_frx_device_incompatible_sol_message\"\u003e\n This device doesn\\'t support Android Auto.\n \u003c/string\u003e\n\n### Combine native binaries with common dependencies\n\nIf your app has different Java Native Interface (JNI) implementations\nwith common underlying dependencies, then the various binaries are increasing\nthe APK size with redundant components. You can combine several JNI binaries\ninto a single JNI binary file while keeping the Java and JNI files separate.\nThis can reduce your APK size quite dramatically."]]