🧩 μ•± λ‚œλ…ν™”κ°€ 무엇인지 μ•Œμ•„λ³΄μž !

sery270Β·2021λ…„ 12μ›” 14일
1

Android

λͺ©λ‘ 보기
13/13

1️⃣ 앱 μΆ•μ†Œ,Β λ‚œλ…ν™” 및 μ΅œμ ν™”


  • gradle 3.4.0 μ΄μƒμœΌλ‘œ ν”„λ‘œμ νŠΈλ₯Ό λΉŒλ“œν•˜λŠ” 경우, ν”ŒλŸ¬κ·ΈμΈμ€ ν”„λ‘œκ°€λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 컴파일 μ‹œκ°„ μ½”λ“œ μ΅œμ ν™”λ₯Ό ν•˜μ§€ μ•Šκ³ , R8 컴파일러λ₯Ό μ‚¬μš©ν•˜μ—¬ 컴파일 μ‹œκ°„ μ½”λ“œ μ΅œμ ν™” μž‘μ—…μ„ ν•œλ‹€κ³  ν•©λ‹ˆλ‹€.
  • λΉŒλ“œ μ‹œκ°„ 증가 및 개발자의 μ„€μ • 미슀둜 μΈν•œ 버그 λ°œμƒ κ°€λŠ₯성이 μžˆμ–΄, Android μŠ€νŠœλ””μ˜€λ₯Ό μ΄μš©ν•˜μ—¬ μƒˆ ν”„λ‘œμ νŠΈλ₯Ό λ§Œλ“€ λ•Œ μΆ•μ†Œ, λ‚œλ…ν™” 및 μ½”λ“œ μ΅œμ ν™” κΈ°λŠ₯이 기본으둜 μ‚¬μš© μ„€μ •λ˜λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€.
    • λ”°λΌμ„œ, μ•±μ˜ μ΅œμ’… 버전을 λΉŒλ“œν•  λ•Œ μ΄λŸ¬ν•œ 컴파일 μ‹œκ°„ μž‘μ—…μ„ μ‚¬μš© μ„€μ •ν•˜λŠ” 것이 κ°€μž₯ μ’‹μŠ΅λ‹ˆλ‹€.

R8μ΄λž€ ?

  • R8은 ν”„λ‘œμ νŠΈμ˜ μžλ°” λ°”μ΄νŠΈ μ½”λ“œλ₯Ό Android ν”Œλž«νΌμ—μ„œ μ‹€ν–‰λ˜λŠ” DEX ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•˜λŠ” κΈ°λ³Έ μ»΄νŒŒμΌλŸ¬μž…λ‹ˆλ‹€.
  • R8은 ν”„λ‘œκ°€λ“œ κ·œμΉ™ νŒŒμΌμ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

