https://developer.android.com/studio/projects/dynamic-delivery를 번역한 내용입니다.

다이나믹 딜리버리란?

다이나믹 딜리버리(Dynamic Delivery)라는 구글 플레이의 제공 모델은 Android App Bundles 사용하여 최적화된 APK 사용자 디바이스환경에 맞춰 생성하고 제공하므로 사용자들은 앱실행에 필요한 코드와 리소스만 다운로드합니다. 다양한 장치를 지원하기 위해 이상 여러개의 APK 빌드, 서명 관리 필요가 없으며 사용자는 작고 최적화 다운로드가 가능합니다.

대부분의 프로젝트는 다이나믹 딜리버리를 사용하여 최적화된 APK 지원하는 앱번들을 만드는데 많은 노력을 필요로 하지 않습니다. 예를들어, 만약 이미 컨벤션에 따라 코드와 리소스를 구조화했다면, 안드로이드 스튜디오 또는 커맨드라인을 이용하여 서명된 앱번들로 빌드 있고, 구글플레이에 업로드 있습니다

다이나믹 딜리버리를 최대한 활용하려면 앱의 기능들을 다이나믹 피쳐 모듈을 이용해서 모듈화하여 AppBundle 포함시키는 것이 좋습니다.

다이나믹 딜리버리를 통해 사용자는 필요에 따라 다운로드 하고 설치할 있으며, 사용자가 Google Play Instant 통해 설치하지 않고도 기능들을 사용할 있도록 instant-enabled 활용할 수도 있습니다.

다이나믹 피쳐 모듈을 구성하는것은 많은 노력과 리팩토링이 필요합니다. 따라서 다이나믹 피쳐로 모듈화 할때 가장 이득이 될만한 앱의 기능들 위주로 주의 깊게 고려해야합니다.

다이나믹 딜리버리와 다이나믹 피쳐 모듈을 지원하기 위해서 안드로이드 스튜디오 3.3 Android Gradle 3.3.0 이상을 사용해야합니다.

베이스 모듈

대부분의 프로젝트는 다이나믹 딜리버리를 지원 왜냐하면 앱의 베이스 APK 대한 코드와 리소스를 포함하는 모듈이 Android앱에서 프로젝트를 만들 기본적으로 사용하는 기본적인 모듈이기 때문입니다. , 아래의 application 플러그인을 build.gradle 파일에 적용한 모듈은 앱의 기본기능을 위한 코드와 리소스를 제공합니다.

앱의 초기 다운로드 크기를 줄이는 데 관심이 있다면, 모듈에 포함 된 모든 코드와 리소스가 앱의  베이스 APK에 포함된다는 점을 명심해야합니다.

베이스모듈은 앱에 핵심 기능을 제공하는 것 외에도 전체 앱 프로젝트에 영향을 주는 많은 빌드 구성 및 매니페스트 엔트리를 제공합니다. 예를들어 앱번들의 서명은 베이스 모듈에 제공한 정보로 결정되며 모든앱의 APK버전은 베이스모듈의 메니페스트에 있는 versionCode속성에 지정됩니다.

베이스 모듈의 매니페스트

앱 베이스 모듈의 매니페스트는 다른 앱 모듈의 매니페스트와 유사합니다. Google Play에서 앱의 베이스 APK를 생성하면 모든 모듈의 메니페스트를 베이스 APK로 병합합니다. 따라서 프로젝트에 다이나믹 피쳐 모듈을 추가하려는 경우 베이스 APK 메니페스트에 대한 몇가지 사항을 명심해야합니다.

  • 기본 APK가 항상 먼저 설치되므로 앱의 기본 진입점을 제공해야합니다. 즉, 다음과 같은 인텐트 필터를 사용하여 액티비티를 선언해야합니다.

  • 필요에 따라 다이나믹 피쳐 모듈을 다운로드 할 때 Android 6.0 (API 레벨 23) 이하를 실행하는 기기는 새 모듈의 설치를 완료하기 전에 앱을 다시 시작해야합니다. 다운로드 한 모듈의 코드와 리소스를 다운로드 한 후 즉시 액세스 할 수있게하려면 매니페스트에 SplitCompat 라이브러리에 대한 지원을 포함시켜야합니다. 자세한 내용은 다운로드 한 모듈에서 액세스 코드 및 리소스 읽어보세요.
  • 마찬가지로 Android 6.0 (API 레벨 23) 이하를 실행하는 기기에서 앱을 다시 시작해야 플랫폼에서 새 목록 항목을 적용 할 수 있습니다. 따라서 다이나믹 피처 모듈을 다운로드하는 즉시 특정 권한이나 서비스가 필요한 경우 기본 모듈의 매니페스트에 포함 시키십시오.
  • Android App Bundles에는 압축되지 않은 네이티브 라이브러리가 지원됩니다. 따라서 앱에 기본 라이브러리를 포함하고 디스크 사용량을 줄이려면 베이스 모듈의 메니페스트에 다음을 포함시킵니다.

