APK 서명 서명을 얻는 방법은 무엇입니까?
APK에 서명하는 데 사용 된 키의 서명을 검색하는 방법이 있습니까? 내 키 저장소의 키로 APK에 서명했습니다. 프로그래밍 방식으로 검색하려면 어떻게해야합니까?
PackageManager 클래스 http://developer.android.com/reference/android/content/pm/PackageManager.html을 사용하여 이와 같은 APK의 서명 서명에 액세스 할 수 있습니다.
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];
둘째 : 비교할 releaseApk hashCode를 가져옵니다. 제 경우에는 서버에서이 apk를 다운로드하여 sd_card에 넣었습니다.
Signature releaseSig = context.getPackageManager().getPackageArchiveInfo("/mnt/sdcard/myReleaseApk.apk", PackageManager.GET_SIGNATURES).signatures[0];
마지막으로 hashCode를 비교합니다.
return sig.hashCode() == releaseSig.hashCode;
위의 코드를 시도했지만 정상적으로 작동합니다. hashCode가 다른 경우 이전 apk를 제거 하거나 시스템 앱이고 기기가 루팅 된 경우 런타임을 사용하여 제거 하고 새 서명 apk를 설치할 수 있습니다.
참고URL : https://stackoverflow.com/questions/5578871/how-to-get-apk-signing-signature
'Program Tip' 카테고리의 다른 글
Ruby에서 문자열과 기호의 차이점은 무엇입니까? (0) | 2020.12.08 |
---|---|
온 전성 테스트 / 검사 란? (0) | 2020.12.08 |
Entity Framework 및 MongoDb (0) | 2020.12.08 |
D의 문법은 정말 문맥이없는가요? (0) | 2020.12.08 |
Symfony2-Assetic-CSS에서 이미지로드 (0) | 2020.12.08 |