本文整理匯總了Java中android.content.pm.PackageManager.GET_SIGNATURES屬性的典型用法代碼示例。如果您正苦於以下問題:Java PackageManager.GET_SIGNATURES屬性的具體用法?Java PackageManager.GET_SIGNATURES怎麽用?Java PackageManager.GET_SIGNATURES使用的例子?那麽, 這裏精選的屬性代碼示例或許可以為您提供幫助。您也可以進一步了解該屬性所在類android.content.pm.PackageManager
的用法示例。
在下文中一共展示了PackageManager.GET_SIGNATURES屬性的5個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Java代碼示例。
示例1: getSigningKeyCertificate
/**
* Gets the encoded representation of the first signing certificated used to sign current APK
*
* @param ctx
* @return
*/
private static byte[] getSigningKeyCertificate(Context ctx) {
try {
PackageManager pm = ctx.getPackageManager();
String packageName = ctx.getPackageName();
int flags = PackageManager.GET_SIGNATURES;
PackageInfo packageInfo = pm.getPackageInfo(packageName, flags);
Signature[] signatures = packageInfo.signatures;
if (signatures != null && signatures.length >= 1) {
//takes just the first signature, TODO: handle multi signed apks
byte[] cert = signatures[0].toByteArray();
InputStream input = new ByteArrayInputStream(cert);
CertificateFactory cf = CertificateFactory.getInstance("X509");
X509Certificate c = (X509Certificate) cf.generateCertificate(input);
return c.getEncoded();
}
} catch (Exception e) {
Log.w(TAG, e);
}
return null;
}
示例2: getPackageInfo
@Override
public PackageInfo getPackageInfo(String packageName, int flags) throws RemoteException {
waitForReadyInner();
try {
String pkg = getAndCheckCallingPkg(packageName);
if (pkg != null && !TextUtils.equals(packageName, mContext.getPackageName())) {
enforcePluginFileExists();
PluginPackageParser parser = mPluginCache.get(pkg);
if (parser != null) {
PackageInfo packageInfo = parser.getPackageInfo(flags);
if (packageInfo != null && (flags & PackageManager.GET_SIGNATURES) != 0 && packageInfo.signatures == null) {
packageInfo.signatures = mSignatureCache.get(packageName);
}
return packageInfo;
}
}
} catch (Exception e) {
handleException(e);
}
return null;
}
示例3: getPackageInfo
@Override
public PackageInfo getPackageInfo(String packageName, int flags, int userId) {
synchronized (mPackages) {
PackageParser.Package pkg = mPackages.get(packageName);
if (pkg != null) {
AppSetting setting = (AppSetting) pkg.mExtras;
if ((flags & PackageManager.GET_SIGNATURES) != 0 && pkg.mSignatures == null) {
if (pkg.mAppMetaData != null && pkg.mAppMetaData.containsKey(Constants.FEATURE_FAKE_SIGNATURE)) {
String sig = pkg.mAppMetaData.getString("fake-signature");
if (sig != null) {
pkg.mSignatures = new Signature[] {new Signature(sig)};
}
} else {
PackageParserCompat.collectCertificates(setting.parser, pkg, PackageParser.PARSE_IS_SYSTEM);
}
}
PackageInfo packageInfo = PackageParserCompat.generatePackageInfo(pkg, flags,
getFirstInstallTime(pkg), getLastInstallTime(pkg));
if (packageInfo != null) {
ComponentFixer.fixApplicationInfo(setting, packageInfo.applicationInfo, userId);
return packageInfo;
}
}
}
return null;
}
示例4: getPackageArchiveInfo
/**
* 獲取PackageInfo對象
* 該方法解決了Android 2.x環境不能獲取簽名的係統問題,故可以“全麵使用”
*/
public static PackageInfo getPackageArchiveInfo(PackageManager pm, String pkgFilePath, int flags) {
PackageInfo info = null;
try {
info = pm.getPackageArchiveInfo(pkgFilePath, flags);
} catch (Throwable e) {
if (LogDebug.LOG) {
e.printStackTrace();
}
}
if (info == null) {
return null;
}
// Android 2.x的係統通過常規手段(pm.getPackageArchiveInfo)時會返回null,隻能通過底層實現
// 判斷依據:1、想要簽名;2、沒拿到簽名;3、Android 4.0以前
if ((flags & PackageManager.GET_SIGNATURES) != 0) {
if (info.signatures == null) {
if (Build.VERSION.SDK_INT < 14) {
info.signatures = getPackageArchiveSignaturesInfoAndroid2x(pkgFilePath);
}
}
}
return info;
}
示例5: installLocked
private PluginInfo installLocked(String path) {
final boolean verifySignEnable = RePlugin.getConfig().getVerifySign();
final int flags = verifySignEnable ? PackageManager.GET_META_DATA | PackageManager.GET_SIGNATURES : PackageManager.GET_META_DATA;
// 1. 讀取APK內容
PackageInfo pi = mContext.getPackageManager().getPackageArchiveInfo(path, flags);
if (pi == null) {
if (LogDebug.LOG) {
LogDebug.e(TAG, "installLocked: Not a valid apk. path=" + path);
}
RePlugin.getConfig().getEventCallbacks().onInstallPluginFailed(path, RePluginEventCallbacks.InstallResult.READ_PKG_INFO_FAIL);
return null;
}
// 2. 校驗插件簽名
if (verifySignEnable) {
if (!verifySignature(pi, path)) {
return null;
}
}
// 3. 解析出名字和三元組
PluginInfo instPli = PluginInfo.parseFromPackageInfo(pi, path);
if (LogDebug.LOG) {
LogDebug.i(TAG, "installLocked: Info=" + instPli);
}
instPli.setType(PluginInfo.TYPE_NOT_INSTALL);
// 若要安裝的插件版本小於或等於當前版本,則安裝失敗
// NOTE 絕大多數情況下,應該在調用RePlugin.install方法前,根據雲端回傳的信息來判斷,以防止下載舊插件,浪費流量
// NOTE 這裏僅做雙保險,或通過特殊渠道安裝時會有用
// 注意:這裏必須用“非Clone過的”PluginInfo,因為要修改裏麵的內容
PluginInfo curPli = RePluginOS.getPlugin(instPli.getName(), false);
if (curPli != null) {
if (LogDebug.LOG) {
LogDebug.i(TAG, "installLocked: Has installed plugin. current=" + curPli);
}
// 版本較老?直接返回
final int checkResult = checkVersion(instPli, curPli);
if (checkResult < 0) {
RePlugin.getConfig().getEventCallbacks().onInstallPluginFailed(path, RePluginEventCallbacks.InstallResult.VERIFY_VER_FAIL);
return null;
} else if (checkResult == 0){
instPli.setIsPendingCover(true);
}
}
// 4. 將合法的APK改名後,移動(或複製,見RePluginConfig.isMoveFileWhenInstalling)到新位置
// 注意:不能和p-n的最終釋放位置相同,因為管理方式不一樣
if (!copyOrMoveApk(path, instPli)) {
RePlugin.getConfig().getEventCallbacks().onInstallPluginFailed(path, RePluginEventCallbacks.InstallResult.COPY_APK_FAIL);
return null;
}
// 5. 從插件中釋放 So 文件
PluginNativeLibsHelper.install(instPli.getPath(), instPli.getNativeLibsDir());
// 6. 若已經安裝舊版本插件,則嘗試更新插件信息,否則直接加入到列表中
if (curPli != null) {
updateOrLater(curPli, instPli);
} else {
mList.add(instPli);
}
// 7. 保存插件信息到文件中,下次可直接使用
mList.save(mContext);
return instPli;
}