[안드로이드 성능 최적화 인터뷰 질문] APK 슬림화 방법

apk를 날씬하게 만드는 방법

이 질문으로 무엇을 조사하고 싶나요?

  1. APK를 줄이는 방법에 대한 실제 시나리오를 이해하고 있나요? APK를 줄이는 방법으로 인해 발생하는 시나리오를 잘 알고 있나요?

조사할 지식 포인트

  1. APK를 슬림화하여 프로젝트에 활용하는 방법과 기본지식

지원자는 어떻게 대답해야 할까?

APK의 크기는 앱 로딩 속도, 메모리 크기, 전력 소비에 큰 영향을 미칩니다. 일반적으로 사용자는 APK 크기가 너무 큰 앱을 다운로드하는 것을 좋아하지 않습니다. 특히 트래픽과 휴대폰 메모리가 제한된 사용자의 경우 APK가 너무 크면 거부되는 경우가 많으므로 APK를 줄여야 합니다.

APK를 슬림화하려면 먼저 APK의 구조를 이해해야 합니다. APK가 어떤 부분으로 구성되어 있는지 이해해야만 APK를 타겟 방식으로 슬림화할 수 있습니다.
APK는 주로 다음 부분으로 구성됩니다.

  • META-INF / : 포함 철명 문건 CERT.SF, CERT.RSA, 이후 manifest 문건 MANIFEST.MF.
  • assets/: 리소스 파일을 저장합니다. 이러한 리소스는 바이너리로 컴파일되지 않습니다.
  • lib/: 일부 참조된 타사 라이브러리가 포함되어 있습니다.
  • resources.arsc: res/values/에 있는 모든 리소스를 포함합니다(예:strings,styles 및). 기타 레이아웃 파일, 사진 등resources.arsc에 포함되지 않은 리소스 경로 정보
  • res/: resources.arsc에 저장되지 않은 res의 리소스를 포함합니다.
  • classes.dex: dx 컴파일 후 Android 가상 머신이 이해할 수 있는 Java 소스 코드 파일입니다.
  • AndroidManifest.xml: 설명할 필요 없음

android studio --> build --> APK 분석을 사용하여 위 각 부분의 파일 크기를 확인하세요.

아래 그림과 같이 차지하는 공간은 주로 코드, res, lib 입니다. 내 에셋에 파일이 없기 때문에 공간을 많이 차지하지 않는 것 같습니다. 실제로 파일이 많으면 자산, 그것은 여전히 ​​많은 공간을 차지할 것입니다.큰 공간. 따라서 APK를 축소할 때 주로 代码, res, libassets에 중점을 두세요. . 고려해야 할 주요 측면:

img

리소스 파일의 수와 크기를 줄입니다.

APK를 줄이는 아주 간단한 방법은 리소스 파일의 수와 크기를 줄이는 것임을 이해해야 합니다.

쓸모없는 리소스 제거

사용lint도구를 사용하여res/사용하지 않는 리소스가 있는지 여부

그러나 일부 타사 라이브러리의 경우 Lint를 사용하여 감지되지 않을 수 있습니다.shrinkResources을 사용하여 라이브러리 파일에서 쓸모 없는 리소스를 삭제하고 proguard와 함께 사용하여 압축할 수 있습니다. 코드