베이스 모듈 빌드 구성

대부분의 기존 앱 프로젝트의 경우 베이스모듈의 빌드 구성에서 아무 것도 변경할 필요가 없습니다. 그러나 앱 프로젝트에 다이나믹 피처 모듈을 추가하려는 경우 베이스모듈의 빌드 구성에 대한 몇 가지 사항을 명심해야합니다.

  • 앱 서명 : 커맨드라인에서 앱번들을 빌드하려는 경우가 아니면 빌드 구성 파일에 서명 정보를 포함 할 필요가 없습니다 . 그러나 서명 정보를 포함하는 경우 기본 모듈의 빌드 구성 파일에만 포함해야합니다. 
  • 코드 축소 : 전체 앱 프로젝트에 대해 코드 축소를 사용하려면 기본 모듈의 build.gradle 파일에서 코드 축소를 수행해야합니다. 즉, 다이나믹 피처 모듈에 사용자 정의 ProGuard 규칙을 포함시킬 수 있지만 다이나믹 피처 모듈의 빌드 구성에서 minifyEnabled 속성은 무시됩니다.
  • splits블록은 무시됩니다 : 앱 번들로 빌드 할 때, Gradle은 android.splits블록안에 있는 속성들을 무시합니다. 앱 번들이 지원하는 configuration APK 타입 설정을 제어하려면, android.bundle을 대신 사용하여 configuration APK 타입 설정을 비활성화 합니다.
  • 앱 버전 관리 : 베이스모듈은 전체 앱 프로젝트의 버전 코드와 버전 이름을 결정합니다. 자세한 내용은 앱 업데이트 관리 방법 섹션을 참조하십시오.

configuration APK 유형을 활성화 또는 비활성화하기

기본적으로 앱 번들을 만들 때 각 언어 리소스, 화면 밀도 리소스 및 ABI 라이브러리에 대한 구성 APK 생성을 지원합니다. 아래에 표시된 것처럼 android.bundle 베이스 모듈의 build.gradle파일 에서 블록을 사용하면 하나 이상의 APK구성 타입에 대한 지원을 사용 중지 할 수 있습니다.

앱 업데이트 관리

Android App Bundles 및 Dynamic Delivery를 사용하면 더 이상 Google Play에 업로드하는 여러 APK의 버전 코드를 관리 할 필요가 없습니다. 대신 아래 그림과 같이 앱 기본 모듈에서 하나의 버전 코드 만 관리합니다.

앱 번들을 업로드하면 Google Play는 베이스모듈의 버전 코드를 사용하여 해당 번들에서 생성 한 모든 APK에 동일한 버전 코드를 할당합니다. 즉, 기기에서 앱을 다운로드하고 설치하면 해당 앱의 모든 분할 APK가 동일한 버전 코드를 공유합니다.

새로운 코드나 리소스로 앱을 업데이트하려면 앱의 기본 모듈에서 버전 코드를 업데이트하고 새로운 앱 번들을 새로 만들어야합니다. 앱 번들을 Google Play에 업로드하면 기본 모듈에서 지정한 버전 코드를 기반으로 새로운 APK 세트가 생성됩니다. 이후 사용자가 앱을 업데이트하면 Google Play에서 현재 기기에 설치된 모든 APK의 업데이트 된 버전을 제공합니다. 즉, 설치된 모든 APK가 새 버전 코드로 업데이트됩니다.

Note : 더 이상 모든 앱의 APK에 대한 버전 코드를 관리할 필요가 없으므로 더 이상 기기환경에 따른 버전코드를 동적으로 수정하는 로직을 포함할 필요가 없습니다.

추가 구성 APK 다운로드

