본문 바로가기
■Development■/《Android》

[Android] Play Asset Delivery / Play Feature Delivery 완벽 가이드

by 은스타 2022. 9. 29.
반응형

Play Asset Delivery와 Play Feature Delivery 완벽 가이드: 대용량 안드로이드 앱 최적화하기

안녕하세요.

이번 포스팅은 구글에서 새롭게 기능을 소개한 Play Asset Delivery와 Play Feature DelivDel에 대하여 자세히 알아보도록 하겠습니다.


목차

  1. Play Asset Delivery와 Play Feature Delivery란?
  2. Play Asset Delivery(PAD) 심층 이해하기
  3. Play Feature Delivery(PFD) 심층 이해하기
  4. 두 기술의 주요 차이점
  5. 구현 방법: Play Asset Delivery
  6. 구현 방법: Play Feature Delivery
  7. 사용 사례 및 적용 예시
  8. 성능 최적화 팁
  9. 일반적인 문제 해결
  10. 자주 묻는 질문 (FAQ)
  11. 마무리: 어떤 기술을 선택해야 할까?

 

#1. Play Asset Delivery와 Play Feature Delivery란?

안드로이드 앱이 점점 더 복잡해지고 기능이 풍부해짐에 따라, 앱 크기는 지속적으로 증가하고 있습니다. 대형 게임이나 그래픽이 풍부한 앱의 경우 수 GB에 달하는 크기가 될 수 있죠. 이러한 대용량 앱은 다운로드 시간이 길어지고, 사용자의 저장 공간을 많이 차지하며, 업데이트 과정이 느려져 사용자 경험에 부정적인 영향을 미칩니다.

구글은 이러한 문제를 해결하기 위해 Play Asset Delivery(PAD)Play Feature Delivery(PFD) 라는 두 가지 강력한 기술을 제공합니다. 이 기술들은 안드로이드 앱 번들(Android App Bundle, AAB) 형식과 함께 작동하여 앱 배포를 최적화합니다.

간단한 정의

  • Play Asset Delivery(PAD): 게임이나 대용량 앱의 에셋(이미지, 사운드, 비디오, 텍스처 등)을 효율적으로 전달하기 위한 시스템입니다. 사용자가 전체 앱을 다운로드하지 않고도 필요한 에셋만 다운로드할 수 있도록 합니다.
  • Play Feature Delivery(PFD): 앱의 특정 기능 모듈을 필요할 때만 다운로드하여 설치할 수 있게 해주는 시스템입니다. 앱의 기본 모듈만 먼저 설치하고, 추가 기능은 사용자가 필요로 할 때 다운로드합니다.

두 기술 모두 구글 플레이 스토어를 통해 앱 사용자에게 콘텐츠를 지능적으로 전달함으로써, 초기 다운로드 크기를 줄이고 설치 속도를 높이며 앱 사용 경험을 개선합니다.

 

#2. Play Asset Delivery(PAD) 심층 이해하기

Play Asset Delivery는 특히 게임 개발자를 위해 설계되었지만, 대용량 에셋을 포함하는 모든 앱에 유용합니다. PAD는 구글 플레이의 강력한 서버 인프라와 효율적인 압축 기술을 활용하여 앱 에셋을 전달합니다.

PAD의 주요 특징

1. 에셋 팩 유형

PAD는 세 가지 유형의 에셋 팩을 제공합니다:

  • 설치 시간(Install-time) 에셋 팩: 앱 설치 과정에서 함께 다운로드되는 에셋입니다. 앱 실행 시 즉시 필요한 필수 에셋에 적합합니다.
  • 빠른 팔로우(Fast-follow) 에셋 팩: 앱 설치 직후에 자동으로 다운로드되는 에셋입니다. 앱의 초기 실행에는 필요하지 않지만 곧 필요하게 될 에셋에 적합합니다.
  • 주문형(On-demand) 에셋 팩: 앱 내에서 특정 기능이나 레벨에 접근할 때만 다운로드되는 에셋입니다. 게임의 후반 레벨이나 특정 상황에서만 필요한 에셋에 적합합니다.

2. 텍스처 압축 형식 지원

