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