위에서 설명한 업데이트 흐름의 한 가지 예외는 설치된 앱에 추가 구성 APK가 필요한 경우입니다. 이미 앱을 다운로드 한 후 기본 시스템 언어를 변경 한 사용자를 생각해보십시오. 앱이 해당 언어를 지원하면 기기에서 Google Play의 언어 리소스에 대한 추가 구성 APK를 요청하고 다운로드합니다. 그러나 앱에 대한이 유형의 업데이트로 버전 코드가 변경되지 않으므로 기기는 필요한 구성 APK 만 다운로드하고 설치합니다.

다이나믹 피처 모듈

다이나믹 피처 모듈을 사용하면 특정 기능과 리소스를 앱의 기본 모듈에서 분리하여 앱 번들에 포함 할 수 있습니다. 예를들어 사용자는 Base APK를 먼저 설치한 후에 Dynamic Delivery를 통해 나중에 필요할 때 해당 구성 요소를 다운로드하여 설치할 수 있습니다. 또한 사용자가 Google Play Instant를 통해 설치하지 않고도 해당 기능을 경험할 수 있도록 Instant-enabled dynamic fetuare를 만들 수 있습니다 .

예를 들어 사진을 찍고 메시지를 보내는 기능이 포함된 문자 메시지 앱을 생각해보십시오. 그러나 사용자 중 일부만 사진 메시지를 전송합니다. 사진을 전송하는 기능은 다운로드 가능한 다이나믹 피처 모듈로 포함하는 것이 좋습니다. 그렇게하면 초기 앱 다운로드 용량이 모든 사용자에게 더 적어지고 사진 메시지를 보내는 사용자만이 해당모듈을 추가로 다운로드하여 사용하면 됩니다

이 유형의 모듈화는 더 많은 노력과 앱의 기존 코드 리팩토링을 필요로하므로 필요에 따라 사용자가 사용할 수있는 앱의 기능을 신중하게 고려해야합니다. Android App Bundles은 이 기능을 지원하도록 앱을 전환하는 데 도움이되는 몇 가지 추가 옵션을 제공합니다. 이러한 옵션은이 섹션의 뒷부분에서 설명합니다.

Note : 앱에 다이나믹 피처 모듈이 포함 된 경우 Play Console의 내부 테스트 트랙을 통해 앱을 업로드하고 테스트 할 수 있습니다 . 그러나 앱을 프로덕션에 게시하려면 다이나믹 피처 베타 프로그램을 신청해야합니다. 자세한 내용은 동적 기능 모듈을 사용하여 앱을 게시하기위한 베타 프로그램에 대한 Play Console 도움말 항목으로 이동하십시오 .

일반적으로 다이나믹 피처 모듈은 일반 앱 모듈처럼 구성됩니다. 다이나믹 피처 모듈만이 가지고 있는 코드, 리소스, 애셋 들을 지원합니다. 하지만 매니페스트 파일에는 빌드 구성의 속성과 다이나믹 피처 모듈을 사용하여 필요할 때 다운로드 할 수 있는 속성이 추가로 있습니다. 자세한 내용은 아래의 섹션에서 설명하겠습니다.

다이나믹 피처 모듈 생성

새로운 다이나믹 피처 모듈을 만드는 가장 쉬운방법은 Android Studio 3.3 이상을 사용하는 것입니다. 다이나믹 피처 모듈은 베이스 모듈에 종속성이 있으므로 기존 앱 프로젝트에만 추가 할 수 있습니다.