android {
    
    
    // Other settings

    buildTypes {
    
    
        release {
    
    
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

사용하지 않는 여유 리소스를 제거합니다. 예를 들어 일부 타사 라이브러리의 경우 국제화 문제로 인해 수십 개의 언어를 지원할 수 있지만 우리 애플리케이션은 중국어만 지원하면 됩니다. 이 경우 resConfig 또는 resConfigs 해결하세요.
다음 코드는 중국어만 지원하도록 언어 리소스를 제한하는 방법을 보여줍니다.

android {
    
    
    defaultConfig {
    
    
        ...
        resConfigs "zh"
    }
}
리소스를 최소화하는 라이브러리 사용

프로젝트를 개발할 때 타사 라이브러리를 많이 사용하는 경우가 많지만 타사 라이브러리의 용량이 매우 큰 경우가 많은데 어떻게 압축해야 할까요?

  • ProGuard를 이용하여 코드를 압축한 후 shrinkResources와 함께 사용하세요. 방법은 위의 shrinkResources 사용법을 참고하세요.

  • 그러나 ProGuard는 라이브러리 자체에서 사용되지 않는 일부 코드만 압축할 수 있지만 라이브러리 자체는 여전히 다른 타사 라이브러리에 의존할 수 있으며 ProGuard는 이러한 라이브러리를 효과적으로 제거할 수 없습니다.
    많은 타사 라이브러리는 특정 기능에 대해 정식 버전, 간소화된 버전, 특수 버전 등 여러 버전을 제공합니다. 필요한 기능을 포함할 수 있는 가장 작은 버전의 라이브러리만 선택하면 됩니다. . 물론, 소스코드를 직접 구해서 필요한 기능을 추출할 수 있다면 더 좋겠죠.

특정 화면 밀도만 지원

Android는 다양한 화면 밀도 장치를 지원합니다. Android 4.4 이상에서는 ldpi, mdpi, tvdpi, hdpi, xhdpi, xxhdpi 및 xxxhdpi를 지원합니다. Android는 매우 다양한 화면 밀도를 지원하지만 이를 모두 지원할 필요는 없으며 필요에 따라 지원을 선택할 수 있습니다.

드로어블 객체 사용

일부 간단한 이미지의 경우 사진 대신 Drawable XML을 사용할 수 있습니다.

자원 재사용

동일한 사진을 일부 유사한 이미지에 재사용할 수 있습니다.

  • 모양은 같지만 색상과 그림자가 다른 이미지, Android 5.0(API 레벨 21) 이상에서는 android:tint, tintMode Wait를 사용할 수 있습니다. 속성을 조정하려면 ColorFilter을 사용하여 Android 5.0 이하에서 조정할 수 있습니다.

  • 모양과 색상은 동일하지만 각도가 다른 이미지입니다. rotate 등을 사용하여 각도를 조정하여 재사용 효과를 얻을 수 있습니다. 예:

    <?xml version="1.0" encoding="utf-8"?>
    <rotate xmlns:android="http://schemas.android.com/apk/res/android"
        android:drawable="@drawable/ic_thumb_up"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fromDegrees="180" />
    
코드 렌더링

사용자 정의 보기를 사용하여 그리는 등 이미지를 사용하는 대신 코드를 통해 렌더링할 수도 있습니다. 사진수도 줄었고, APK도 자연스럽게 얇아졌습니다.

PNG 파일 압축

AAPT 도구는 빌드 프로세스 중에 res/drawable/ 폴더에 있는 PNG 이미지 리소스에 대해 자동으로 무손실 압축을 수행합니다. 예를 들어, 트루 컬러 PNG 이미지가 실제로 256개 이하의 색상만 필요하면 8비트 팔레트 이미지(PNG8)로 변환될 수 있습니다. 변환된 이미지 품질은 저하되지 않고 메모리만 덜 차지합니다.

PNG 및 JPG 압축

유가 사용pngcrush, pngquant 또는 弋缩 JPG 척편. guetzli 또는 packJPG 사용오리 히로 PNG 가방. zopflipng

WebP 사용

JPG 및 PNG 이미지 대신 WebP를 사용할 수 있습니다. WebP JPG와 PNG의 장점을 유지하면서 더 나은 압축을 제공하고 더 작은 크기를 달성할 수 있습니다.

注意事项:启动图标最好不要用WebP,因为谷歌商店只接受启动图片格式为PNG的APK。
벡터 그래픽 사용

벡터 그래픽을 사용하여 해상도 독립적인 아이콘과 기타 확장 가능한 미디어 파일을 그릴 수 있습니다. 전체 화면만큼 큰 선명한 이미지는 벡터 이미지를 사용하는 경우 100바이트 크기만 필요할 수 있습니다.
그러나 벡터 그래픽을 사용하면 시스템이 그리는 데 더 많은 시간이 걸리므로 작은 이미지에만 벡터 그래픽을 사용하는 것이 가장 좋습니다.

애니메이션 이미지에 벡터 그래픽 사용

프레임 애니메이션을 만드는 데 사용하지 마세요AnimationDrawable. 그렇지 않으면 프레임당 하나의 이미지를 사용하면 많은 공간을 차지하게 됩니다. 이때 AnimatedVectorDrawableCompat를 사용해야 합니다.

불필요하게 생성된 코드 제거

자동으로 생성된 코드의 목적을 이해해야 합니다. 예를 들어, 사용하지 않을 수도 있는 많은 코드를 자동으로 생성하는 프로토콜 버퍼 도구가 많이 있습니다.

열거형 사용을 피하세요

단일 열거로 APK 크기를 1.0~1.4KB까지 늘릴 수 있습니다. 복잡한 시스템이나 공유 라이브러리의 경우 이로 인해 APK 크기가 상당히 커질 수 있습니다.
가능하다면 @IntDef 주석 및 ProGuard을 사용하여 열거형을 제거하고 정수로 변환하는 것을 고려해 보십시오. 이 유형 변환은 열거형의 유형 안전성 이점을 유지합니다.

로컬 바이너리의 크기 줄이기

앱이 네이티브 코드와 Android NDK를 사용하는 경우 두 가지 방법을 통해 코드를 최적화하여 APK 크기를 줄일 수 있습니다.

  • 디버그 기호 제거
    Android NDK에서 제공되는 arm-eabi-strip 도구를 사용하여 네이티브 라이브러리에서 불필요한 디버그 기호를 제거하세요.

  • 로컬 라이브러리 추출 방지
    Android 6.0 이전에는 so 파일이 apk로 압축되었습니다. 시스템이 애플리케이션을 설치할 때 so 파일의 압축을 데이터 파티션에 풀어서 동일합니다. so 파일의 사본이 두 개 있습니다. 하나는 apk에, 다른 하나는 데이터 영역에 있으며, 이는 두 배의 공간을 차지합니다. Android 6.0부터 AndroidManifest.xml에서 새로운 속성을 사용할 수 있습니다.

    다음과 같습니다. 이 속성은 시스템에 apk에서 so 파일의 압축을 풀지 말고 System.loadLibrary 호출을 수정하여 apk에서 so 파일을 직접 열도록 지시합니다.

    <application
     android:extractNativeLibs=”false”
     ...
    >
    
여러 라이트 버전의 APK 유지

앱에는 지역 및 언어 정보 등 사용자가 전혀 사용하지 않는 콘텐츠가 많이 포함될 수 있습니다. 화면 크기나 GPU 텍스처 지원과 같은 요소를 기반으로 다양한 버전의 APK를 제공할 수 있습니다. 사용자가 APK를 다운로드할 때 휴대폰의 특성과 설정에 따라 특정 버전의 APK가 다운로드되므로 사용자는 전혀 필요하지 않은 콘텐츠를 다운로드하지 않습니다.

android {
    
    
  ...
  splits {
    
    
    //根据屏幕像素密度来创建多个APK
    density {
    
    
      enable true
      //根据屏幕密度创建两个版本APK,"mdpi", "hdpi"
      reset()
      include "mdpi", "hdpi"
    }
    //根据手机cpu指令集分类创建多个APK
    abi {
    
    
      enable true
      //创建 "x86", "x86_64"两个版本APK
      reset()
      include "x86", "x86_64"
    }
  }
}

APK를 컴파일하고 결과를 살펴보겠습니다.

img

위 사진을 분석해 보면 6개의 APK가 생성된 것을 알 수 있는데, 왜 6개일까요?
답변:

우선 화면 밀도에는 세 가지 버전이 있습니다(mdpi, x86_64, gralde는 모든 화면 밀도 리소스를 포함하는 기본 버전도 생성합니다). , ABI 명령어 세트 두 가지 버전이 있습니다(gralde의 기본 컴파일은 모든 ABI 명령어 세트 버전을 포함하는 APK를 추가하지 않습니다. 추가하려면 abi 코드 블록에 universalApk true 를 추가해야 합니다) ), 6종으로 합쳐진다. 각 APK에는 해당 리소스만 포함됩니다. 예를 들어 app-hdpiX86-debug.apk에는 화면 밀도가 hdpiX86 라이브러리인 리소스만 포함됩니다. 파일.
휴대전화의 CPU 명령어 세트가 x86이고 화면 밀도가 hdpi인 ​​경우 다운로드됩니다. app-hdpiX86-debug.apk


마침내

Android 인터뷰 질문 모음을 모았습니다. 위의 인터뷰 질문 외에도 [Java 기본, 컬렉션, 멀티스레딩, 가상 머신, 리플렉션, 제네릭 및 동시 프로그래밍, Android의 4가지 주요 구성 요소, 비동기 작업 및 메시지 메커니즘, UI 그리기, 성능 조정, SDN, 타사 프레임워크, 디자인 패턴, Kotlin, 컴퓨터 네트워크, 시스템 시작 프로세스, Dart, Flutter, 알고리즘 및 데이터 구조 , NDK, H. 264, H.265. 오디오 코덱, FFmpeg, OpenMax, OpenCV, OpenGL ES
여기에 이미지 설명을 삽입하세요.

도움이 필요한 친구들은 아래 QR 코드를 스캔하여 모든 면접 질문 + 답변 분석을 무료로 받을 수 있습니다! ! !

추천

출처blog.csdn.net/datian1234/article/details/134837248