R8이 ν•˜λŠ” 일

  • μ½”λ“œ μΆ•μ†Œ (Tree shaking)
    • μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μ½”λ“œλ₯Ό μ‚­μ œν•©λ‹ˆλ‹€.
    • λŸ°νƒ€μž„μ— ν•„μš”ν•˜μ§€ μ•Šλ‹€κ³  R8이 νŒλ‹¨ν•œ μ½”λ“œλ₯Ό μ‚­μ œν•˜λŠ” ν”„λ‘œμ„ΈμŠ€
      • μ•± 및 라이브러리 쒅속 ν•­λͺ©μ—μ„œ λ―Έμ‚¬μš© 클래슀, ν•„λ“œ, λ©”μ„œλ“œ, 속성
  • λ¦¬μ†ŒμŠ€ μΆ•μ†Œ
    • μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ¦¬μ†ŒμŠ€λ₯Ό μ‚­μ œν•©λ‹ˆλ‹€.
      • μ•± 라이브러리 쒅속 ν•­λͺ©μ˜ λ―Έμ‚¬μš© λ¦¬μ†ŒμŠ€λ₯Ό ν¬ν•¨ν•˜μ—¬ νŒ¨ν‚€μ§•λœ μ•±μ—μ„œ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ¦¬μ†ŒμŠ€
    • λ¦¬μ†ŒμŠ€ μΆ•μ†ŒλŠ” μ½”λ“œ μΆ•μ†Œμ™€ ν•¨κ»˜ μ‚¬μš©ν•  λ•Œλ§Œ μž‘λ™ν•©λ‹ˆλ‹€
  • λ‚œλ…ν™”
    • ν΄λž˜μŠ€μ™€ 멀버 이름을 μ€„μž…λ‹ˆλ‹€.
    • λ‚œλ…ν™”μ˜ λͺ©μ μ€ μ•± 클래슀, λ©”μ„œλ“œ 및 ν•„λ“œμ˜ 이름을 λ‹¨μΆ•ν•˜μ—¬ μ•± 크기λ₯Ό μ€„μ΄λŠ” κ²ƒμž…λ‹ˆλ‹€.
    • 결둠적으둜 λ‚œλ…ν™”λŠ” DEX 파일 크기λ₯Ό μ€„μž…λ‹ˆλ‹€.
  • μ΅œμ ν™”
    • μ½”λ“œ 검사 및 λ‹€μ‹œ μž‘μ„±ν•©λ‹ˆλ‹€.
    • DEX 파일 크기λ₯Ό 더 μ€„μž…λ‹ˆλ‹€.

keep κ·œμΉ™ ‼️

  • κ°œλ°œμžκ°€ μœ μ§€ν•  μ½”λ“œλ₯Ό μ μ ˆν•˜κ²Œ λ§žμΆ€μ„€μ •ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.
    • 즉, keep κ·œμΉ™μ€ 앱을 μΆ•μ†Œν•  λ•Œ R8이 μ‚­μ œν•˜λ©΄ μ•ˆ λ˜λŠ” 클래슀λ₯Ό μ§€μ •ν•˜κ³  R8은 이 클래슀λ₯Ό μ•±μ˜ μ§„μž…μ μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€κ³  κ°„μ£Όν•©λ‹ˆλ‹€.

      keep κ·œμΉ™κ³Ό κ΄€λ ¨λœ R8의 λ™μž‘λ°©μ‹

      1. μ•± μ½”λ“œλ₯Ό μΆ•μ†Œν•˜κΈ° μœ„ν•΄ R8은 λ¨Όμ € κ²°ν•©λœΒ κ΅¬μ„± 파일 쑰합을 기반으둜 μ•± μ½”λ“œμ˜ λͺ¨λ“  μ§„μž…μ μ„ κ²°μ •ν•©λ‹ˆλ‹€.
        • 이 μ§„μž…μ μ—λŠ” Android ν”Œλž«νΌμ΄ μ•±μ˜ ν™œλ™ λ˜λŠ” μ„œλΉ„μŠ€λ₯Ό μ—¬λŠ” 데 μ‚¬μš©ν•  수 μžˆλŠ” λͺ¨λ“  ν΄λž˜μŠ€κ°€ ν¬ν•¨λ©λ‹ˆλ‹€.
      2. R8은 각 μ§„μž…μ μ—μ„œ μ‹œμž‘ν•˜μ—¬ μ•±μ˜ μ½”λ“œλ₯Ό 검사해 앱이 λŸ°νƒ€μž„μ— μ•‘μ„ΈμŠ€ν•  수 μžˆλŠ” λͺ¨λ“  λ©”μ„œλ“œ, 멀버 λ³€μˆ˜ 및 기타 클래슀의 κ·Έλž˜ν”„λ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€.
      3. κ·Έλž˜ν”„μ— μ—°κ²°λ˜μ§€ μ•Šμ€ μ½”λ“œλŠ”Β μ—°κ²°ν•  수 μ—†λŠ”Β κ²ƒμœΌλ‘œ κ°„μ£Όλ˜λ©° μ•±μ—μ„œ μ‚­μ œλ  수 μžˆμŠ΅λ‹ˆλ‹€.
  • ProGuard κ·œμΉ™ νŒŒμΌμ—Β keep 쀄을 μΆ”κ°€
  • μœ μ§€ν•˜λ €λŠ” μ½”λ“œμ—Β @Keep 주석을 μΆ”κ°€
    • 전체 ν΄λž˜μŠ€κ°€ κ·ΈλŒ€λ‘œ μœ μ§€λ¨ (λ©”μ„œλ“œ,ν•„λ“œ,클래슀 이름이 κ·ΈλŒ€λ‘œ μœ μ§€λ¨)
  • μ΄λŸ¬ν•œ keep κ·œμΉ™μ€ R8이 μ½”λ“œλ₯Ό μ•±μ˜ μ΅œμ’… DEX에 μœ μ§€ν•  뿐만 μ•„λ‹ˆλΌ μ›λž˜ 이름 지정을 μœ μ§€ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.

