การย่อ APK

การลดขนาด 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));