如要開發優質的 Android 應用程式,關鍵在於盡可能減少 APK 大小。鎖定開發市場以及開發 Android 免安裝應用程式時,這一點尤其重要。在這種情況下,建議您盡可能縮減 APK 中包含的 ExoPlayer 程式庫大小。本頁概述有助於達成此目標的幾個簡單步驟。
僅使用必要的依附元件
只仰賴您實際所需的程式庫模組。舉例來說,以下內容會新增 ExoPlayer、DASH 和 UI 程式庫模組的依附元件,同時也如果應用程式只會播放 DASH 內容,可能就必須新增依附元件:
Kotlin
implementation("androidx.media3:media3-exoplayer:1.3.1") implementation("androidx.media3:media3-exoplayer-dash:1.3.1") implementation("androidx.media3:media3-ui:1.3.1")
Groovy
implementation "androidx.media3:media3-exoplayer:1.3.1" implementation "androidx.media3:media3-exoplayer-dash:1.3.1" implementation "androidx.media3:media3-ui:1.3.1"
啟用程式碼和資源縮減功能
建議您針對應用程式的發布子版本啟用程式碼和資源縮減功能。ExoPlayer 的結構採用允許程式碼縮減的方式,有效移除未使用的功能。舉例來說,如果應用程式播放 DASH 內容,啟用程式碼縮減功能之後,ExoPlayer 對 APK 大小的貢獻可以縮減約 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()
Java
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)。
指定應用程式需要的擷取器
根據預設,玩家會建立 Extractor
例項,使用 DefaultExtractorsFactory
播放漸進式媒體。DefaultExtractorsFactory
依附於 ExoPlayer 程式庫提供的所有 Extractor
實作項目,因此程式碼縮減不會將其移除。如果您確定應用程式只需要播放少量容器格式,或完全無法播放漸進式媒體,您可以改為指定自己的 ExtractorsFactory
。舉例來說,應用程式只需要播放 mp4 檔案,就能提供以下工廠:
Kotlin
val mp4ExtractorFactory = ExtractorsFactory { arrayOf<Extractor>(Mp4Extractor(DefaultSubtitleParserFactory())) } val player = ExoPlayer.Builder(context, DefaultMediaSourceFactory(context, mp4ExtractorFactory)).build()
Java
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()
Java
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()
Java
ExoPlayer player = new ExoPlayer.Builder(context, mediaSourceFactory).build();
如果應用程式直接使用 MediaSource
而非 MediaItem
,您應將 MediaSource.Factory.UNSUPPORTED
傳遞至 ExoPlayer.Builder
建構函式,以確保能利用程式碼縮減功能去除 DefaultMediaSourceFactory
和 DefaultExtractorsFactory
。
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));