การลดขนาด APK เป็นปัจจัยสําคัญในการพัฒนาแอป Android ที่ดี โดยเฉพาะอย่างยิ่งเมื่อกําหนดเป้าหมายไปยังตลาดที่พัฒนาแล้ว และเมื่อพัฒนา Instant App ของ Android ด้วย ในกรณีเช่นนี้ คุณอาจต้องลดขนาดของไลบรารี ExoPlayer ที่รวมอยู่ใน APK หน้านี้ระบุขั้นตอนง่ายๆ ที่จะช่วยคุณดำเนินการดังกล่าว
ใช้เฉพาะ Dependency ที่จำเป็น
ใช้เฉพาะโมดูลไลบรารีที่คุณต้องการจริงๆ ตัวอย่างเช่น รายการต่อไปนี้จะเพิ่มการพึ่งพาในโมดูลไลบรารี ExoPlayer, DASH และ UI ซึ่งอาจจำเป็นสำหรับแอปที่เล่นเฉพาะเนื้อหา DASH
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")
ดึงดูด
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
ขึ้นอยู่กับการใช้งาน Renderer
ทั้งหมดที่มีให้ในไลบรารี ExoPlayer และด้วยเหตุนี้ จะไม่มีการนำโค้ดใดๆ ออกด้วยการลดขนาดโค้ด หากทราบว่าแอปของคุณต้องใช้โปรแกรมแสดงผลเพียงชุดย่อย คุณก็ระบุ 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
เพื่อเล่นสื่อแบบ Progressive โดยใช้
DefaultExtractorsFactory
DefaultExtractorsFactory
ขึ้นอยู่กับการใช้งาน Extractor
ทั้งหมดที่มีให้ในไลบรารี ExoPlayer และด้วยเหตุนี้ จะไม่มีการนำโค้ดใดๆ ออกด้วยการลดขนาดโค้ด หากทราบว่าแอปต้องเล่นรูปแบบคอนเทนเนอร์เพียงไม่กี่รายการ หรือไม่เล่นสื่อแบบโพรเกรสซีฟเลย ให้ระบุ 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));