Intereting Posts
DrawableCompat.setTint (drawable, color) vs Drawable.setColorFilter (цвет, режим) Какие методы жизненного цикла фрагментов Android требуют супер Как установить значок Layer Layout в правой части экрана устройства? Open failed: EBUSY (занятое устройство или ресурс) Зависимости -> Не удалось создать плагин типа «AppPlugin» Как запросить новые приложения для Android Calendar App? Java.lang.RuntimeException: Parcelable столкнулся с IOException, записывающий сериализуемый объект в Android, передающий объект ArrayList Как создать динамическую модель лица пользователя в Android? Фоновый рисунок Android в XML-файле Могу ли я создать довольно родное приложение на C ++ с Android? Вычислить потребляемую мощность Android-датчика Формат в файле строковых ресурсов Android: управление несколькими push-уведомлениями в устройстве приложения Как нарисовать график в Android, например, приложение Wifi Analyzer? Android, как размыть / стек / заморозить текущую активность

Как получить подпись подписи APK?

Есть ли способ получить подпись ключа, используемого для подписи APK? Я подписал свой APK с моим ключом из своего хранилища ключей. Как я могу получить его программным путем?

Solutions Collecting From Web of "Как получить подпись подписи APK?"

Вы можете получить доступ к подписью подписи APK, как это, используя класс PackageManager http://developer.android.com/reference/android/content/pm/PackageManager.html

Signature[] sigs = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures; for (Signature sig : sigs) { Trace.i("MyApp", "Signature hashcode : " + sig.hashCode()); } 

Я использовал это для сравнения с хэш-кодом для моего отладочного ключа, чтобы определить, является ли APK отладчиком APK или APK выпуска.

Менеджер пакетов предоставит вам сертификат подписи для любого установленного пакета. Затем вы можете распечатать детали ключа подписи, например

 final PackageManager packageManager = context.getPackageManager(); final List<PackageInfo> packageList = packageManager.getInstalledPackages(PackageManager.GET_SIGNATURES); for (PackageInfo p : packageList) { final String strName = p.applicationInfo.loadLabel(packageManager).toString(); final String strVendor = p.packageName; sb.append("<br>" + strName + " / " + strVendor + "<br>"); final Signature[] arrSignatures = p.signatures; for (final Signature sig : arrSignatures) { /* * Get the X.509 certificate. */ final byte[] rawCert = sig.toByteArray(); InputStream certStream = new ByteArrayInputStream(rawCert); try { CertificateFactory certFactory = CertificateFactory.getInstance("X509"); X509Certificate x509Cert = (X509Certificate) certFactory.generateCertificate(certStream); sb.append("Certificate subject: " + x509Cert.getSubjectDN() + "<br>"); sb.append("Certificate issuer: " + x509Cert.getIssuerDN() + "<br>"); sb.append("Certificate serial number: " + x509Cert.getSerialNumber() + "<br>"); sb.append("<br>"); } catch (CertificateException e) { // e.printStackTrace(); } } } 

Моя ситуация в том, что у меня есть предварительно установленный apk, который использует неправильный магазин ключей. Поэтому прямое установление приведет к сбою из-за несогласованной подписи. Мне нужно сначала проверить подпись, чтобы убедиться, что она может быть установлена ​​плавно.

Вот мое решение .

Как говорится в этом коде , вы можете получить подпись из установленного apk.

Детали:

 Signature sig = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures[0]; 

Во-вторых: сравните hashCode releaseApk. В моем случае я скачал этот apk с моего сервера и поместил его в sd_card.

 Signature releaseSig = context.getPackageManager().getPackageAchiveInfo("/mnt/sdcard/myReleaseApk.apk", PackageManager.GET_SIGNATURES).signatures[0]; 

Наконец, сравните хэш-код.

 return sig.hashCode() == releaseSig.hashCode; 

Я пробовал код выше, он работает нормально. Если hashCode отличается, вы должны просто удалить старый apk или если это системное приложение, и устройство внедрено, вы можете просто использовать runtime для его удаления , а затем установить новую подпись apk.