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