Android Studio를 사용하여 앱 기능 프로젝트에 동적 피처 모듈을 추가하려면 다음을 수행하십시오.

  1. 메뉴에서 File > New > New Module을 선택합니다.
  2. Create new Module 다이얼로그에서 Dynamic Feature Module을 선택한 후 Next를 클릭합니다.
  3. Configure your new module 섹션에서 다음 내용들을 완료합니다.
    a. 드롭 다운 메뉴에서 앱 프로젝트의 Base application module을 선택합니다.
    b. Module 이름을 지정합니다. 안드로이드 스튜디오는 이 이름을 사용하여 모듈을 Gradle setting file의 Gradle 서브 프로젝트로 식별합니다. 앱번들을 만들 때 Gradle은 하위 피처 모듈이름의 마지막 요소를 사용하여 다이나믹 피처 모듈 매니페스트의 <manifest split> 속성에 대입하게됩니다.
    c. 모듈의 패키지명을 결정합니다. 기본적으로 안드로이드 스튜디오는 베이스 모듈의 패키지명과 모듈네임을 조합하여 패키지명을 제안합니다.
    d. Minimum API를 선택합니다. 베이스 모듈과 일치해야합니다.
  4. Next를 클릭합니다.
  5. Configure On-Demand Option섹션에서 다음을 진행합니다.
    a. 모듈명을 최대 50자 이내로 결정합니다. 플랫폼은 이 제목을 사용하여 사용자가 모듈을 다운로드할지 여부를 확인할 수 있게금 합니다. 이런 이유로 앱의 기본 모듈은 모듈 제목을 번역 할 수 있는 문자열 리소스로 포함해야합니다. 문자열을 베이스 모듈에 추가하고 다이나믹 피처 모듈의 매니페스트에 다음 항목을 삽입합니다.

    Note : 릴리즈 빌드와 같이 리소스 축소를 사용하는 경우 베이스 모듈의 코드가 모듈 참조를 하지 않았으면 shirinker(축소기)가 모듈 제목 문자열 리소스를 제거 할 수 있습니다. 문자열 리소스가 빌드출력에 남아있는지 확인하려면 리소스를 custom resource keep file에 포함시킵니다.
    b. 필요에 따라 모듈을 다운로드 할 수 있게 하려면 Enable on demand 옆에 있는 박스를 체크합니다. 이 옵션을 사용하지 않으면 사용자가 앱을 다운로드하여 설치할 때 다이나믹 피처를 사용할 수 있습니다. Android Studio는 모듈의 매니페스트에 다음을 삽입하여 선택사항을 반영합니다.

    c. Android 4.4 (API 레벨 20) 이하를 실행하는 기기에서 이 모듈을 사용하고 멀티 APK에 포함 되도록하려면 Fusing 옆의 확인란 을 선택합니다. 이 옵션은 이전 단계 Enable on demand 옆의 확인란을 선택한 경우에만 사용할 수 있습니다. 즉, 이 모듈에 대한 주문형 동작을 활성화하고 분할 APK 다운로드 및 설치를 지원하지 않는 장치에서 Fusing을 사용하지 않도록 설정 해제 할 수 있습니다. Android Studio는 모듈의 매니페스트에 다음을 삽입하여 선택 사항을 반영합니다.

     

  6. Finish 버튼을 클릭합니다

Android Studio에서 모듈 생성이 완료되면 Project창에서 직접 내용을 검사합니다. (메뉴 막대에서 View >Tool Windows > Project 선택 ). 기본 코드, 리소스 및 조직은 일반적인 앱 모듈과 유사해야합니다.

instant-enabled 다이나믹 피처 모듈 만들기

Google Play Instant는 기기에 APK를 설치하지 않고도 앱과 상호 작용할 수 있습니다. 대신 Google Play 스토어의 ‘Try Now’ 버튼이나 내가만든 URL을 통해 앱을 경험할 수 있습니다. 콘텐츠를 제공하는 이러한 형식을 통해 앱 체험을 쉽게 할 수 있습니다.

앱의 베이스 모듈에서 해당기능이 활성화 되어있는 경우에만 다이나믹 피처를 사용 할 수 있습니다. 왜냐하면 instant-enable 다이나믹 피처 기능을 경험하기 위해서는 공통 코드 및 리소스를 포함하고 있는  베이스 모듈을 반드시 다운로드 받아야 하기 때문입니다. Google Play Instant를 지원하려면 베이스 모듈 및 다이나믹 피처에 대한 다운로드가 엄격한 크기 제한을 갖습니다. 

instant-enabled 다이나믹 피처 모듈을 만드는 경우 각 모듈의 매니페스트에 다음을 포함시켜 베이스 모듈 및 다이나믹 피처 모듈을 자동으로 활성화 합니다.

dist:instant="true"로 설정할 때 dist:onDemand="true"로는 설정할 수 없습니다. 왜냐하면 앱을 다운로드하고 설치할때 instant-enabled 다이나믹 피처가 자동으로 다운로드되어 앱의 기본 APK와 함께 설치됩니다. 그러나 Play Core Library를 사용할 때는 instant-enabled 모듈을 필요할 때 요청할 수 있습니다 .

