การลดขนาด APK เป็นสิ่งสำคัญในการพัฒนาแอป Android ที่ดี โดยเฉพาะอย่างยิ่งเมื่อกำหนดเป้าหมายเป็นตลาดเกิดใหม่และ เมื่อพัฒนา Android Instant App ในกรณีดังกล่าว คุณอาจต้องการ ลดขนาดไลบรารี ExoPlayer ที่รวมอยู่ใน APK หน้านี้จะอธิบายขั้นตอนง่ายๆ ที่จะช่วยให้คุณทำเช่นนี้ได้
ใช้เฉพาะการขึ้นต่อกันที่จำเป็น
ใช้เฉพาะโมดูลไลบรารีที่คุณต้องการจริงๆ เท่านั้น ตัวอย่างเช่น รายการต่อไปนี้จะเพิ่มทรัพยากร Dependency ในโมดูล ExoPlayer, DASH และไลบรารี UI ตามที่อาจจำเป็นสำหรับแอปที่เล่นเนื้อหา DASH เท่านั้น
Kotlin
implementation("androidx.media3:media3-exoplayer:1.7.1") implementation("androidx.media3:media3-exoplayer-dash:1.7.1") implementation("androidx.media3:media3-ui:1.7.1")
Groovy
implementation "androidx.media3:media3-exoplayer:1.7.1" implementation "androidx.media3:media3-exoplayer-dash:1.7.1" implementation "androidx.media3:media3-ui:1.7.1"
เปิดใช้การย่อโค้ดและทรัพยากร
คุณควรเปิดใช้การลดขนาดโค้ดและทรัพยากรสำหรับบิลด์ที่เผยแพร่ของแอป ExoPlayer มีโครงสร้างที่ช่วยให้การลดขนาดโค้ดสามารถ นำฟังก์ชันการทำงานที่ไม่ได้ใช้ออกได้อย่างมีประสิทธิภาพ ตัวอย่างเช่น สำหรับแอปที่ เล่นเนื้อหา DASH การเปิดใช้การลดขนาดโค้ดจะช่วยลดขนาด APK ของ ExoPlayer ได้ประมาณ 40%
อ่านลดขนาด สร้างความสับสน และเพิ่มประสิทธิภาพแอปเพื่อดูวิธีเปิดใช้การลดขนาดโค้ดและทรัพยากร
ระบุตัวแสดงผลที่แอปของคุณต้องการ
โดยค่าเริ่มต้น ระบบจะสร้างตัวแสดงผลของเพลเยอร์โดยใช้
DefaultRenderersFactory
DefaultRenderersFactory
ขึ้นอยู่กับการใช้งาน Renderer
ทั้งหมดที่ระบุไว้ในไลบรารี ExoPlayer ดังนั้นการลดขนาดโค้ดจะไม่นำการใช้งานใดๆ ออก หากทราบว่าแอปของคุณต้องการเพียงชุดย่อยของโปรแกรมแสดงผล คุณสามารถระบุRenderersFactory
ของคุณเองแทนได้
ตัวอย่างเช่น แอปที่เล่นเฉพาะเสียงสามารถกำหนด Factory ได้ดังนี้เมื่อสร้างอินสแตนซ์ 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 ดังนั้นการลดขนาดโค้ดจะไม่นำการใช้งานใดๆ ออก หากทราบว่าแอปของคุณต้องการเล่นเฉพาะรูปแบบคอนเทนเนอร์จำนวนเล็กน้อย หรือไม่เล่นสื่อแบบ Progressive เลย คุณสามารถระบุ ExtractorsFactory
ของคุณเองแทนได้ ตัวอย่างเช่น
แอปที่ต้องการเล่นเฉพาะไฟล์ mp4 สามารถระบุ Factory ได้ดังนี้
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));