2οΈβƒ£Β κ·Έλž˜μ„œ λ‚œλ…ν™”κ°€ 무엇이고 μ™œ ν•΄μ•Όν•˜λ‚˜μš” ?


λ¨Όμ € μ•±μ˜ μš©λŸ‰κ³Ό 관련이 μžˆμŠ΅λ‹ˆλ‹€. μ‚¬μš©μžκ°€ 맀λ ₯적인 앱이라고 λ°›μ•„λ“œλ¦¬λŠ” μš”μ†Œ 쀑 ν•˜λ‚˜λŠ” μ•±μ˜ ν¬κΈ°μž…λ‹ˆλ‹€. κ³΅μ‹λ¬Έμ„œμ—μ„  μ•±μ˜ 크기λ₯Ό μ΅œλŒ€ν•œ μž‘κ²Œ λ§Œλ“€κΈ°μœ„ν•œ λ°©λ²•μœΌλ‘œ μ½”λ“œ 및 λ¦¬μ†ŒμŠ€ μΆ•μ†Œ/ λ‚œλ…ν™”/ μ΅œμ ν™”μ˜ 방법을 μ†Œκ°œν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

각 방법은 μ•„λž˜μ™€ 같이 정리할 수 μžˆμŠ΅λ‹ˆλ‹€.

  • μ•± μΆ•μ†Œ (μ½”λ“œ μΆ•μ†Œ, λ¦¬μ†ŒμŠ€ μΆ•μ†Œ) : μ‚¬μš©λ˜μ§€ μ•ŠλŠ” μ½”λ“œμ™€ λ¦¬μ†ŒμŠ€λ₯Ό μ‚­μ œν•˜μ—¬, DEX 파일 크기λ₯Ό μ€„μž…λ‹ˆλ‹€.
  • λ‚œλ…ν™” : μ•± 클래슀, λ©”μ„œλ“œ 및 ν•„λ“œμ˜ 이름을 λ‹¨μΆ•ν•˜μ—¬ , DEX 파일 크기λ₯Ό μ€„μž…λ‹ˆλ‹€.
  • μ΅œμ ν™” : μ½”λ“œλ₯Ό κ²€μ‚¬ν•˜μ—¬ λΆˆν•„μš”ν•œ ꡬ문을 κ°œμ„ ν•˜μ—¬, DEX 파일 크기λ₯Ό μ€„μž…λ‹ˆλ‹€.

이 쀑 μ œκ°€ μ›λž˜ κΆκΈˆν–ˆλ˜, κ·Έλž˜μ„œ λ‚œλ…ν™”λ₯Ό μ™œ ν•΄μ•Όν•˜λ‚˜μš”? 의 질문으둜 λŒμ•„μ˜€μžλ©΄, μ•± μš©λŸ‰ λΏλ§Œμ•„λ‹ˆλΌ λ³΄μ•ˆμ˜ κ΄€μ μ—μ„œ λ‚œλ…ν™”λŠ” ν•„μˆ˜μ μ΄κΈ°λ„ν•©λ‹ˆλ‹€.