PAD는 다양한 기기에 최적화된 텍스처 압축 형식을 자동으로 제공합니다. 개발자는 여러 텍스처 형식(ASTC, ETC, S3TC 등)을 포함할 수 있으며, 구글 플레이는 기기에 가장 적합한 형식만 전달합니다.

3. 에셋 전송 크기 절감

구글 플레이는 Play Asset Delivery를 통해 에셋을 제공할 때 Brotli 압축 알고리즘을 사용하여 전송 크기를 최대 15% 절감합니다. 이는 기존 ZIP 압축보다 효율적이며, 사용자의 데이터 사용량과 다운로드 시간을 줄입니다.

4. 다운로드 진행 상황 모니터링

개발자는 PAD API를 통해 에셋 다운로드 진행 상황을 모니터링하고 사용자에게 표시할 수 있습니다. 이를 통해 사용자에게 더 나은 피드백을 제공하고 앱 사용 경험을 개선할 수 있습니다.

 

#3. Play Feature Delivery(PFD) 심층 이해하기

Play Feature Delivery는 앱을 여러 기능 모듈로 분할하여 필요에 따라 다운로드할 수 있게 해주는 기술입니다. 이 기술은 안드로이드의 동적 기능 모듈(Dynamic Feature Modules)을 기반으로 합니다.

PFD의 주요 특징

1. 동적 기능 모듈 유형

PFD는 세 가지 유형의 동적 기능 모듈을 지원합니다:

  • 설치 시간(Install-time) 기능: 앱 설치 시 기본 모듈과 함께 다운로드되는 기능입니다. 앱의 핵심 기능이지만 기본 모듈과 분리하고 싶을 때 사용합니다.
  • 주문형(On-demand) 기능: 사용자가 특정 기능을 요청할 때만 다운로드되는 모듈입니다. 자주 사용되지 않는 기능(예: AR 기능, 특수 편집 도구)에 적합합니다.
  • 조건부(Conditional) 기능: 특정 조건(국가, 기기 기능 등)에 따라 다운로드되는 모듈입니다. 특정 국가에서만 제공되는 기능이나 특정 하드웨어가 필요한 기능에 적합합니다.

2. 동적 설치 관리

PFD는 개발자가 동적 기능의 설치와 제거를 프로그래밍 방식으로 관리할 수 있게 해줍니다. SplitInstallManager API를 통해 기능 모듈을 요청하고, 다운로드 상태를 모니터링하며, 필요 없는 모듈을 제거할 수 있습니다.

3. 코드 및 리소스 분리

PFD를 사용하면 앱 코드와 리소스를 논리적인 기능 단위로 구성할 수 있습니다. 이는 대규모 앱의 구조를 개선하고 팀 간 협업을 촉진합니다.

4. 인스턴트 앱 지원

PFD는 Android 인스턴트 앱(설치 없이 바로 실행 가능한 앱)과 함께 작동하여, 사용자가 전체 앱을 설치하지 않고도 특정 기능을 사용할 수 있게 합니다.

 

#4. 두 기술의 주요 차이점

Play Asset Delivery와 Play Feature Delivery는 서로 다른 목적과 구현 방식을 가지고 있습니다. 각 기술의 핵심 차이점을 이해하면 앱에 맞는 최적의 솔루션을 선택할 수 있습니다.

특성 Play Asset Delivery (PAD) Play Feature Delivery (PFD)
주요 목적 게임 에셋, 미디어 파일 등 리소스 전달 최적화 앱의 기능 모듈화 및 필요시 다운로드
대상 주로 게임 및 대용량 미디어 앱 모든 유형의 안드로이드 앱
다루는 내용 에셋(이미지, 사운드, 동영상, 3D 모델 등) 코드, 리소스, 에셋을 포함한 완전한 기능 모듈
구현 방식 AssetPackManager API Play Core 라이브러리의 SplitInstallManager API
코드 실행 에셋에는 실행 가능한 코드가 포함되지 않음 동적 기능 모듈에 실행 가능한 코드 포함 가능
크기 제한 단일 에셋 팩 최대 2GB 단일 기능 모듈 최대 64MB(인스턴트 앱 모드)
업데이트 앱 업데이트와 독립적으로 에셋 업데이트 가능 앱 업데이트를 통해 기능 모듈 업데이트

 

