چرا فایل های APK باید امضا شوند؟
هر برنامه Androidی قبل از نصب باید امضای دیجیتالی داشته باشد. امضا چندین هدف را دنبال می کند:
- هویت توسعهدهنده برنامه را تأیید میکند
- اطمینان حاصل می کند که APK دستکاری نشده است
- به Android اجازه میدهد بهروزرسانیهای برنامه را با نسخه اصلی مطابقت دهد
- برای نصب در تمام دستگاه های Androidی مورد نیاز است
ابزار دسکتاپ مورد نیاز است
امضای APK به ابزارهای خط فرمان (JDK / Android SDK) نیاز دارد. این کار را نمی توان در مرورگر وب انجام داد. برای امضای فایلهای APK در رایانه خود، راهنمای زیر را دنبال کنید.
روش 1: با apksigner امضا کنید (توصیه می شود)
apksigner ابزار رسمی امضای APK گوگل است که در Android SDK Build Tools گنجانده شده است.
مرحله 1: یک Keystore ایجاد کنید
keytool -genkey -v -keystore my-release-key.jks \
-keyalg RSA -keysize 2048 -validity 10000 \
-alias my-key-alias
مرحله 2: APK را امضا کنید
apksigner sign --ks my-release-key.jks \
--ks-key-alias my-key-alias \
--out signed-app.apk unsigned-app.apk
مرحله 3: تأیید امضا
apksigner verify --verbose signed-app.apk
روش 2: امضا با jarsigner (میراث)
# Sign
jarsigner -verbose -sigalg SHA256withRSA \
-digestalg SHA-256 \
-keystore my-release-key.jks \
app-unsigned.apk my-key-alias
# Verify
jarsigner -verify -verbose app-signed.apk
مرحله 4: Zipalign (مهم!)
پس از امضا، APK را با zipalign بهینه کنید:
zipalign -v 4 signed-app.apk aligned-app.apk
امضای اشکال زدایی (برای آزمایش)
برای اهداف آزمایشی، میتوانید از فروشگاه کلیدهای پیشفرض دیباگ Android استفاده کنید:
# Location of debug keystore:
# Linux/Mac: ~/.android/debug.keystore
# Windows: C:\Users\{USERNAME}\.android\debug.keystore
# Sign with debug key
apksigner sign --ks ~/.android/debug.keystore \
--ks-key-alias androiddebugkey \
--ks-pass pass:android \
app.apk
مقایسه ابزار امضا
| معیار | apksigner | jarsigner |
|---|---|---|
| امضای V1 | ||
| امضای V2 | ||
| امضای V3 | ||
| توصیه می شود | میراث |
APK Signer - سوالات متداول
سوالات متداول درباره امضای APK، ذخیرهسازی کلیدها و امضای کد Android
چرا ترتیب تراز (zipalign قبل از apksigner) در Android 11-15 مهم است
یکی از متداولترین اشتباهاتی که توسعهدهندگان و اصلاحکنندگان هنگام امضای یک APK اصلاحشده یا ادغامشده مرتکب میشوند، اجرای zipalign بعد از امضای بسته یا استفاده از ابزار قدیمی جاوا jarsigner بهجای Android SDK apksigner است. از آنجا که APK Signature Scheme v2 و v3 یک هش رمزنگاری را روی کل طرح بندی باینری بایگانی ZIP محاسبه می کند، تغییر افست بایت با zipalign پس از امضا بلافاصله بلوک امضای v2/v3 را باطل می کند.
PackageManager که با Android 11 (سطح API 30) شروع میشود و دقیقاً در Android 14 و 15 اجرا میشود، به دو شرط غیرقابل مذاکره برای هر APK که سطوح SDK مدرن را هدف قرار میدهد، نیاز دارد:
- تراز 4 بایتی فشرده نشده resources.arsc: جدول منابع کامپایل شده (resources.arsc) باید فشرده نشده (STORED) ذخیره شود و در یک مرز 4 بایتی تراز شود تا Android بتواند مستقیماً بدون کپی کردن آن در RAM، آن را نقشه حافظه (mmap) کند. همیشه امضای zipalign -p -f -v 4 input.apk aligned.apk قبل از را اجرا کنید.
- بلوک امضای اجباری v2+: امضای APK با هدف قرار دادن API 30+ با jarsigner (که فقط یک امضای v1 META-INF/ مینویسد) باعث میشود Android 11–15 نصب با INSTALL_PARSE_FAILED_NO_CERTIFICATES را رد کند. از مولد فرمان تعاملی بالا برای ساختن دستور دقیق apksigner --v2-signing-enabled=true برای فروشگاه کلید خود استفاده کنید یا خروجی امضا شده خود را در تأیید کننده امضای APK ما تأیید کنید.