ข้อขัดข้องและ ANR ใน Android จะสร้างสแต็กเทรซซึ่งเป็นชุดข้อมูลลำดับของฟังก์ชันที่มีการเรียกใช้ซึ่งฝังอยู่ในโปรแกรมจนถึงเวลาที่เกิดข้อขัดข้อง ชุดข้อมูลเหล่านี้ช่วยให้คุณระบุและแก้ไขปัญหาที่เกิดขึ้นในแหล่งที่มาได้
หากพัฒนาแอปหรือเกมโดยใช้ Java และใช้ ProGuard ในการเพิ่มประสิทธิภาพแอปและปรับให้ยากต่อการอ่าน (Obfuscate) คุณสามารถอัปโหลดไฟล์การแมป ProGuard สำหรับแอปแต่ละเวอร์ชันใน Play Console หากพัฒนาแอปหรือเกมโดยใช้โค้ดแบบเนทีฟ เช่น C++ คุณสามารถอัปโหลดไฟล์สัญลักษณ์สำหรับแก้ไขข้อบกพร่องของแอปแต่ละเวอร์ชันใน Play Console ซึ่งจะช่วยให้วิเคราะห์และแก้ไขข้อขัดข้องและ ANR ได้ง่ายขึ้น
สำคัญ: เฉพาะไฟล์การแมปที่เข้ากันได้กับ ReTrace เท่านั้นที่รองรับการถอดรหัสซอร์สโค้ดที่สร้างความสับสนของแอปที่คอมไพล์ใน Java ซึ่งเป็นรูปแบบเดียวกับที่ ProGuard หรือ R8 ใช้
ขั้นตอนที่ 1: สร้างไฟล์สำหรับการถอดรหัสซอร์สโค้ดที่สร้างความสับสนหรือไฟล์สำหรับการแทนที่ด้วยสัญลักษณ์
หากต้องการถอดรหัสซอร์สโค้ดที่สร้างความสับสนหรือแทนที่ด้วยสัญลักษณ์สำหรับข้อขัดข้องและ ANR ของแอปเวอร์ชันหนึ่ง คุณต้องสร้างไฟล์ที่จำเป็นสำหรับแอปเวอร์ชันเดียวกันก่อน คุณต้องสร้างและอัปโหลดไฟล์สำหรับแอปเวอร์ชันใหม่แต่ละเวอร์ชันเพื่อให้การถอดรหัสซอร์สโค้ดที่สร้างความสับสนหรือการแทนที่ด้วยสัญลักษณ์ใช้งานได้
Java: สร้างไฟล์การแมป ProGuardหากต้องการถอดรหัสซอร์สโค้ดที่สร้างความสับสนของสแต็กเทรซ Java คุณต้องสร้างไฟล์การแมป ProGuard ขึ้นมาก่อน ดูวิธีการสร้างไฟล์ได้ที่เว็บไซต์ Google Developers
ปลั๊กอิน Android Gradle เวอร์ชัน 4.1 ขึ้นไป
หากเป็นโปรเจ็กต์สร้าง Android App Bundle คุณจะรวมไฟล์สัญลักษณ์สำหรับแก้ไขข้อบกพร่องไว้ในนั้นได้โดยอัตโนมัติ หากต้องการรวมไฟล์นี้ ให้เพิ่มค่าต่อไปนี้ลงในไฟล์ build.gradle
ของแอป
android.defaultConfig.ndk.debugSymbolLevel = 'FULL'
หมายเหตุ: ไฟล์สัญลักษณ์สำหรับแก้ไขข้อบกพร่องต้องมีขนาดไม่เกิน 800 MB หากฟุตพรินท์ของสัญลักษณ์สำหรับแก้ไขข้อบกพร่องมีขนาดใหญ่เกินไป ให้ใช้ SYMBOL_TABLE
แทน FULL
เพื่อลดขนาดไฟล์
หากเป็นโปรเจ็กต์สร้าง APK ให้ใช้การตั้งค่าบิลด์ build.gradle ข้างต้นเพื่อสร้างไฟล์สัญลักษณ์สำหรับแก้ไขข้อบกพร่องแยกกัน อัปโหลดไฟล์สัญลักษณ์สำหรับแก้ไขข้อบกพร่องไปยัง Google Play Console ด้วยตนเองตามที่อธิบายด้านล่างในขั้นตอนที่ 2: อัปโหลดไฟล์สำหรับถอดรหัสซอร์สโค้ดที่สร้างความสับสนหรือไฟล์สำหรับแทนที่ด้วยสัญลักษณ์ เนื่องจากเป็นส่วนหนึ่งของกระบวนการบิลด์ ปลั๊กอิน Android Gradle จะเอาต์พุตไฟล์นี้ในตำแหน่งของโปรเจ็กต์ดังต่อไปนี้
app/build/outputs/native-debug-symbols/variant-name/native-debug-symbols.zip
ปลั๊กอิน Android Gradle เวอร์ชัน 4.0 ลงไป (และระบบบิลด์อื่นๆ)
ในกระบวนการบิลด์สำหรับ App Bundle หรือ APK ปลั๊กอิน Android Gradle จะเก็บสำเนาของไลบรารีที่ยังไม่ได้ Strip เอาไว้ในไดเรกทอรีของโปรเจ็กต์ ไดเรกทอรีดังกล่าวมีโครงสร้างที่คล้ายกับด้านล่างนี้
app/build/intermediates/cmake/universal/release/obj
├── armeabi-v7a/
│ ├── libgamenegine.so
│ ├── libothercode.so
│ └── libvideocodec.so
├── arm64-v8a/
│ ├── libgamenegine.so
│ ├── libothercode.so
│ └── libvideocodec.so
├── x86/
│ ├── libgamenegine.so
│ ├── libothercode.so
│ └── libvideocodec.so
└── x86_64/
├── libgameengine.so
├── libothercode.so
└── libvideocodec.so
หมายเหตุ: หากใช้ระบบบิลด์แบบอื่น คุณแก้ไขเพื่อเก็บไลบรารีที่ยังไม่ได้ Strip ในไดเรกทอรีตามแบบโครงสร้างที่ต้องใช้ด้านบนได้
- บีบอัดเนื้อหาของไดเรกทอรีนี้
$ cd app/build/intermediates/cmake/universal/release/obj
$ zip -r symbols.zip .
- อัปโหลดไฟล์ symbols.zip ไปยัง Play Console ด้วยตนเองตามที่อธิบายด้านล่างในขั้นตอนที่ 2: อัปโหลดไฟล์สำหรับการถอดรหัสซอร์สโค้ดที่สร้างความสับสนหรือไฟล์สำหรับการแทนที่ด้วยสัญลักษณ์
ไฟล์สัญลักษณ์สำหรับแก้ไขข้อบกพร่องต้องมีขนาดไม่เกิน 800 MB หากไฟล์มีขนาดใหญ่เกินไปอาจเป็นเพราะไฟล์ .so มีตารางสัญลักษณ์ (ชื่อฟังก์ชัน) และข้อมูลการแก้ไขข้อบกพร่องของ DWARF (ชื่อไฟล์และบรรทัดของโค้ด) รายการเหล่านี้ไม่จำเป็นสำหรับการแทนที่โค้ดด้วยสัญลักษณ์ และนำออกได้โดยการเรียกใช้คำสั่งนี้
$OBJCOPY --strip-debug lib.so lib.so.sym
หมายเหตุ: $OBJCOPY
ชี้ไปที่เวอร์ชันเฉพาะสำหรับ ABI ที่คุณทำการ Strip ตัวอย่างเช่น ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-objcopy
ขั้นตอนที่ 2: อัปโหลดไฟล์สำหรับถอดรหัสซอร์สโค้ดที่สร้างความสับสนหรือไฟล์สำหรับแทนที่ด้วยสัญลักษณ์
หากต้องการถอดรหัสซอร์สโค้ดที่สร้างความสับสนหรือแทนที่ด้วยสัญลักษณ์สำหรับข้อขัดข้องและ ANR ของแอปเวอร์ชันหนึ่ง คุณต้องอัปโหลดไฟล์สำหรับถอดรหัสซอร์สโค้ดที่สร้างความสับสนหรือไฟล์สำหรับแทนที่ด้วยสัญลักษณ์ของแอปแต่ละเวอร์ชัน
สำคัญ: ขั้นตอนนี้จำเป็นสำหรับนักพัฒนาแอปที่ใช้ APK เท่านั้น คุณไม่จำเป็นต้องดำเนินการใดๆ หากใช้ App Bundle และปลั๊กอิน Android Gradle เวอร์ชัน 4.1 ขึ้นไป เราจะดึงไฟล์สำหรับการถอดรหัสซอร์สโค้ดที่สร้างความสับสนจาก Bundle โดยอัตโนมัติ และคุณข้ามไปที่ขั้นตอนที่ 3: ดูสแต็กเทรซของข้อขัดข้องที่ถอดรหัสซอร์สโค้ดที่สร้างความสับสนแล้วได้เลย ดูข้อมูลเพิ่มเติมเกี่ยวกับ App Bundle ได้ที่เว็บไซต์ของนักพัฒนาแอป Android
อัปโหลดไฟล์โดยใช้ Play Consoleวิธีอัปโหลดไฟล์สำหรับการถอดรหัสซอร์สโค้ดที่สร้างความสับสนและไฟล์สำหรับการแทนที่ด้วยสัญลักษณ์
- เปิด Play Console
- เลือกแอป
- ที่เมนูด้านซ้าย ให้เลือก
ทดสอบและเผยแพร่
> App Bundle Explorer - ใช้เครื่องมือเลือกที่มุมขวาบนเลือกอาร์ติแฟกต์ที่เกี่ยวข้อง
- เลือกแท็บการดาวน์โหลด แล้วเลื่อนลงไปที่ส่วน "เนื้อหา"
- คลิกลูกศรอัปโหลดสำหรับไฟล์การแมปหรือสัญลักษณ์สำหรับแก้ไขข้อบกพร่องที่เกี่ยวข้องเพื่ออัปโหลดไฟล์สำหรับการถอดรหัสซอร์สโค้ดที่สร้างความสับสนหรือไฟล์สำหรับการแทนที่ด้วยสัญลักษณ์ของแอปแต่ละเวอร์ชัน
ในการอัปโหลดไฟล์โดยใช้ Google Play Developer API โปรดไปที่เว็บไซต์ Google Developers
ขั้นตอนที่ 3: ดูสแต็กเทรซของข้อขัดข้องที่ถอดรหัสซอร์สโค้ดที่สร้างความสับสนแล้ว
เมื่อคุณอัปโหลดไฟล์การแมปของ ProGuard หรือไฟล์สัญลักษณ์สำหรับแก้ไขข้อบกพร่องสำหรับแอปแต่ละเวอร์ชันแล้ว ระบบจะถอดรหัสซอร์สโค้ดที่สร้างความสับสนของข้อขัดข้องและ ANR ที่เกิดขึ้นหลังจากนั้น คุณตรวจสอบสแต็กเทรซที่ถอดรหัสซอร์สโค้ดที่สร้างความสับสนของข้อขัดข้องและ ANR แต่ละรายการได้ในหน้าข้อขัดข้องและ ANRของแอป
- เปิด Play Console
- เลือกแอป
- ที่เมนูด้านซ้าย ให้เลือกตรวจสอบและปรับปรุง > Android Vitals > ข้อขัดข้องและ ANR
- เลือกข้อขัดข้อง
- ในส่วน "สแต็กเทรซ" คุณจะเห็นสแต็กเทรซที่ถอดรหัสซอร์สโค้ดที่สร้างความสับสนและสแต็กเทรซที่แทนที่ด้วยสัญลักษณ์
สำคัญ: เมื่อคุณอัปโหลดไฟล์การแมปของเวอร์ชันแอปแล้ว ระบบจะถอดรหัสซอร์สโค้ดที่สร้างความสับสนเฉพาะข้อขัดข้องและ ANR ที่เกิดขึ้นในอนาคตของแอปเวอร์ชันนั้นเท่านั้น ระบบจะไม่ถอดรหัสซอร์สโค้ดที่สร้างความสับสนของข้อขัดข้องและ ANR ของเวอร์ชันแอปที่เกิดขึ้นก่อนที่คุณจะอัปโหลดไฟล์การแมปที่เกี่ยวข้อง
คำถามที่พบบ่อย
ฉันไม่ต้องการใช้การถอดรหัสซอร์สโค้ดที่สร้างความสับสน/การแทนที่ด้วยสัญลักษณ์ของ Play Console ฉันจะทำแบบออฟไลน์ได้ไหมPlay Console ใช้ ndk-stack เป็นสัญลักษณ์ของสแต็กเทรซสำหรับแอปที่มาพร้อมเครื่องและใช้ ReTrace สำหรับข้อขัดข้องของ Java หากเลือกที่จะไม่แชร์ไฟล์สำหรับการถอดรหัสซอร์สโค้ดที่สร้างความสับสน คุณจะคัดลอกสแต็กข้อขัดข้องที่ปรับให้ยากต่อการอ่าน (Obfuscate) จาก Play Console และใช้เครื่องมือออฟไลน์ที่เหมาะสมในการแทนที่ด้วยสัญลักษณ์ก็ได้ อย่างไรก็ตาม ขั้นตอนนี้คุณต้องทำกับสแต็กข้อขัดข้องแต่ละรายการด้วยตัวเอง ซึ่งจะทำให้ช้าและใช้เวลานาน หากคุณส่งไฟล์สำหรับการถอดรหัสซอร์สโค้ดที่สร้างความสับสนให้เรา Play Console จะจัดการขั้นตอนนี้ให้คุณเอง
เมื่อคุณอัปโหลดไฟล์การแมปของ ProGuard หรือไฟล์สัญลักษณ์สำหรับแก้ไขข้อบกพร่องสำหรับแอปแต่ละเวอร์ชันแล้ว ระบบจะถอดรหัสซอร์สโค้ดที่สร้างความสับสนเฉพาะของข้อขัดข้องและ ANR ที่เกิดขึ้นหลังจากนั้น คุณต้องรอให้มีการรายงานข้อขัดข้องและ ANR ใหม่จากอุปกรณ์ของผู้ใช้ก่อนจึงจะเห็นข้อขัดข้องและ ANR ที่ถอดรหัสซอร์สโค้ดที่สร้างความสับสนใน Play Console
ปัญหานี้เกิดจากการอัปโหลดไฟล์สำหรับการถอดรหัสซอร์สโค้ดที่สร้างความสับสน/ไฟล์สำหรับการแทนที่ด้วยสัญลักษณ์ที่ไม่สมบูรณ์ ตรวจสอบว่าคุณได้รวมไฟล์สำหรับการแทนที่ด้วยสัญลักษณ์ของทั้งแอป โดยเฉพาะอย่างยิ่งหากคุณใช้กระบวนการบิลด์ที่ซับซ้อนหรือหลายขั้นตอน หนึ่งในสาเหตุที่พบบ่อยที่สุดสำหรับการถอดรหัสซอร์สโค้ดที่สร้างความสับสนเพียงบางส่วนคือการที่คุณใช้ไลบรารีของบุคคลที่สาม ในกรณีนี้คุณอาจขอไฟล์สำหรับการถอดรหัสซอร์สโค้ดที่สร้างความสับสนจากผู้ให้บริการไลบรารี
หากไม่มีไฟล์สำหรับการถอดรหัสซอร์สโค้ดที่สร้างความสับสน ข้อขัดข้องหรือ ANR เดียวกันในอุปกรณ์ 32 บิตและ 64 บิต หรือในอุปกรณ์ ARM และอุปกรณ์ Intel จะแสดงแยกกัน หากมีไฟล์สำหรับการถอดรหัสซอร์สโค้ดที่สร้างความสับสนจะทำให้เราจัดกลุ่มข้อขัดข้องเหล่านี้ได้ เพื่อให้คุณเห็นภาพข้อขัดข้องและ ANR ที่ส่งผลกระทบมากที่สุดของแอปได้ดีขึ้น
หากคุณลืมอัปโหลดไฟล์สำหรับแอปเวอร์ชันใหม่ ข้อขัดข้องและ ANR จะเปลี่ยนกลับไปเป็นแบบสับสน โปรดทำตามวิธีการอัปโหลดด้านบนตอนนี้เลย เมื่อคุณอัปโหลดไฟล์การแมปของ ProGuard หรือไฟล์สัญลักษณ์สำหรับแก้ไขข้อบกพร่องสำหรับแอปแต่ละเวอร์ชันแล้ว ระบบจะถอดรหัสซอร์สโค้ดที่สร้างความสับสนเฉพาะของข้อขัดข้องและ ANR ที่เกิดขึ้นหลังจากนั้น คุณต้องรอให้มีการรายงานข้อขัดข้องและ ANR ใหม่จากอุปกรณ์ของผู้ใช้ก่อนจึงจะเห็นข้อขัดข้องและ ANR ที่ถอดรหัสซอร์สโค้ดที่สร้างความสับสนใน Play Console
เพื่อหลีกเลี่ยงความเสี่ยงที่คุณอาจลืมอัปโหลดไฟล์ ให้พิจารณาเปลี่ยนกระบวนการบิลด์ไปใช้ App Bundle ที่มีปลั๊กอิน Android Gradle เวอร์ชัน 4.1 ขึ้นไป ในกรณีนี้ คุณจะรวมไฟล์สัญลักษณ์สำหรับแก้ไขข้อบกพร่องใน App Bundle ได้โดยอัตโนมัติ โดยทำตามวิธีการในเว็บไซต์ของนักพัฒนาแอป Android
หากคุณอัปโหลดไฟล์สำหรับเวอร์ชันแอปผิดไฟล์ ข้อขัดข้องและ ANR จะเปลี่ยนกลับไปเป็นแบบสับสน วิธีอัปโหลดเวอร์ชันที่แก้ไขแล้ว
- เปิด Play Console
- เลือกแอป
- ที่เมนูด้านซ้าย ให้เลือก
ทดสอบและเผยแพร่
> App Bundle Explorer - ใช้เครื่องมือเลือกที่มุมขวาบนเลือกอาร์ติแฟกต์ที่เกี่ยวข้อง
- เลือกแท็บการดาวน์โหลด แล้วเลื่อนลงไปที่ส่วน "เนื้อหา"
- คลิกไอคอนลบถัดจากไฟล์สำหรับการถอดรหัสซอร์สโค้ดที่สร้างความสับสนหรือไฟล์สำหรับการแทนที่ด้วยสัญลักษณ์ที่ไม่ถูกต้อง
- เมื่อลบเวอร์ชันที่ไม่ถูกต้องแล้ว ให้คลิกไอคอนอัปโหลดและอัปโหลดไฟล์ที่ถูกต้องสำหรับเวอร์ชันของแอป
เมื่อคุณอัปโหลดไฟล์การแมปของ ProGuard หรือไฟล์สัญลักษณ์สำหรับแก้ไขข้อบกพร่องที่ถูกต้องสำหรับแอปแต่ละเวอร์ชันแล้ว ระบบจะถอดรหัสซอร์สโค้ดที่สร้างความสับสนเฉพาะของข้อขัดข้องและ ANR ที่เกิดขึ้นหลังจากนั้น คุณต้องรอให้มีการรายงานข้อขัดข้องและ ANR ใหม่จากอุปกรณ์ของผู้ใช้ก่อนจึงจะเห็นข้อขัดข้องและ ANR ที่ถอดรหัสซอร์สโค้ดที่สร้างความสับสนใน Play Console
เคล็ดลับ: เพื่อหลีกเลี่ยงความเสี่ยงที่คุณอาจอัปโหลดไฟล์ที่ไม่ถูกเวอร์ชัน ให้พิจารณาเปลี่ยนกระบวนการบิลด์ไปใช้ App Bundle ที่มีปลั๊กอิน Android Gradle เวอร์ชัน 4.1 ขึ้นไป ในกรณีนี้ คุณจะรวมไฟล์สัญลักษณ์สำหรับแก้ไขข้อบกพร่องใน App Bundle ได้โดยอัตโนมัติ โดยทำตามวิธีการในเว็บไซต์ของนักพัฒนาแอป Android
ไปที่เว็บไซต์ของนักพัฒนาแอป Android เพื่อเริ่มต้นใช้งาน
ได้
ในบางครั้ง ระบบจะพบ ANR แต่รวบรวมสแต็กเทรซไม่ได้ โดยในเหตุการณ์นี้ ANR จะแสดงขึ้นเพื่อให้คุณเห็นภาพที่สมบูรณ์ยิ่งขึ้นเกี่ยวกับความเสถียรของแอปแต่จะแสดงตัวสแต็กเทรซไม่ได้ ANR ที่ไม่มีสแต็กเทรซจะจัดกลุ่มไว้ตามประเภทและกิจกรรม การตรวจสอบและแก้ไข ANR ที่คล้ายกันจึงอาจช่วยลดจำนวนที่ไม่มีสแต็กเทรซได้