λ‚œλ…ν™”μ˜ μ›λž˜ λͺ©μ μ€ μ•± 클래슀, λ©”μ„œλ“œ 및 ν•„λ“œμ˜ 이름을 λ‹¨μΆ•ν•˜μ—¬ μ•± 크기λ₯Ό μ€„μ΄λŠ” κ²ƒμž…λ‹ˆλ‹€. DEX νŒŒμΌμ€ λ‹€μˆ˜μ˜ 클래슀, 멀버에 λŒ€ν•œ 색인을 μƒμ„±ν•©λ‹ˆλ‹€. μ½”λ“œ 자체λ₯Ό μ‚­μ œν•˜μ§€λŠ” μ•Šμ§€λ§Œ, ν΄λž˜μŠ€μ™€ λ©€λ²„μ˜ κΈ΄ 이름을 λ‹¨μΆ•ν•˜λ―€λ‘œμ„œ, μ•± 크기λ₯Ό λ‹¨μΆ•μ‹œν‚¬ 수 있게 λœλ‹€λŠ” λ§μž…λ‹ˆλ‹€.

μ—¬κΈ°μ„œ λ‚œλ…ν™” λ°©μ‹μ˜ 핡심인 μž„μ˜λ‘œ 이름을 단좕,μΉ˜ν™˜μ‹œν‚€λŠ” 방법에 λŒ€ν•΄ μ£Όλͺ©ν•΄λ³΄λ©΄, λ³΄μ•ˆμ˜ κ΄€μ μ—μ„œ λ‚œλ…ν™”μ˜ ν•„μš”μ„±μ„ 이해할 수 μžˆκ²Œλ©λ‹ˆλ‹€.

μ™œ λ‚œλ…ν™”λ₯Ό ν•΄μ•Όν•˜λ‚˜μš” ?

  • μ•± μš©λŸ‰μ„ 쀄이기 μœ„ν•΄
  • μ§€μ μž¬μ‚°κΆŒμ„ λ³΄ν˜Έν•˜κΈ° μœ„ν•΄ (λ””μ»΄νŒŒμΌλ‘œ μΈν•œ μ½”λ“œ 볡ꡬ의 ν”Όν•΄λ₯Ό 예방)
  • μ›μΉ˜μ•ŠλŠ” μœ„λ³€μ‘°λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄
  • 정보 μœ μΆœμ„ λ°©μ§€ν•˜κΈ° μœ„ν•΄ (base url λ“±)

3οΈβƒ£Β λ‚œλ…ν™”ν•˜λŠ” 방법


  • λ¦¬μ†ŒμŠ€ μΆ•μ†ŒλŠ” μ½”λ“œ μΆ•μ†Œμ™€ ν•¨κ»˜ μ‚¬μš©ν•  λ•Œλ§Œ μž‘λ™ν•©λ‹ˆλ‹€
  • build.gradleΒ νŒŒμΌμ—μ„œΒ shrinkResources 속성을 true둜 μ„€μ •
    android {
        ...
        buildTypes {
            release {
                shrinkResources true // λ¦¬μ†ŒμŠ€ μΆ•μ†Œ true
                minifyEnabled true // μ½”λ“œ μΆ•μ†Œ true
                proguardFiles
                    getDefaultProguardFile('proguard-android.txt'),
                    'proguard-rules.pro'
            }
        }
    }
    • λ¦¬μ†ŒμŠ€ 제거λ₯Ό μ‹œμž‘ν•˜κΈ° 전에 λ™μ μœΌλ‘œ μƒμ„±λ˜κ±°λ‚˜ ν˜ΈμΆœλ˜λŠ” ν΄λž˜μŠ€λ‚˜ λ©”μ„œλ“œλ₯Ό μœ μ§€ν•˜λ €λ©΄Β proguard-rules.proΒ νŒŒμΌμ„ μˆ˜μ •ν•  ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€.

#️⃣ Reference


profile
κ°œλ°œμ„Έλ¦¬μ˜ μ„±μž₯기🌿

0개의 λŒ“κΈ€