APK 크기를 최소화하는 것은 우수한 Android 앱을 개발하는 데 중요한 측면입니다. 이는 특히 개발 도상국 시장을 타겟팅할 때나 Android 인스턴트 앱을 개발할 때 중요합니다. 이러한 경우 APK에 포함된 ExoPlayer 라이브러리의 크기를 최소화하는 것이 좋습니다. 이 페이지에서는 이를 달성하는 데 도움이 되는 몇 가지 간단한 단계를 설명합니다.
필수 종속 항목만 사용
실제로 필요한 라이브러리 모듈에만 종속합니다. 예를 들어 다음은 DASH 콘텐츠만 재생하는 앱에 필요할 수 있는 ExoPlayer, DASH, UI 라이브러리 모듈에 종속 항목을 추가합니다.
Kotlin
implementation("androidx.media3:media3-exoplayer:1.4.1") implementation("androidx.media3:media3-exoplayer-dash:1.4.1") implementation("androidx.media3:media3-ui:1.4.1")
Groovy
implementation "androidx.media3:media3-exoplayer:1.4.1" implementation "androidx.media3:media3-exoplayer-dash:1.4.1" implementation "androidx.media3:media3-ui:1.4.1"
코드 및 리소스 축소 사용 설정
앱의 출시 빌드에 코드 및 리소스 축소를 사용 설정해야 합니다. ExoPlayer는 코드 축소를 통해 사용되지 않는 기능을 효과적으로 삭제할 수 있도록 구성되어 있습니다. 예를 들어 DASH 콘텐츠를 재생하는 앱의 경우 코드 축소를 사용 설정하면 APK 크기에 대한 ExoPlayer의 기여도가 약 40% 줄어들 수 있습니다.
코드 및 리소스 축소를 사용 설정하는 방법을 알아보려면 앱 축소, 난독화, 최적화를 참고하세요.
앱에 필요한 렌더러 지정
기본적으로 플레이어의 렌더러는 DefaultRenderersFactory
를 사용하여 생성됩니다. DefaultRenderersFactory
는 ExoPlayer 라이브러리에 제공된 모든 Renderer
구현에 종속되므로 코드 축소로 인해 이러한 구현 중 하나도 삭제되지 않습니다. 앱에 렌더러의 하위 집합만 필요하다면 대신 자체 RenderersFactory
를 지정할 수 있습니다. 예를 들어 오디오만 재생하는 앱은 ExoPlayer
인스턴스를 인스턴스화할 때 다음과 같은 팩토리를 정의할 수 있습니다.
Kotlin
val audioOnlyRenderersFactory = RenderersFactory { handler: Handler, videoListener: VideoRendererEventListener, audioListener: AudioRendererEventListener, textOutput: TextOutput, metadataOutput: MetadataOutput, -> arrayOf<Renderer>( MediaCodecAudioRenderer(context, MediaCodecSelector.DEFAULT, handler, audioListener) ) } val player = ExoPlayer.Builder(context, audioOnlyRenderersFactory).build()
자바
RenderersFactory audioOnlyRenderersFactory = (handler, videoListener, audioListener, textOutput, metadataOutput) -> new Renderer[] { new MediaCodecAudioRenderer( context, MediaCodecSelector.DEFAULT, handler, audioListener) }; ExoPlayer player = new ExoPlayer.Builder(context, audioOnlyRenderersFactory).build();
이렇게 하면 코드 축소를 통해 다른 Renderer
구현을 삭제할 수 있습니다. 이 특정 동영상 예시에서는 텍스트 및 메타데이터 렌더러가 삭제됩니다. 즉, 자막이나 인스트림 메타데이터(예: ICY)가 플레이어에서 처리되거나 내보내지 않습니다.
앱에 필요한 추출 도구 지정
기본적으로 플레이어는 DefaultExtractorsFactory
를 사용하여 프로그레시브 미디어를 재생하기 위해 Extractor
인스턴스를 만듭니다. DefaultExtractorsFactory
는 ExoPlayer 라이브러리에 제공된 모든 Extractor
구현에 종속되므로 코드 축소로 인해 이러한 구현 중 하나도 삭제되지 않습니다. 앱에서 소수의 컨테이너 형식만 재생해야 하거나 프로그레시브 미디어를 전혀 재생하지 않는다는 것을 알고 있다면 자체 ExtractorsFactory
를 지정할 수 있습니다. 예를 들어 mp4 파일만 재생해야 하는 앱은 다음과 같은 팩토리를 제공할 수 있습니다.
Kotlin
val mp4ExtractorFactory = ExtractorsFactory { arrayOf<Extractor>(Mp4Extractor(DefaultSubtitleParserFactory())) } val player = ExoPlayer.Builder(context, DefaultMediaSourceFactory(context, mp4ExtractorFactory)).build()
자바
ExtractorsFactory mp4ExtractorFactory = () -> new Extractor[] {new Mp4Extractor(new DefaultSubtitleParserFactory())}; ExoPlayer player = new ExoPlayer.Builder(context, new DefaultMediaSourceFactory(context, mp4ExtractorFactory)) .build();
이렇게 하면 코드 축소를 통해 다른 Extractor
구현을 삭제할 수 있으므로 크기가 크게 줄어들 수 있습니다.
앱에서 프로그레시브 콘텐츠를 전혀 재생하지 않는 경우 ExtractorsFactory.EMPTY
를 DefaultMediaSourceFactory
생성자에 전달한 다음 이 mediaSourceFactory
를 ExoPlayer.Builder
생성자에 전달해야 합니다.
Kotlin
val player = ExoPlayer.Builder(context, DefaultMediaSourceFactory(context, ExtractorsFactory.EMPTY)).build()
자바
ExoPlayer player = new ExoPlayer.Builder( context, new DefaultMediaSourceFactory(context, ExtractorsFactory.EMPTY)) .build();
맞춤 MediaSource 인스턴스화
앱에서 맞춤 MediaSource.Factory
를 사용하고 코드 제거를 통해 DefaultMediaSourceFactory
를 삭제하려면 MediaSource.Factory
를 ExoPlayer.Builder
생성자에 직접 전달해야 합니다.
Kotlin
val player = ExoPlayer.Builder(context, customMediaSourceFactory).build()
자바
ExoPlayer player = new ExoPlayer.Builder(context, mediaSourceFactory).build();
앱에서 MediaItem
대신 MediaSource
를 직접 사용하는 경우 코드 축소로 DefaultMediaSourceFactory
및 DefaultExtractorsFactory
를 제거할 수 있도록 MediaSource.Factory.UNSUPPORTED
를 ExoPlayer.Builder
생성자에 전달해야 합니다.
Kotlin
val player = ExoPlayer.Builder(context, MediaSource.Factory.UNSUPPORTED).build() val mediaSource = ProgressiveMediaSource.Factory(dataSourceFactory, customExtractorsFactory) .createMediaSource(MediaItem.fromUri(uri))
Java
ExoPlayer player = new ExoPlayer.Builder(context, MediaSource.Factory.UNSUPPORTED).build(); ProgressiveMediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory, customExtractorsFactory) .createMediaSource(MediaItem.fromUri(uri));