การย่อ APK

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