1. 程式人生 > >android獲取APK檔案,及應用內部簽名信息方法

android獲取APK檔案,及應用內部簽名信息方法

1.獲取APK的簽名信息

private String showUninstallAPKSignatures(String apkPath) { 
         String PATH_PackageParser = "android.content.pm.PackageParser"; 
         try { 
             // apk包的檔案路徑 
             // 這是一個Package 直譯器, 是隱藏的 
             // 建構函式的引數只有一個, apk檔案的路徑 
             // PackageParser packageParser = new PackageParser(apkPath); 
             Class pkgParserCls = Class.forName(PATH_PackageParser); 
             Class[] typeArgs = new Class[1]; 
             typeArgs[0] = String.class; 
             Constructor pkgParserCt = pkgParserCls.getConstructor(typeArgs); 
             Object[] valueArgs = new Object[1]; 
             valueArgs[0] = apkPath; 
             Object pkgParser = pkgParserCt.newInstance(valueArgs); 
             MediaApplication.logD(DownloadApk.class, "pkgParser:" + pkgParser.toString()); 
             // 這個是與顯示有關的, 裡面涉及到一些畫素顯示等等, 我們使用預設的情況 
             DisplayMetrics metrics = new DisplayMetrics(); 
             metrics.setToDefaults(); 
             // PackageParser.Package mPkgInfo = packageParser.parsePackage(new 
             // File(apkPath), apkPath, 
             // metrics, 0); 
             typeArgs = new Class[4]; 
             typeArgs[0] = File.class; 
             typeArgs[1] = String.class; 
             typeArgs[2] = DisplayMetrics.class; 
             typeArgs[3] = Integer.TYPE; 
             Method pkgParser_parsePackageMtd = pkgParserCls.getDeclaredMethod("parsePackage", 
                     typeArgs); 
             valueArgs = new Object[4]; 
             valueArgs[0] = new File(apkPath); 
             valueArgs[1] = apkPath; 
             valueArgs[2] = metrics; 
             valueArgs[3] = PackageManager.GET_SIGNATURES; 
             Object pkgParserPkg = pkgParser_parsePackageMtd.invoke(pkgParser, valueArgs); 
             
             typeArgs = new Class[2]; 
             typeArgs[0] = pkgParserPkg.getClass(); 
             typeArgs[1] = Integer.TYPE; 
             Method pkgParser_collectCertificatesMtd = pkgParserCls.getDeclaredMethod("collectCertificates", 
                     typeArgs); 
             valueArgs = new Object[2]; 
             valueArgs[0] = pkgParserPkg; 
             valueArgs[1] = PackageManager.GET_SIGNATURES; 
             pkgParser_collectCertificatesMtd.invoke(pkgParser, valueArgs); 
             // 應用程式資訊包, 這個公開的, 不過有些函式, 變數沒公開 
             Field packageInfoFld = pkgParserPkg.getClass().getDeclaredField("mSignatures"); 
             Signature[] info = (Signature[]) packageInfoFld.get(pkgParserPkg); 
             MediaApplication.logD(DownloadApk.class, "size:"+info.length); 
             MediaApplication.logD(DownloadApk.class, info[0].toCharsString()); 
             return info[0].toCharsString(); 
         } catch (Exception e) { 
             e.printStackTrace(); 
         } 
         return null; 
     }


獲取程式自身的簽名:

 private String getSign(Context context) { 
    PackageManager pm = context.getPackageManager(); 
    List<PackageInfo> apps = pm.getInstalledPackages(PackageManager.GET_SIGNATURES); 
    Iterator<PackageInfo> iter = apps.iterator(); 
    while(iter.hasNext()) { 
         PackageInfo packageinfo = iter.next(); 
         String packageName = packageinfo.packageName; 
         if (packageName.equals(instance.getPackageName())) { 
            MediaApplication.logD(DownloadApk.class, packageinfo.signatures[0].toCharsString()); 
            return packageinfo.signatures[0].toCharsString(); 
         } 
 } 
    return null; 
} 

對比2個方法的返回值來判斷APK升級包的簽名是否一致,一致就提示可以安裝。

2.獲取指定已安裝完整簽名信息,包括MD5指紋:

public void getSingInfo() {
	try {
		PackageInfo packageInfo = getPackageManager().getPackageInfo("com.sina,weibo", PackageManager.GET_SIGNATURES);
		Signature[] signs = packageInfo.signatures;
		Signature sign = signs[0];
		parseSignature(sign.toByteArray());
	} catch (Exception e) {
		e.printStackTrace();
	}
}
public void parseSignature(byte[] signature) {
	try {
		CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
		X509Certificate cert = (X509Certificate) certFactory.generateCertificate(new ByteArrayInputStream(signature));
		String pubKey = cert.getPublicKey().toString();
		String signNumber = cert.getSerialNumber().toString();
		System.out.println("signName:" + cert.getSigAlgName());
		System.out.println("pubKey:" + pubKey);
		System.out.println("signNumber:" + signNumber);
		System.out.println("subjectDN:"+cert.getSubjectDN().toString());
	} catch (CertificateException e) {
		e.printStackTrace();
	}
}

3.如何檢視指定證書的指紋
D:>keytool  -list -alias 在匯出時程式的別名(-alias 這個命令,好像不用也行,沒有試,反正我一直都在使用) -keystore  tangshan.keystore(匯出時使用的證書名稱) -storepass 123456-keypass 123456

出的結果為:

在匯出時程式的別名, 2011-7-29, PrivateKeyEntry,

認證指紋 (MD5): 90:13:AF:46:0A:DC:5C:6C:77:0E:AA:AF:DA:8A:AB:72