#5. 구현 방법: Play Asset Delivery

Play Asset Delivery를 앱에 통합하는 단계별 가이드입니다.

1. 프로젝트 설정

먼저 app/build.gradle 파일에 Play Core 라이브러리 종속성을 추가합니다:

dependencies {
    implementation 'com.google.android.play:core:1.10.3'
    implementation 'com.google.android.play:asset-delivery:2.0.0'
}

2. 에셋 팩 생성

Android Studio에서 에셋 팩을 생성하려면:

  1. File > New > Android Resource Directory 선택
  2. Resource typeassets로 설정
  3. Directory name을 원하는 이름으로 설정 (예: "game_level_1")

3. 에셋 팩 구성

에셋 팩을 구성하려면 app/build.gradle 파일에 다음과 같이 추가합니다:

android {
    // 다른 설정들...

    assetPacks = [":game_level_1", ":game_level_2"]

    // 또는 더 상세한 구성을 위해:
    bundle {
        assetPacks {
            assets {
                packName = "game_level_1"
                deliveryType = "on-demand"
            }
            // 추가 에셋 팩 구성...
        }
    }
}

4. 에셋 팩 요청 및 로드

앱 코드에서 에셋 팩을 요청하고 로드하는 방법:

private AssetPackManager assetPackManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // AssetPackManager 초기화
    assetPackManager = AssetPackManagerFactory.getInstance(this);

    // 에셋 팩 요청
    List<String> packNames = Arrays.asList("game_level_1");
    assetPackManager.fetch(packNames)
            .addOnSuccessListener(result -> {
                Log.d("PAD", "Asset pack download success");
                // 에셋에 접근
                loadAssets(packNames.get(0));
            })
            .addOnFailureListener(exception -> {
                Log.e("PAD", "Asset pack download failed: " + exception.getMessage());
            });
}

private void loadAssets(String packName) {
    try {
        // 에셋 팩 경로 가져오기
        AssetPackLocation packLocation = assetPackManager.getPackLocation(packName);
        if (packLocation != null) {
            String assetPath = packLocation.assetsPath();
            // 에셋 사용...
        }
    } catch (IOException e) {
        Log.e("PAD", "Error loading assets: " + e.getMessage());
    }
}

5. 다운로드 진행 상황 모니터링

사용자에게 다운로드 진행 상황을 표시하려면:

private void registerPackStateListener() {
    AssetPackStateUpdateListener listener = state -> {
        switch (state.status()) {
            case AssetPackStatus.PENDING:
                // 다운로드 대기 중
                break;
            case AssetPackStatus.DOWNLOADING:
                // 다운로드 중
                long downloaded = state.bytesDownloaded();
                long total = state.totalBytesToDownload();
                int progress = (int) (100 * downloaded / total);
                updateProgressUI(progress);
                break;
            case AssetPackStatus.COMPLETED:
                // 다운로드 완료
                hideProgressUI();
                break;
            // 다른 상태 처리...
        }
    };

    assetPackManager.registerListener(listener);
}

 

#6. 구현 방법: Play Feature Delivery

Play Feature Delivery를 앱에 통합하는 단계별 가이드입니다.

1. 프로젝트 설정

먼저 app/build.gradle 파일에 Play Core 라이브러리 종속성을 추가합니다:

dependencies {
    implementation 'com.google.android.play:core:1.10.3'
}

2. 동적 기능 모듈 생성

Android Studio에서 동적 기능 모듈을 생성하려면:

  1. File > New > New Module 선택
  2. Dynamic Feature Module 선택 후 Next 클릭
  3. 모듈 이름, 패키지 이름 입력 및 모듈 옵션 선택 (설치 시간, 주문형 또는 조건부)
  4. Finish 클릭

3. 모듈 구성

새로 생성된 동적 기능 모듈의 build.gradle 파일은 다음과 유사합니다:

plugins {
    id 'com.android.dynamic-feature'
}

