การย่อ APK

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