การลดขนาด APK เป็นปัจจัยสําคัญในการพัฒนาแอป Android ที่ดี โดยเฉพาะอย่างยิ่งเมื่อกําหนดเป้าหมายไปยังตลาดที่พัฒนาแล้ว และเมื่อพัฒนา Instant App ของ Android ด้วย ในกรณีเช่นนี้ คุณอาจต้องลดขนาดของไลบรารี ExoPlayer ที่รวมอยู่ใน APK หน้านี้ระบุขั้นตอนง่ายๆ ที่จะช่วยคุณดำเนินการดังกล่าว
ใช้เฉพาะ Dependency ที่จำเป็น
ใช้เฉพาะโมดูลไลบรารีที่คุณต้องการจริงๆ ตัวอย่างเช่น รายการต่อไปนี้จะเพิ่มการพึ่งพาในโมดูลไลบรารี ExoPlayer, DASH และ UI ซึ่งอาจจำเป็นสำหรับแอปที่เล่นเฉพาะเนื้อหา DASH
implementation("androidx.media3:media3-exoplayer:1.6.0") implementation("androidx.media3:media3-exoplayer-dash:1.6.0") implementation("androidx.media3:media3-ui:1.6.0")
implementation "androidx.media3:media3-exoplayer:1.6.0" implementation "androidx.media3:media3-exoplayer-dash:1.6.0" implementation "androidx.media3:media3-ui:1.6.0"
เปิดใช้การย่อโค้ดและทรัพยากร
คุณควรเปิดใช้การลดขนาดโค้ดและทรัพยากรสำหรับบิลด์ที่เผยแพร่ของแอป ExoPlayer มีโครงสร้างในลักษณะที่ช่วยให้สามารถลดขนาดโค้ดเพื่อนำฟังก์ชันการทำงานที่ไม่ได้ใช้ออกได้อย่างมีประสิทธิภาพ ตัวอย่างเช่น สําหรับแอปที่เล่นเนื้อหา DASH คุณสามารถลดขนาด APK ของ ExoPlayer ลงได้ประมาณ 40% ด้วยการเปิดใช้การบีบอัดโค้ด
อ่านลดขนาด สร้างความสับสน และเพิ่มประสิทธิภาพแอปเพื่อดูวิธีเปิดใช้การลดขนาดโค้ดและทรัพยากร
ระบุโปรแกรมแสดงผลที่แอปของคุณต้องใช้
โดยค่าเริ่มต้น ระบบจะสร้างโปรแกรมแสดงผลของโปรแกรมเล่นโดยใช้ DefaultRenderersFactory
DefaultRenderersFactory
ขึ้นอยู่กับการติดตั้งใช้งาน Renderer
ทั้งหมดที่ระบุไว้ในไลบรารี ExoPlayer ด้วยเหตุนี้ จึงไม่นำพารามิเตอร์เหล่านี้ออกด้วยการลดขนาดโค้ด หากทราบว่าแอปของคุณต้องใช้โปรแกรมแสดงผลเพียงชุดย่อย คุณก็ระบุ RenderersFactory
ของคุณเองแทนได้ ตัวอย่างเช่น แอปที่เล่นเฉพาะเสียงจะกำหนดโรงงานได้ดังนี้เมื่อสร้างอินสแตนซ์ ExoPlayer
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))
ระบุเครื่องมือแยกข้อมูลที่แอปของคุณต้องใช้
โดยค่าเริ่มต้น โปรแกรมเล่นจะสร้างอินสแตนซ์ Extractor
เพื่อเล่นสื่อแบบ Progressive โดยใช้
DefaultExtractorsFactory
DefaultExtractorsFactory
ขึ้นอยู่กับการใช้งาน Extractor
ทั้งหมดที่มีให้ในไลบรารี ExoPlayer และด้วยเหตุนี้ จะไม่มีการนำโค้ดใดๆ ออกด้วยการลดขนาดโค้ด หากทราบว่าแอปของคุณจำเป็นต้องเล่นคอนเทนเนอร์เพียงไม่กี่รูปแบบหรือไม่เล่นสื่อแบบสื่อสมบูรณ์เลย คุณสามารถระบุ ExtractorsFactory
ของคุณเองแทนได้ ตัวอย่างเช่น แอปที่เล่นไฟล์ mp4 เท่านั้นสามารถระบุโรงงานได้ดังนี้
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
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
โดยตรง
val player = ExoPlayer.Builder(context, customMediaSourceFactory).build()
ExoPlayer player = new ExoPlayer.Builder(context, mediaSourceFactory).build();
หากแอปของคุณใช้ MediaSource
โดยตรงแทน MediaItem
คุณควรส่ง MediaSource.Factory.UNSUPPORTED
ไปยังเครื่องมือสร้าง ExoPlayer.Builder
เพื่อให้มั่นใจว่าสามารถลดขนาด DefaultMediaSourceFactory
และ DefaultExtractorsFactory
ได้ด้วยการย่อโค้ด
val player = ExoPlayer.Builder(context, MediaSource.Factory.UNSUPPORTED).build() val mediaSource = ProgressiveMediaSource.Factory(dataSourceFactory, customExtractorsFactory) .createMediaSource(MediaItem.fromUri(uri))
ExoPlayer player = new ExoPlayer.Builder(context, MediaSource.Factory.UNSUPPORTED).build(); ProgressiveMediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory, customExtractorsFactory) .createMediaSource(MediaItem.fromUri(uri));