Android Lint — ตัววิเคราะห์โค้ดแบบสแตติกในตัวใน Android Studio และ Gradle ที่ตรวจสอบไฟล์ต้นฉบับตามคำแนะนำของ Google Lint ค้นหาข้อผิดพลาดที่อาจเกิดขึ้นก่อนการคอมไพล์: ทรัพยากรที่ไม่ได้ใช้ ปัญหาด้านประสิทธิภาพ หน่วยความจำรั่วไหล และความไม่เข้ากันของ API เครื่องมือนี้วิเคราะห์ไฟล์ XML, Java และ Kotlin เรียนรู้เพิ่มเติมที่ Android Lint Guide
ประเด็นสำคัญ
Android Lint เป็นเครื่องมือวิเคราะห์แบบสแตติกที่รวมอยู่ใน Android SDK และ Android Studio Lint สแกนโค้ดต้นฉบับของแอปพลิเคชันโดยไม่ต้องเรียกใช้งานและค้นหาปัญหาที่คอมไพเลอร์มองข้าม: ทรัพยากรที่ไม่ได้ใช้ การแปลภาษาที่ไม่ถูกต้อง หน่วยความจำรั่วไหลที่อาจเกิดขึ้น ความไม่เข้ากันของ API กับ minSdkVersion และการละเมิดคำแนะนำด้านประสิทธิภาพของ Google
การวิเคราะห์แบบสแตติก เป็นวิธีการตรวจสอบซอฟต์แวร์ที่ไม่ต้องการการเรียกใช้โค้ดจริง แตกต่างจากคอมไพเลอร์ที่ตรวจสอบเฉพาะไวยากรณ์และประเภท ตัววิเคราะห์แบบสแตติกค้นหาข้อผิดพลาดเชิงตรรกะ รูปแบบต้าน และการเบี่ยงเบนจากแนวทางปฏิบัติที่ดีที่สุด Lint ดำเนินการตรวจสอบในตัวมากกว่า 200 รายการตามหมวดหมู่: ความถูกต้อง ประสิทธิภาพ ความปลอดภัย การเข้าถึง ความสามารถในการใช้งาน และ I18N
Lint ทำงานในหลายระดับ: การวิเคราะห์ XML ตรวจสอบเลย์เอาท์ ทรัพยากร (strings, colors, dimens) ไฟล์แถลงการณ์และไฟล์กำหนดค่า การวิเคราะห์ Java/Kotlin ตรวจสอบโค้ดต้นฉบับเพื่อหาการเรียก API ที่เลิกใช้ ปัญหาเธรด และการรั่วไหลของบริบท การวิเคราะห์ Gradle ตรวจสอบการกำหนดค่าบิลด์เพื่อความเข้ากันได้ของเวอร์ชัน
การตรวจสอบ Lint เริ่มต้นผ่าน Android Studio (Analyze > Inspect Code) หรือคำสั่ง Gradle: ./gradlew lint ผลลัพธ์คือรายงาน HTML ในโฟลเดอร์ build/reports/lint-results.html และรายงาน XML สำหรับระบบ CI Lint วิเคราะห์แต่ละไฟล์อย่างอิสระ โดยใช้ชุดกฎ (Issues) ซึ่งแต่ละกฎมี ID เฉพาะ คำอธิบาย หมวดหมู่ และระดับความรุนแรง
ระดับความรุนแรงของ Lint: Error (ข้อผิดพลาด — ปิดกั้นบิลด์), Warning (คำเตือน — ส่งผลต่อคุณภาพ), Informational (ข้อมูล — สำหรับอ้างอิง), Ignore (ละเว้นโดยค่าเริ่มต้น) ระดับถูกกำหนดค่าใน lint.xml ข้อผิดพลาด Lint สามารถกำหนดค่าให้ทำให้บิลด์ Gradle ล้มเหลวเมื่อมีอยู่ผ่าน lintOptions.abortOnError true
android {
lintOptions {
abortOnError true
checkAllWarnings true
baselineFile file("lint-baseline.xml")
htmlReport true
xmlReport true
lintConfig file("lint.xml")
}
}
Lint baseline — ไฟล์ที่ทำเครื่องหมายคำเตือนปัจจุบันว่ายอมรับได้ สร้างด้วยคำสั่ง lint --baseline baseline.xml หลังจากเพิ่ม baseline ในโปรเจกต์ Lint จะรายงานเฉพาะปัญหาใหม่เท่านั้น สะดวกสำหรับการนำ Lint ไปใช้ในโปรเจกต์เก่าที่มีคำเตือนหลายร้อยรายการ — ทีมแก้ไขข้อผิดพลาดแบบค่อยเป็นค่อยไป
lint.xml — ไฟล์กำหนดค่าในรูทโปรเจกต์สำหรับปรับแต่งกฎ Lint ระบุกฎที่ละเว้น ระดับความรุนแรง และข้อยกเว้นสำหรับไฟล์หรือไดเรกทอรีเฉพาะ ไฟล์ถูกสร้างด้วยตนเองและนำไปใช้ทั่วโลกกับทุกโมดูลของโปรเจกต์ หากไม่มี lint.xml กฎทั้งหมดจะทำงานด้วยการตั้งค่าเริ่มต้น
<?xml version="1.0" encoding="UTF-8"?>
<lint>
<!-- ปิดการตรวจสอบทรัพยากรที่ไม่ได้ใช้ -->
<issue id="UnusedResources" severity="ignore" />
<!-- เพิ่มความรุนแรงของการรั่วไหลของบริบท -->
<issue id="StaticFieldLeak" severity="error" />
<!-- ละเว้นในไฟล์ที่สร้างขึ้น -->
<issue id="MissingTranslation" severity="ignore">
<ignore path="build/generated" />
</issue>
</lint>
@SuppressLint — คำอธิบายประกอบสำหรับปิดการใช้งาน Lint ในระดับเมธอดหรือคลาสใน Java/Kotlin ตัวอย่าง: @SuppressLint("SetTextI18n") สำหรับเมธอดที่ตั้งค่าข้อความแบบไดนามิกใน TextView คำอธิบายประกอบ @RequiresApi ระบุระดับ API ขั้นต่ำสำหรับเมธอด — Lint จะไม่แจ้งคำเตือนหาก minSdk เกินค่าที่ระบุ
การรวม CI ของ Lint เป็นแนวปฏิบัติมาตรฐานในการพัฒนา Android คำสั่ง ./gradlew lint เรียกใช้การวิเคราะห์ในทุกโมดูลและสร้างรายงาน ในการกำหนดค่า CI/CD (Jenkins, GitLab CI, GitHub Actions) Lint จะทำงานในทุก pull request หากพบข้อผิดพลาด บิลด์จะล้มเหลวและนักพัฒนาจะได้รับการแจ้งเตือนพร้อมรายงาน HTML ของ Lint
lint-check:
script:
- ./gradlew lint
artifacts:
paths:
- app/build/reports/lint-results.html
when: always
รายงาน HTML ของ Lint มีตารางของปัญหาที่พบทั้งหมดพร้อมหมวดหมู่ ID กฎ ไฟล์ บรรทัด และคำอธิบาย รายงานพร้อมใช้งานบนเซิร์ฟเวอร์ CI หรือเผยแพร่เป็นสิ่งประดิษฐ์ของบิลด์ รายงาน XML (lint-results.xml) ใช้สำหรับรวมกับระบบวิเคราะห์โค้ด (SonarQube, CodeClimate) และสร้างงานอัตโนมัติในตัวติดตาม (Jira, YouTrack)
Lint ใน pull request — กำหนดค่า GitHub Actions หรือ GitLab CI ให้ Lint ทำงานโดยอัตโนมัติเมื่อสร้าง MR/PR หาก Lint พบข้อผิดพลาด CI จะส่งคืนสถานะล้มเหลว และการรวมจะถูกบล็อก ป้องกันไม่ให้โค้ดที่มีปัญหาเข้าสู่สาขาหลักและรักษาคุณภาพของฐานโค้ด
หมวดหมู่ Lint ครอบคลุมทุกด้านของการพัฒนา Android Google แบ่งกฎออกเป็น 12 หมวดหมู่ แต่ละหมวดหมู่รับผิดชอบปัญหาประเภทเฉพาะ หมวดหมู่ที่สำคัญที่สุดคือ Correctness, Performance, Security และ Accessibility นักพัฒนาจำเป็นต้องรู้การตรวจสอบหลักของแต่ละหมวดหมู่เพื่อทำงานกับ Lint อย่างมีประสิทธิภาพ
| หมวดหมู่ | คำอธิบาย | ตัวอย่างกฎ |
|---|---|---|
| Correctness | ข้อผิดพลาดที่ส่งผลต่อการทำงานของแอปพลิเคชัน | MissingPermission, WrongConstant |
| Performance | ปัญหาด้านประสิทธิภาพและหน่วยความจำ | UnusedResources, ViewHolder, DrawAllocation |
| Security | ช่องโหว่และการละเมิดความปลอดภัย | ExportedContentProvider, WorldReadableFiles |
| Accessibility | ปัญหาการเข้าถึงสำหรับผู้ใช้ | ContentDescription, TouchTargetSize |
| Usability | ความสามารถในการใช้งานและประสบการณ์ผู้ใช้ | NotSibling, BackButton, HardcodedText |
| I18N | การทำให้เป็นสากลและการแปลภาษา | MissingTranslation, ExtraTranslation |
กฎประสิทธิภาพ มีประโยชน์มากที่สุดในทางปฏิบัติ UnusedResources ค้นหาทรัพยากรที่ประกาศใน XML แต่ไม่ได้ใช้ในโค้ด ViewHolder ตรวจสอบว่ารูปแบบ ViewHolder ถูกใช้ในอะแดปเตอร์ RecyclerView หรือไม่ DrawAllocation เตือนเกี่ยวกับการสร้างออบเจ็กต์ในเมธอด onDraw การแก้ไขปัญหาเหล่านี้ช่วยลดขนาด APK และเพิ่มความเร็วของแอปพลิเคชัน
กฎความปลอดภัย จำเป็นสำหรับแอปพลิเคชันที่เผยแพร่ ExportedContentProvider ตรวจสอบว่า ContentProvider ถูกส่งออกโดยไม่มีการป้องกันหรือไม่ WorldReadableFiles เตือนเกี่ยวกับการสร้างไฟล์ที่แอปพลิเคชันทั้งหมดเข้าถึงได้ AllowBackup ตรวจสอบแฟล็ก allowBackup ในไฟล์แถลงการณ์ — แนะนำให้ปิดการใช้งานเพื่อความปลอดภัยของข้อมูล
คำถามที่พบบ่อย
คอมไพเลอร์ ตรวจสอบไวยากรณ์และประเภท แปลงโค้ดเป็นไบต์โค้ดสำหรับการทำงาน Lint วิเคราะห์โค้ดโดยไม่ต้องคอมไพล์และค้นหาปัญหาเชิงตรรกะที่คอมไพเลอร์มองข้าม: ตัวแปรที่ไม่ได้ใช้ ทรัพยากรรั่วไหล ปัญหาการแปลภาษา การละเมิดประสิทธิภาพ และความไม่เข้ากันของ API กับ minSdkVersion Lint เสริมคอมไพเลอร์แต่ไม่ได้แทนที่
ในไฟล์ XML ใช้แอตทริบิวต์ tools:ignore พร้อม ID กฎ: tools:ignore="UnusedResources" ใน Java/Kotlin เพิ่มคำอธิบายประกอบ @SuppressLint ไปยังเมธอดหรือคลาส: @SuppressLint("SetTextI18n") สำหรับทั้งไดเรกทอรี กำหนดค่า lint.xml ด้วยโหนด issue และ severity="ignore" สำหรับทั้งโปรเจกต์ กำหนดค่า lint.xml ในรูทของโมดูล
Lint baseline คือไฟล์ XML ที่ทำเครื่องหมายคำเตือน Lint ปัจจุบันว่ายอมรับได้ สร้างด้วยคำสั่ง ./gradlew lint -Pbaseline หรือผ่าน lintOptions.baselineFile ใน build.gradle หลังจากเพิ่ม baseline แล้ว Lint จะรายงานเฉพาะปัญหาใหม่ สะดวกสำหรับการนำ Lint ไปใช้ในโปรเจกต์ที่มีโค้ดดั้งเดิม — ทีมแก้ไขข้อผิดพลาดแบบวนซ้ำ
สร้างโมดูล Java/Kotlin ใหม่พร้อมการพึ่งพา lint-api และ lint-checks จากไลบรารี com.android.tools.lint นำคลาส Detector ไปใช้เพื่อค้นหาปัญหาและคลาส Issue เพื่ออธิบายปัญหา สร้างโมดูลเป็น JAR วางในโฟลเดอร์ lintLibs ของโปรเจกต์ Android ของคุณ Android Studio จะตรวจจับกฎที่กำหนดเองโดยอัตโนมัติ
Lint ค้นหาปัญหาที่คอมไพเลอร์ไม่เห็น: การรั่วไหลของบริบท (Activity, Fragment), ความไม่เข้ากันของ API กับ minSdkVersion, ปัญหาการกำหนดค่า Gradle, ไอคอน PNG ที่ใหญ่เกินไป, การขาดทรัพยากรทางเลือกสำหรับภาษาและการกำหนดค่าหน้าจอที่แตกต่างกัน Google Play แนะนำ Lint ก่อนเผยแพร่ หากไม่มี Lint แอปอาจขัดข้องบนอุปกรณ์รุ่นเก่า
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