android {
    compileSdkVersion rootProject.compileSdkVersion

    defaultConfig {
        minSdkVersion rootProject.minSdkVersion
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    // 조건부 전달을 위한 선택적 구성
    androidResources {
        noCompress 'txt', 'json'
    }
}

dependencies {
    implementation project(":app")
}

4. 동적 기능 요청 및 설치

앱 코드에서 동적 기능 모듈을 요청하고 설치하는 방법:

private SplitInstallManager splitInstallManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // SplitInstallManager 초기화
    splitInstallManager = SplitInstallManagerFactory.create(this);

    // 기능 모듈 요청 생성
    SplitInstallRequest request = SplitInstallRequest.newBuilder()
            .addModule("dynamic_feature_module_name")
            .build();

    // 기능 모듈 설치 요청
    splitInstallManager.startInstall(request)
            .addOnSuccessListener(sessionId -> {
                Log.d("PFD", "Module installation success");
                // 기능 모듈 액세스
                loadFeatureModule();
            })
            .addOnFailureListener(exception -> {
                Log.e("PFD", "Module installation failure: " + exception.getMessage());
            });
}

5. 설치 상태 모니터링

사용자에게 설치 진행 상황을 표시하려면:

private void registerInstallListener() {
    SplitInstallStateUpdatedListener listener = state -> {
        switch (state.status()) {
            case SplitInstallSessionStatus.DOWNLOADING:
                // 다운로드 중
                long downloaded = state.bytesDownloaded();
                long total = state.totalBytesToDownload();
                int progress = (int) (100 * downloaded / total);
                updateProgressUI(progress);
                break;
            case SplitInstallSessionStatus.INSTALLED:
                // 설치 완료
                hideProgressUI();
                loadFeatureModule();
                break;
            case SplitInstallSessionStatus.REQUIRES_USER_CONFIRMATION:
                // 큰 모듈(10MB 이상)은 사용자 확인 필요
                try {
                    splitInstallManager.startConfirmationDialogForResult(
                            state, 
                            activity, 
                            CONFIRMATION_REQUEST_CODE);
                } catch (IntentSender.SendIntentException e) {
                    Log.e("PFD", "Error launching confirmation dialog", e);
                }
                break;
            // 다른 상태 처리...
        }
    };

    splitInstallManager.registerListener(listener);
}

6. 동적 기능 접근

설치된 동적 기능 모듈에 접근하는 방법:

private void loadFeatureModule() {
    // 기능 모듈 내 Activity 시작
    Intent intent = new Intent();
    intent.setClassName(
            BuildConfig.APPLICATION_ID,
            "com.example.myapp.dynamicfeature.FeatureActivity");
    startActivity(intent);

    // 또는 기능 모듈의 리소스 접근
    Resources resources = getResources();
    int resourceId = resources.getIdentifier(
            "feature_string", 
            "string", 
            "com.example.myapp.dynamicfeature");
    String featureString = resources.getString(resourceId);
}

 

#7. 사용 사례 및 적용 예시

Play Asset Delivery와 Play Feature Delivery가 실제로 어떻게 활용되는지 몇 가지 예시를 살펴보겠습니다.

Play Asset Delivery 사용 사례

1. 3D 게임의 레벨별 에셋 관리

상황: 대용량 3D 게임에서 각 레벨마다 다른 텍스처, 모델, 사운드 파일이 필요함

적용 방법:

  • 각 게임 레벨을 별도의 주문형 에셋 팩으로 구성
  • 사용자가 레벨에 진입할 때만 해당 에셋 팩 다운로드
  • 저장 공간이 부족할 경우 완료한 레벨의 에셋 팩 삭제 기능 제공

결과: 초기 다운로드 크기 70% 감소, 설치 시간 60% 단축

2. 언어별 오디오 파일 최적화

상황: 여러 언어의 음성 더빙을 제공하는 게임/앱

적용 방법:

  • 각 언어의 오디오 파일을 별도의 에셋 팩으로 구성
  • 사용자 기기 언어에 맞는 에셋 팩만 설치 시간에 다운로드
  • 사용자가 언어를 변경하면 해당 언어의 에셋 팩 다운로드

결과: 다국어 지원 앱의 크기를 50% 이상 축소

Play Feature Delivery 사용 사례

