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 بررسی داخلی را در دستهبندیهای زیر انجام میدهد: correctness، performance، security، accessibility، usability و I18N.
Lint در چند سطح کار میکند: تحلیل XML طرحبندیها (layout)، منابع (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 هر فایل را به طور مستقل تحلیل میکند و مجموعهای از قوانین (Issue) را اعمال میکند که هر کدام دارای 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 در هر درخواست کشش اجرا میشود. در صورت وجود خطاها، ساخت شکست میخورد و توسعهدهنده اعلانی با گزارش 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 وضعیت failure را برمیگرداند و ادغام مسدود میشود. این کار از ورود کد مشکلدار به شاخه اصلی جلوگیری کرده و کیفیت پایگاه کد را حفظ میکند.
دستهبندیهای 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 |
قوانین Performance — مفیدترین در عمل. UnusedResources منابعی را پیدا میکند که در XML اعلام شده اما در کد استفاده نشدهاند. ViewHolder بررسی میکند که در آداپتورهای RecyclerView از الگوی ViewHolder استفاده شده است. DrawAllocation درباره ایجاد اشیاء در متد onDraw هشدار میدهد. رفع این مشکلات اندازه APK را کاهش داده و سرعت برنامه را افزایش میدهد.
قوانین Security برای برنامههای منتشر شده اجباری هستند. 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 از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.