การย่อ APK

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