1. 온보딩 및 튜토리얼 최적화

상황: 복잡한 앱에서 처음 사용자를 위한 상세한 튜토리얼 제공

적용 방법:

  • 튜토리얼 기능을 별도의 주문형 모듈로 분리
  • 첫 실행 시에만 다운로드하고 이후 필요 없으면 제거 가능
  • 튜토리얼 내용 업데이트 시 전체 앱 업데이트 없이 모듈만 갱신

결과: 앱 크기 축소 및 튜토리얼 관리 용이성 증가

2. 지역별 특화 기능 제공

상황: 특정 국가나 지역에서만 제공되는 기능이 있는 앱

적용 방법:

  • 지역 특화 기능을 조건부 모듈로 분리
  • 해당 지역의 사용자에게만 자동으로 모듈 제공
  • 다른 지역 사용자의 앱 크기는 그만큼 축소

결과: 불필요한 기능으로 인한 앱 크기 증가 방지 및 지역별 맞춤 경험 제공

3. 고급 기능의 주문형 제공

상황: 일부 사용자만 사용하는 고급 편집 도구나 분석 기능이 있는 앱

적용 방법:

  • 고급 기능을 주문형 모듈로 분리
  • 사용자가 해당 기능을 요청할 때만 다운로드
  • 저장 공간 확보가 필요할 때 제거 가능

결과: 기본 앱 크기 축소 및 사용자별 최적화된 경험 제공

 

#8. 성능 최적화 팁

Play Asset Delivery와 Play Feature Delivery를 더욱 효과적으로 활용하기 위한 성능 최적화 팁입니다.

Play Asset Delivery 최적화

  1. 에셋 팩 구조화
    • 관련 에셋을 함께 그룹화하여 불필요한 다운로드 최소화
    • 사용 패턴에 따라 에셋 팩 분할 (예: 필수 에셋, 고품질 텍스처, 추가 사운드 등)
  2. 에셋 팩 크기 최적화
    • 에셋 압축 및 최적화 도구 활용 (텍스처 압축, 오디오 압축 등)
    • 각 에셋 팩의 크기를 적절하게 유지 (너무 크면 다운로드 시간 증가, 너무 작으면 관리 복잡)
  3. 텍스처 압축 형식 다양화
    • 다양한 텍스처 압축 형식(ASTC, ETC2, ETC1, S3TC 등) 제공
    • 구글 플레이가 기기에 맞는 최적의 형식을 선택하도록 함
  4. 사전 다운로드 전략 수립
    • 사용자 행동 예측에 기반한 사전 다운로드 구현
    • 게임의 다음 레벨이나 곧 필요할 에셋을 미리 다운로드하여 대기 시간 최소화

Play Feature Delivery 최적화

  1. 모듈 의존성 관리
    • 모듈 간 의존성을 최소화하여 불필요한 다운로드 방지
    • 공통 코드와 리소스는 기본 모듈에 배치
  2. 모듈 크기 최적화
    • 각 모듈의 크기를 용도에 맞게 최적화
    • 인스턴트 앱으로 제공할 모듈은 10MB 이하로 유지
  3. 설치 UX 개선
    • 모듈 다운로드 중 사용자에게 유용한 피드백 제공
    • 대화형 로딩 화면이나 미니게임 등으로 대기 시간 활용
  4. 모듈 재사용 전략
    • 필요 없는 모듈의 제거 및 재설치 관리
    • 저장 공간 최적화를 위한 자동 제거 정책 구현

 

#9. 일반적인 문제 해결

Play Asset Delivery와 Play Feature Delivery를 구현할 때 발생할 수 있는 일반적인 문제와 해결 방법입니다.