Android Studio를 사용하여 instant-enabled 다이나믹 피처 모듈을 앱프로젝트에 추가하려면 다음을 수행하세요

  1. 메뉴에서 File > New > New Module을 선택합니다
  2. Create New Module 다이얼로그에서 Instant Dynamic Feature Module 을 선택하고 Next를 클릭합니다.
  3. Configure your new module 섹션에서 아래 내용을 완료 합니다.
    a. 드롭다운 메뉴에서 앱프로젝트의 Base application module을 선택합니다.
    b. 모듈 이름을 지정합니다. 이 이름을 사용하여 모듈을 Gradle setting 파일의 Gradle 서브 프로젝트로 식별합니다. 앱번들을 만들 때 Gradle은 하위 피처 모듈이름의 마지막 요소를 사용하여 다이나믹 피처 모듈 매니페스트의 <manifest split>속성에 대입하게 됩니다.
    c. 모듈의 패키지명을 결정합니다. 기본적으로 안드로이드 스튜디오는 베이스 모듈의 패키지명과 모듈네임을 조합하여 패키지명을 제안합니다.
    d. 최소 지원 API를 선택합니다. 베이스 모듈과 일치해야합니다.
    e. 최대 50자를 사용하여 모듈 이름을 지정합니다. 플랫폼은 이 이름을 사용하여 사용자에게 모듈을 식별할 수 있도록 합니다. 이런 이유로 앱의 베이스 모듈은 모듈 이름을 번역 할 수 있는 문자열 리소스로 포함해야합니다. Android Studio를 사용하여 모듈을 만들 때 문자열 리소스를 베이스 모듈에 추가하고 다이나믹 피처 모듈의 매니페스트에 다음 항목을 삽입합니다.

    f. 안드로이드 4.4(API 20) 이하를 실행하는 기기에서 이 모듈을 사용하고 멀티 APK에 포함 되도록 하려면 fusing옆의 확인란을 선택합니다. Android Studio는 선택항목을 반영하기 위해 모듈 매니페스트에 다음을 삽입합니다.

     

  4. Finish를 클릭합니다

Android Studio에서 모듈 생성이 완료되면 Project pane 에서 직접 내용을 검사합니다 ( 메뉴 막대에서 View > Tool Windows > Project 선택 ). 기본 코드, 리소스 및 조직은 표준 앱 모듈의 것과 유사해야합니다.

다이나믹 피처 모듈 빌드 구성

Android Studio를 사용하여 새로운 다이나믹 피처 모듈을 만들면 IDE는 다음 Gradle 플러그인을 모듈의 build.gradle파일에 적용 합니다.

표준 애플리케이션 플러그인에서 사용할 수 있는 많은 속성들은 다이나믹 피처 모듈에서도 사용할 수 있습니다. 다음 섹션에서는 다이나믹 피처 모듈의 빌드 구성에 포함시켜야하거나 포함해서는 안되는 속성에 대해서 설명합니다.

다이나믹 피처 모듈 빌드 구성에 포함하지 않을 내용

각 다이나믹 피처 모듈은 베이스 모듈에 의존하기 때문에 특정 구성을 상속받습니다. 따라서 다이나믹 피처 모듈의 build.gradle파일에서 다음을 생략해야 합니다.

  • 서명(signing)구성 : 앱번들은 베이스 모듈에서 지정한 서명 구성을 사용하여 서명됩니다.
  • minifyEnabled속성 : 베이스 모듈의 빌드 구성으로 부터 전체 앱 프로젝트 코드축소를 활성화할 수 있습니다. 따라서 다이나믹 피처 모듈에서 이 속성을 생략해야합니다. 하지만 각 다이나믹 피처 모듈에 대해 추가적인 ProGuard규칙을 지정할 수 있습니다.
  • versionCode와 versionName : 앱번들을 만들 때 Gradle은 기본 모듈이 제공하는 앱 버전 정보를 사용합니다. 다이나믹 피처 모듈의 build.gradle파일에서 이러한 속성을 생략해야 합니다.

기본 모듈과의 관계 설정

Android Studio에서 다이나믹 피처 모듈을 만들면 아래에 표시된 것처럼 android.dynamicFeatures속성을 기본 모듈의 build.gradle파일에 추가할 수 있습니다.

또한 Android Studio에는 기본 모듈이 다이나믹 피처 모듈의 종속성으로 포함되어 있습니다.

추가 ProGuard 규칙 지정

베이스 모듈의 빌드 구성만으로도 앱프로젝트의 코드 축소가 가능하지만 proguardFiles를 사용하여 아래 표시된것처럼 각 다이나믹 피처 모듈의 맞춤형 ProGuard규칙을 제공할 수 있습니다.