相關推薦

android獲取APK檔案應用內部簽名方法

1.獲取APK的簽名信息 private String showUninstallAPKSignatures(String apkPath) { String PATH_PackageParser = "android.content.pm.PackageParser";

關於nginx獲取真實ipproxy_set_head設置頭部的理解

代理模塊 真是ip 代理模塊 真是ip代理模塊 真是ip代理 $proxy_add_x_forwarded_for $http_x_forwarded_for這兩個的變量的值的區別,就在於,proxy_add_x_forwarded_for 比http_x_forwarded_for 多了一個$rem

Android獲取本地檔案的真實路徑content型別轉為file型別

來源網路。記錄知識點以防備用..... 相容不同的機型獲取到的檔案路徑型別,以防異常情況發生。 public static String getPath(Context context, Uri uri) { if ("content".equalsIgnoreCase(uri.ge

反編譯apk檔案獲取strings.xml檔案的內容——使用apktool反編譯

現在通過AXMLPrinter2.jar獲取AndroidManifest.xml內容時,發現有些值是放在strings.xml中,而strings.xml檔案是被打包在resources.arsc檔案裡面,在網上找了下,說是用arsceditor進行編輯,但是我下載了個arsceditor時(下載地址:ht

android原始碼下加入替換鈴聲檔案設定預設鈴聲

系統鈴聲檔案的路徑在frameworks/base/data/sounds資料夾 有四個主要資料夾alarms ,notifications,ringtones,effects,分別對應系統的鬧鐘鈴聲,通知鈴聲,來電鈴聲,音效 如果需要新增鈴聲檔案,只需把鈴聲放入對應的資料

android獲取目錄檔案values/arrays.xml資料的方法簡易快捷

在Android中,用string-array是一種簡單的提取XML資原始檔資料的方法。 例: 把相應的資料放到values/arrays.xml檔案裡 <?xml version="1.0" encoding="utf-8"?> <r

JAVA WEB 獲取properties檔案存放路徑 獲取路徑

  首先明白,ClassPath : 指的是:WEB-INF\classes這個目錄下,通常把檔案放在src資料夾下,或者新建檔案並且新增到build path即可。IDE在同步檔案到tomcat時會自動將檔案放在classes下。   獲取properties的程式碼:

Android scrollTo() scrollBy() Scroller解說應用

render 設置 pop generate gnu 結束 last androi nds 版本號:1.0 日期:2014.6.17 2014.6.18版權:? 2014 kince 轉載註明出處 scrollTo() 、scrollBy()及 Scroller在視圖

JavaScript中的label語句應用

sta 添加 con col 使用 int nbsp 位置 javascrip label語句:可以在代碼中添加標簽,以便將來使用。   語法:label : statement   示例: start: for(var i=0;i<10;i++){ c

PHP -- 遍歷出目錄下所有檔案演算法優化

在想解決這個問題的時候,我也查找了很多資料。推薦給大家我個人覺得比較好的一篇:PHP遍歷檔案目錄 文中第四個演算法可以遍歷出文件夾下的所有檔案,程式碼如下: $dir = 'E:\phpStudy\PHPTutorial\WWW'; echo '<pre>'; functio

Android逆向 APK檔案組成

  一 瞭解APK檔案   我們知道Android系統能執行的程式是.apk檔案格式,其實它就是一個壓縮包而已,把.apk修改成.zip,然後解壓就可以得到該apk內部的檔案結構。 PS: 既然可以把apk檔案改成zip解壓,能不能再把這些檔案壓縮成zip格式,再修改成apk檔案安裝到手機裡呢

全部博文集錦第三期CHM檔案十三個經典演算法研究PDF文件

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android 獲取Mac地址相容6.0以下和6.0以上

import android.content.Context; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Build; import android.text.Te

Android Studio建立檔案自動生成類頭

設定路徑:file->settings->Editor->File and Code Templates 1.選擇Includes欄目,把File Header裡面studio自動生成的模板刪掉,新增下面的模板。 /** * @ClassName ${NAME

列出指定目錄下所有副檔名為.txt的檔案出現的問題

/*7.列出指定目錄下所有副檔名為.txt的檔案*/ /* System.out.println(file.isDirectory());當file是一個沒有後綴的檔案時,這裡會輸出false

AndroidAPK安裝過程原理解析

應用安裝是智慧機的主要特點,即使用者可以把各種應用(如遊戲等)安裝到手機上,並可以對其進行解除安裝等管理操作。APK是Android Package的縮寫,即Android安裝包。APK是類似Symbian Sis或Sisx的檔案格式。通過將APK檔案直接傳到Android模擬器或Android手機中執行即可

Android開發獲取GPS位置包含apn\wifi\gps 幾種方法

1.gps定位: 優點:最簡單的手機定位方式當然是通過GPS模組(現在大部分的智慧機應該都有了)。GPS方式準確度是最高的 缺點1.比較耗電;        2.絕大部分使用者預設不開啟GPS模組;        3.從GPS模組啟動到獲取第一次定位資料,可能需要比較長的時間;        4.室內幾乎

Android 匯出CSV檔案解決中文亂碼問題

亂碼,無非就是編碼對不上的問題,只要編碼一樣那就沒問題,使用了Okio,直接上程式碼: try { //寫入檔案 String data = stringB

使用JDK生成android-apk證書以及給未簽名apk簽名

讓我們使用JDK中的命令列工具生成私有jks證書 keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048

Android 獲取所有Activity這裡演示了使用者按兩次back鍵退出app

@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { exit();