Play Asset Delivery 문제 해결

  1. 에셋 팩 다운로드 실패
    • 문제: 네트워크 문제나 저장 공간 부족으로 다운로드 실패
    • 해결: 에러 코드를 확인하고 적절한 재시도 메커니즘 구현, 저장 공간 확인 로직 추가
  2. 에셋 경로 접근 오류
    • 문제: 에셋 팩 경로를 잘못된 방식으로 접근
    • 해결: AssetPackManager.getPackLocation()을 사용하여 올바른 경로 획득
  3. 큰 에셋 팩 다운로드 시간
    • 문제: 대용량 에셋 팩의 다운로드 시간이 길어짐
    • 해결: 진행 상황 표시, 백그라운드 다운로드 구현, 필요 시 에셋 팩 분할
  4. 에셋 팩 이름 충돌
    • 문제: 서로 다른 모듈에서 동일한 에셋 팩 이름 사용
    • 해결: 프로젝트 전체에서 일관된 명명 규칙 사용 및 에셋 팩 이름 중복 방지
  5. 테스트 환경 설정
    • 문제: 개발 중 에셋 팩 테스트의 어려움
    • 해결: 내부 테스트 트랙 활용 및 Play Asset Delivery 테스트 API 사용

Play Feature Delivery 문제 해결

  1. 모듈 로딩 실패
    • 문제: 동적 모듈 로딩 중 ClassNotFoundException 발생
    • 해결: 올바른 클래스 경로 확인, 모듈 설치 상태 확인 후 접근
  2. 설치 취소 처리
    • 문제: 사용자가 모듈 설치를 취소한 경우 적절한 처리가 필요
    • 해결: SplitInstallSessionStatus.CANCELED 상태를 감지하여 사용자에게 알리고 대안 제공
  3. 버전 호환성 문제
    • 문제: 모듈과 기본 앱 간의 버전 불일치로 인한 오류
    • 해결: 모듈에 버전 확인 로직 추가, 필요시 업데이트 안내 메시지 표시
  4. 대용량 모듈 다운로드
    • 문제: 10MB 이상 모듈 다운로드 시 사용자 확인 필요
    • 해결: SplitInstallSessionStatus.REQUIRES_USER_CONFIRMATION 상태 처리 로직 구현
  5. 리소스 및 ID 충돌
    • 문제: 기본 모듈과 동적 모듈 간의 리소스 ID 충돌
    • 해결: 모듈별 리소스 네이밍 규칙 수립 및 중복 방지
  6. 오프라인 상태 처리
    • 문제: 오프라인 상태에서 동적 기능 접근 시도
    • 해결: 네트워크 상태 확인 및 오프라인 모드 대안 제공

 

#10. 자주 묻는 질문 (FAQ)

Q: Play Asset Delivery와 Play Feature Delivery 중 어떤 것을 선택해야 하나요?

A: 앱의 성격과 요구사항에 따라 다릅니다. 게임이나 대용량 미디어를 다루는 앱이라면 Play Asset Delivery가 적합하고, 기능별로 모듈화가 필요한 일반 앱이라면 Play Feature Delivery가 더 적합합니다. 두 기술을 함께 사용할 수도 있습니다.

Q: 이 기술들은 모든 안드로이드 기기에서 지원되나요?

A: Play Asset Delivery와 Play Feature Delivery는 Android 5.0(API 레벨 21) 이상을 지원합니다. 단, 일부 기능은 더 높은 API 레벨이 필요할 수 있으며, 구글 플레이 스토어가 설치된 기기에서만 작동합니다.

Q: 앱 번들(App Bundle)과 어떤 관계가 있나요?

A: 두 기술 모두 Android App Bundle(AAB) 포맷을 기반으로 합니다. AAB는 구글 플레이 스토어가 각 기기에 최적화된 APK를 전달하는 데 사용되는 새로운 앱 배포 형식입니다. Play Asset Delivery와 Play Feature Delivery는 이 AAB 형식을 확장하여 더 세분화된 콘텐츠 전달을 가능하게 합니다.

Q: 에셋 팩과 동적 기능 모듈의 크기 제한은 어떻게 되나요?

A:

  • 에셋 팩: 개별 에셋 팩은 최대 2GB까지 가능합니다.
  • 동적 기능 모듈: 일반적으로 크기 제한이 없지만, 인스턴트 앱(설치 없이 실행)으로 제공하려면 10MB 이하로 유지해야 합니다. 10MB 이상인 모듈은 다운로드 시 사용자 확인이 필요합니다.

Q: 앱 업데이트 시 이러한 모듈과 에셋도 업데이트해야 하나요?

