Giảm thiểu kích thước tệp APK là một khía cạnh quan trọng trong việc phát triển một ứng dụng Android chất lượng. Điều này đặc biệt đúng khi nhắm đến các thị trường đang phát triển và khi phát triển một Ứng dụng Android tức thì. Trong những trường hợp như vậy, bạn nên giảm thiểu kích thước của thư viện ExoPlayer có trong tệp APK. Trang này trình bày một số bước đơn giản có thể giúp bạn đạt được mục tiêu này.
Chỉ sử dụng các phần phụ thuộc bắt buộc
Chỉ phụ thuộc vào các mô-đun thư viện mà bạn thực sự cần. Ví dụ: đoạn mã sau đây sẽ thêm các phần phụ thuộc vào mô-đun thư viện ExoPlayer, DASH và giao diện người dùng, như có thể cần thiết cho một ứng dụng chỉ phát nội dung DASH:
Kotlin
implementation("androidx.media3:media3-exoplayer:1.11.1")
implementation("androidx.media3:media3-exoplayer-dash:1.11.1")
implementation("androidx.media3:media3-ui:1.11.1")
Groovy
implementation "androidx.media3:media3-exoplayer:1.11.1"
implementation "androidx.media3:media3-exoplayer-dash:1.11.1"
implementation "androidx.media3:media3-ui:1.11.1"
Bật tính năng rút gọn mã và tài nguyên
Bạn nên bật tính năng rút gọn mã và tài nguyên cho bản phát hành của ứng dụng. ExoPlayer được cấu trúc theo cách cho phép rút gọn mã để loại bỏ hiệu quả chức năng không dùng đến. Ví dụ: đối với một ứng dụng phát nội dung DASH, bạn có thể giảm khoảng 40% mức đóng góp của ExoPlayer vào kích thước APK bằng cách bật tính năng rút gọn mã.
Đọc bài viết Rút gọn, làm rối mã nguồn và tối ưu hoá ứng dụng để tìm hiểu cách bật tính năng rút gọn mã và tài nguyên.
Chỉ định trình kết xuất mà ứng dụng của bạn cần
Theo mặc định, trình kết xuất của trình phát sẽ được tạo bằng DefaultRenderersFactory. DefaultRenderersFactory phụ thuộc vào tất cả các cách triển khai Renderer được cung cấp trong thư viện ExoPlayer, nên không có cách triển khai nào bị xoá khi rút gọn mã. Nếu biết rằng ứng dụng của mình chỉ cần một nhóm nhỏ trình kết xuất, bạn có thể chỉ định RenderersFactory của riêng mình. Ví dụ: một ứng dụng chỉ phát âm thanh có thể xác định một nhà máy như sau khi tạo thực thể 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();
Điều này cho phép các hoạt động triển khai Renderer khác bị loại bỏ bằng cách rút gọn mã. Trong video ví dụ cụ thể này, trình kết xuất văn bản và siêu dữ liệu sẽ bị xoá (tức là mọi phụ đề hoặc siêu dữ liệu trong luồng (ví dụ: ICY) sẽ không được trình phát xử lý hoặc phát ra).
Chỉ định trình trích xuất mà ứng dụng của bạn cần
Theo mặc định, trình phát sẽ tạo các thực thể Extractor để phát nội dung nghe nhìn tăng tiến bằng DefaultExtractorsFactory. DefaultExtractorsFactory phụ thuộc vào tất cả các cách triển khai Extractor được cung cấp trong thư viện ExoPlayer, nên không có cách triển khai nào bị xoá khi rút gọn mã. Nếu biết rằng ứng dụng của mình chỉ cần phát một số ít định dạng vùng chứa hoặc hoàn toàn không phát nội dung nghe nhìn tăng dần, thì bạn có thể chỉ định ExtractorsFactory của riêng mình. Ví dụ:
một ứng dụng chỉ cần phát tệp mp4 có thể cung cấp một nhà máy như:
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();
Điều này sẽ cho phép các phương thức triển khai Extractor khác bị xoá bằng cách rút gọn mã, nhờ đó có thể giảm đáng kể kích thước.
Nếu ứng dụng của bạn hoàn toàn không phát nội dung tăng dần, bạn nên truyền ExtractorsFactory.EMPTY đến hàm khởi tạo DefaultMediaSourceFactory, sau đó truyền mediaSourceFactory đó đến hàm khởi tạo 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();
Tạo thực thể MediaSource tuỳ chỉnh
Nếu ứng dụng của bạn đang sử dụng MediaSource.Factory tuỳ chỉnh và bạn muốn xoá DefaultMediaSourceFactory bằng cách loại bỏ mã, thì bạn nên truyền trực tiếp MediaSource.Factory đến hàm khởi tạo ExoPlayer.Builder.
Kotlin
val player = ExoPlayer.Builder(context, customMediaSourceFactory).build()
Java
ExoPlayer player = new ExoPlayer.Builder(context, mediaSourceFactory).build();
Nếu ứng dụng của bạn đang trực tiếp sử dụng MediaSource thay vì MediaItem, bạn nên truyền MediaSource.Factory.UNSUPPORTED đến hàm khởi tạo ExoPlayer.Builder để đảm bảo DefaultMediaSourceFactory và DefaultExtractorsFactory có thể bị loại bỏ bằng cách rút gọn mã.
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));