Android 验证APK签名对比
最近OTT制定产品,其中有一条需求是只能安装自己公司签名的APK,所以在网上找了相关资料,最后总结功能实现如下:
1、签名错误码
frameworks/base/core/java/android/content/pm/PackageManager.java
public static final int INSTALL_FAILED_VERSION_DOWNGRADE = -25;
//添加签名错误码
public static final int INSTALL_FAILED_INVALID_SIGNATURES = -26;
2、对比签名
frameworks/base/services/java/com/android/server/pm/PackageManagerService.java
// 安装标识,区别打开APK和安装APK
private boolean mIsInstallApkFlag = false;
private void installPackageLI(InstallArgs args,
boolean newInstall, PackageInstalledInfo res) {
...
Log.i(TAG, "Start installation for package: " + pkg.packageName);
//add start 设置安装标识
mIsInstallApkFlag = true;
//add end
if (replace) {
replacePackageLI(pkg, parseFlags, scanMode, args.user,
installerPackageName, res);
} else {
installNewPackageLI(pkg, parseFlags, scanMode, args.user,
installerPackageName, res);
}
Log.i(TAG, "Installation done for package: " + pkg.packageName);
...
}
private PackageParser.Package scanPackageLI(PackageParser.Package pkg,
int parseFlags, int scanMode, long currentTime, UserHandle user) {
...
if (!verifySignaturesLP(pkgSetting, pkg)) {
...
}
//add start 添加校验判断
// is xhw signatures
Signature[] xhwSignatures = getXWHSignatures(mContext,"com.ronbell.ott.setting");
if (xhwSignatures != null) {
if (compareSignatures(xhwSignatures, pkg.mSignatures) != PackageManager.SIGNATURE_MATCH) {
mLastScanError = PackageManager.INSTALL_FAILED_INVALID_SIGNATURES;
return null;
}
}
//add end
// Verify that this new package doesn't have any content providers
// that conflict with existing packages. Only do this if the
// package isn't already installed, since we don't want to break
// things that are installed.
if ((scanMode&SCAN_NEW_INSTALL) != 0) {
...
}
//add methods 添加获取安装签名
private Signature[] getXWHSignatures(Context context, String packName){
if(!isSignature) return null; // 判断只有在安装的时候才起作用。
isSignature = false;
PackageManager pm = context.getPackageManager();
List<PackageInfo> apps = pm.getInstalledPackages(PackageManager.GET_SIGNATURES);
Iterator<PackageInfo> it = apps.iterator();
while(it.hasNext()){
PackageInfo info = it.next();
if(info.packageName.equals(packName)){
return info.signatures;
}
}
return null;
}
private boolean IsSignaturesSame(Signature[] s1, Signature[] s2) {
if(s1 == null || s2 == null ) {
return false ;
}
HashSet < Signature > set1 = new HashSet < Signature > ();
for (Signature sig : s1) {
set1.add(sig);
}
HashSet < Signature > set2 = new HashSet < Signature > ();
for (Signature sig : s2) {
set2.add(sig);
}
// Make sure s2 contains all signatures in s1.
if (set1.equals(set2)) {
return true ;
}
return false ;
}
//add end
3、安装失败提示
packages/apps/PackageInstaller/src/com/android/packageinstaller/InstallAppProgress.java
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
...
//add start
} else if (msg.arg1 == PackageManager.INSTALL_FAILED_INVALID_SIGNATURES){
// Generic error handling for all other error codes.
centerTextDrawable.setLevel(1);
centerExplanationLabel = getExplanationFromErrorCode(msg.arg1);
centerTextLabel = R.string.install_failed_invalid_signature;
mLaunchButton.setVisibility(View.INVISIBLE);
} else {
// Generic error handling for all other error codes.
centerTextDrawable.setLevel(1);
centerExplanationLabel = getExplanationFromErrorCode(msg.arg1);
centerTextLabel = R.string.install_failed;
mLaunchButton.setVisibility(View.INVISIBLE);
}
...
Android 验证APK签名对比的更多相关文章
- Android - 视图Android应用(apk)签名
视图Android应用(apk)签名 本文地址: http://blog.csdn.net/caroline_wendy 在微博.微信开放平台注冊应用时,须要填写应用(apk)的签名,能够使用keyt ...
- Android 查看Apk签名方式V1和V2
Android 查看Apk签名方式V1和V2 java -jar apksigner.jar verify -v my.apk -- Verifies Verified using v1 scheme ...
- Android 验证APK是否已经签名或是否是Debug签名
https://source.android.google.cn/ http://www.android-doc.com/tools/publishing/app-signing.html Signi ...
- Android中APK签名工具之jarsigner和apksigner详解
一.工具介绍 jarsigner是JDK提供的针对jar包签名的通用工具, 位于JDK/bin/jarsigner.exe apksigner是Google官方提供的针对Android apk签名及验 ...
- Android 发布Apk签名
1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本 ...
- android获取apk签名信息
因为工作需要,需要获取应用的apk传递给新浪微博或者微信去申请授权 所以需要程序内获取签名上传服务器 做法如下: public static String getAPPSecretString(A ...
- 验证apk签名方式(V1 || V2)
进入SDK\build-tools\28.0.2目录(或者其他版本),该目录有apksigner.bar脚本,我们可以利用它来验证. 在此目录打开命令行. 命令为:apksigner verify - ...
- 关于APK签名的一些东西
什么是APK 了解APK签名之前,首先要知道什么是apk文件:APK是AndroidPackage的缩写,即Android安装包(apk),APK文件其实就是zip格式的文件,只是后缀被改为了apk, ...
- Android : apk签名的多种方法以及key的配置
方法一:使用Android SDK中的签名工具给apk签名: (1)Android源码的 build/target/product/security/ 目录下有 media.pk8.media.x50 ...
随机推荐
- Android注册时验证码的生产方法
今天主要是学习了注册时 的验证码的使用. 1.创建了验证码的生成类. 2.通过此生成类,与imageview相互联系起来,实现验证码显示.并添加点击事件,实现验证码的切换. 代码是现成的代码块可以套用 ...
- PHP0008:PHP基础-数组
- STL-string用法
#include <string> #include <iostream> #include <cstring> #include <algorithm> ...
- List和DataTable互转
/// <summary> /// List和DataTable互转 /// </summary> static class ListUtility { /// <sum ...
- C# 调用APlayer教程
APlayer介绍 引擎介绍: APlayer 媒体播放引擎是迅雷公司从 年开始开发的通用音视频媒体文件播放内核. 迅雷看看播放器和迅雷影音就是使用 APlayer 作为播放内核,目前迅雷看看播放器在 ...
- 5.Docker Compose 部署 Harbor
什么是 Harbor Harbor 是一个用于存储和分发 Docker 镜像的企业级 Registry 服务器,通过添加一些企业必需的功能特性,例如安全.标识和管理等,扩展了开源 Docker Dis ...
- 0级搭建类006-Oracle Solaris 安装 (10.13) 公开
项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...
- Windows Live Writer 2012 安装配置
Windows Live Writer 2012用起来比较舒服,可以直接编辑 在线博客文章 下载地址 http://g.live.com/1rewlive5-all/zh-cn/wlsetup-all ...
- C# LINQ学习笔记五:LINQ to XML
本笔记摘抄自:https://www.cnblogs.com/yaozhenfa/p/CSharp_Linq_For_Xml.html,记录一下学习过程以备后续查用. 一.生成xml 1.1创建简单的 ...
- 使用Beautiful Soup爬取猫眼TOP100的电影信息
使用Beautiful Soup爬取猫眼TOP100的电影信息,将排名.图片.电影名称.演员.时间.评分等信息,提取的结果以文件形式保存下来. import time import json impo ...