A:

  • Play Asset Delivery: 에셋 팩은 앱 업데이트와 별개로 업데이트할 수 있으며, 구글 플레이는 변경된 에셋만 전송합니다.
  • Play Feature Delivery: 동적 기능 모듈은 앱 업데이트의 일부로 업데이트됩니다. 앱 버전이 변경되면 모듈도 함께 업데이트될 수 있습니다.

Q: 오프라인 상태에서 이러한 기능들이 작동하나요?

A: 이미 다운로드된 에셋 팩과 기능 모듈은 오프라인 상태에서도 사용 가능합니다. 그러나 아직 다운로드되지 않은 콘텐츠에 접근하려면 인터넷 연결이 필요합니다. 중요한 기능의 경우 오프라인 대체 경험을 제공하는 것이 좋습니다.

Q: 테스트 환경에서 이러한 기능을 어떻게 테스트할 수 있나요?

A:

  • 개발 중 테스트: 개발 모드에서는 로컬 테스트가 가능합니다.
  • 배포 전 테스트: 구글 플레이 콘솔의 내부 테스트 트랙이나 테스트 기기를 사용하여 테스트할 수 있습니다.
  • 테스트 API: Play Core 라이브러리는 에셋 팩과 기능 모듈을 테스트하기 위한 특별한 API를 제공합니다.

Q: 이러한 기술을 사용할 때 앱의 보안은 어떻게 유지되나요?

A: 구글 플레이 스토어는 모든 에셋 팩과 기능 모듈이 원본 앱과 동일한 서명으로 서명되었는지 확인합니다. 또한 전송 중인 데이터는 암호화되어 안전하게 보호됩니다. 민감한 데이터가 포함된 모듈의 경우 추가 암호화 계층을 구현하는 것이 좋습니다.


#11. 마무리: 어떤 기술을 선택해야 할까?

앱의 특성과 요구사항에 따라 Play Asset Delivery와 Play Feature Delivery 중 적합한 기술을 선택하거나 두 기술을 함께 사용할 수 있습니다. 다음은 선택에 도움이 될 수 있는 지침입니다:

Play Asset Delivery가 적합한 경우

  • 게임 개발자: 대용량 텍스처, 모델, 사운드 파일을 포함하는 게임 개발
  • 멀티미디어 앱: 비디오, 오디오 등 대용량 미디어 파일을 포함하는 앱
  • 에셋 중심 앱: 앱의 주요 내용이 에셋(이미지, 데이터 파일 등)으로 구성된 경우
  • 실행 코드 없이 리소스만 필요한 경우: 추가 Java/Kotlin 코드 없이 리소스만 필요한 경우

Play Feature Delivery가 적합한 경우

  • 모듈화된 앱: 독립적인 기능 단위로 구성된 앱
  • 선택적 기능이 많은 앱: 사용자가 필요에 따라 선택할 수 있는 다양한 기능을 제공하는 앱
  • 지역별 기능 제공: 특정 국가나 지역에 따라 다른 기능을 제공해야 하는 앱
  • 코드와 리소스 함께 필요: 실행 코드와 리소스가 함께 필요한 기능 모듈

두 기술을 함께 사용하는 경우

복잡한 앱에서는 두 기술을 함께 사용하여 최상의 결과를 얻을 수 있습니다:

  1. 기본 구조는 Play Feature Delivery로: 앱의 핵심 구조와 기능 모듈화를 Play Feature Delivery로 구현
  2. 대용량 에셋은 Play Asset Delivery로: 각 기능 모듈 내에서 필요한 대용량 에셋은 Play Asset Delivery로 관리

이러한 방식으로 앱을 구성하면 모듈화된 구조의 유연성과 효율적인 에셋 관리의 장점을 모두 활용할 수 있습니다.

Play Asset Delivery와 Play Feature Delivery는 안드로이드 앱 개발의 미래를 대표하는 기술로, 앱 크기 최적화, 사용자 경험 개선, 그리고 더 효율적인 앱 배포를 가능하게 합니다. 이러한 기술을 적극적으로 활용하여 더 나은 안드로이드 앱을 개발하시기 바랍니다.

긴 글 읽어주셔서 감사합니다.

끝.

반응형