이러한 ProGuard 규칙은 빌드시 다른 모듈(베이스 모듈 포함)의 규칙과 병합됩니다. 따라서 각 다이나믹 피처 모듈이 새로운 규칙 세트를 지정할 수 있지만 이러한 규칙은 앱 프로젝트의 모든 모듈에 적용됩니다.

다이나믹 피처 모듈 매니페스트

Android Studio를 사용하여 새로운 다이나믹 피처 모듈을 만들 때 IDE에는 다이나믹 피처처럼 동작하는 데 필요한 대부분의 매니페스트 속성이 포함됩니다. 또한 일부 속성은 컴파일시 빌드 시스템에 의해 주입되므로 사용자가 직접 지정하거나 수정할 필요가 없습니다. 다음 표에서는 다이나믹 피처 모듈에 중요한 매니페스트 특성을 설명합니다.

속성

기술

<manifest

이것이 전형적인 블록입니다. <manifest>

xmlns:dist=”http://schemas.android.com/apk/distribution”

distribution 네임 스페이스를 지정 합니다.

split=”split_name

Android Studio에서 번들을 만들면이 속성이 포함됩니다따라서 이 속성을 직접 포함하거나 수정해서는 안됩니다 .

Play Core 라이브러리를 사용하여 필요에 따른 모듈을 요청할 앱이 지정하는 모듈의 이름을 정의합니다.

android:isFeatureSplit=”true | false”>

Android Studio에서 번들을 만들면이 속성이 포함됩니다따라서 이 속성을 수동으로 포함하거나 수정해서는 안됩니다 .

모듈이 다이나믹 피처 모듈임을 지정합니다. 베이스 모듈 및 configuration APK 매니페스트는이 속성을 생략하거나 false 로 설정합니다.

<dist:module

XML 요소는 모듈이 APK 패키지되고 배포되는 방식을 결정하는 속성을 정의합니다.

dist:instant=”true | false”

모듈을 Google Play Instant  통해 즉시 사용할 있어야하는지 여부를 지정합니다 .

앱에 하나 이상의 인스턴트 가능 다이나믹 피처 모듈이 포함되어있는 경우 베이스 모듈을 즉시 활성화해야합니다.

dist:onDemand=”true”로 설정했다면  XML 요소 true로 설정할 없습니다. 

dist:onDemand=”true | false”

모듈을 필요에 따라  다운로드로 사용할 있는지 여부를 지정합니다, 속성을으로 true로 설정하면 설치시 모듈을 사용할 없지만 나중에 앱을 다운로드하도록 요청할 있습니다.

속성을로 설정 false하면 사용자가 앱을 다운로드하여 설치할 모듈이 포함됩니다.

dist:title=”@string/feature_name”

모듈에 대한 사용자에게 노출되는 이름을 지정합니다.

<dist:fusing dist:include=”true | false” /> 

</dist:module>

Android 4.4 (API 레벨 20) 이하를 실행하는 기기를 대상으로하는 멀티 APK 모듈을 포함할지 여부를 지정합니다.

<application 

android:hasCode=”true | false”> 

… 

</application>

다이나믹 피처 모듈에서 DEX 파일을 생성하지 않으면 (나중에 DEX 파일 형식으로 컴파일 코드가 포함되어 있지 않은 경우) 다음을 수행해야합니다 (그렇지 않으면 런타임 오류가 발생할 있습니다).

1. 다이나믹 피쳐 모듈의 매니페스트에서 android:hasCode를 false 로 설정합니다.

2. 기본 모듈의 매니페스트에 다음을 추가합니다 .<application android : hasCode = “true” tools : replace = “android : hasCode” >   … </ application>

참고 : Dynamic Feature모듈은 매니페스트에서 액티비티를 android:exported를 true로 지정하면 안됩니다. 다른앱이 액티비티를 시작하려고 할 때 기기가 다이나믹 피처 모듈을 다운로드 했다는 보장이 없기 때문입니다. 또한 앱은 코드와 리소스에 액세스하기 전에 다이나믹 피처 모듈이 다운로드 되었는지 확인해야합니다. 자세한 내용은 설치된 모듈 관리를 읽어보세요

Buy me a coffeeBuy me a coffee
카테고리: Android

0개의 댓글

답글 남기기

이메일은 공개되지 않습니다.