Android 获取应用签名

Android 获取应用签名

本文主要讲下在android中如何获取应用签名. 也方便平时用来区分一个应用是不是原包应用.

1: 通过PackageManager获取签名信息

首先,通过packageManager获取到指定应用的PackageInfo. 这里需要传入的flag是PackageManager.GET_SIGNATURES

/*** {@link PackageInfo} flag: return information about the* signatures included in the package.** @deprecated use {@code GET_SIGNING_CERTIFICATES} instead*/
@Deprecated
public static final int GET_SIGNATURES          = 0x00000040;
PackageManager pm = getPackageManager();
List<ApplicationInfo> applications = pm.getInstalledApplications(PackageManager.GET_META_DATA);
for (ApplicationInfo applicationInfo : applications) {try {PackageInfo packageInfo = packageManager.getPackageInfo(applicationInfo.packageName, PackageManager.GET_SIGNATURES);Signature[] signs = packageInfo.signatures;} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}
}

2: 获取SHA1

public class ShaUtils {public static String getSHA1(byte[] sig) {final char[] hexArray = "0123456789ABCDEF".toCharArray();try {MessageDigest md = MessageDigest.getInstance("SHA1");byte[] digest = md.digest(sig);char[] hexChars = new char[digest.length * 2];for (int j = 0; j < digest.length; j++) {int v = digest[j] & 0xFF;hexChars[j * 2] = hexArray[v >>> 4];hexChars[j * 2 + 1] = hexArray[v & 0x0F];}return new String(hexChars);} catch (Throwable e) {e.printStackTrace();}return "";}}

下面是整理的一个小demo,展示当前设备的应用列表以及应用签名,包名,icon信息.

创建mainacitity

public class MainActivity extends AppCompatActivity {private GridView gridView;private ApkAdapter apkAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);gridView = findViewById(R.id.grid_sign);PackageManager packageManager = getPackageManager();List<ApplicationInfo> installedApplications = packageManager.getInstalledApplications(PackageManager.GET_META_DATA);apkAdapter = new ApkAdapter(installedApplications, this);gridView.setAdapter(apkAdapter);}}

acitivity布局如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><GridViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:numColumns="1"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"android:id="@+id/grid_sign"/>
</androidx.constraintlayout.widget.ConstraintLayout>

ApkAdapter代码如下:

public class ApkAdapter extends BaseAdapter {private List<ApplicationInfo> list;private Context context;private PackageManager packageManager;public ApkAdapter(List<ApplicationInfo> list, Context context) {this.list = list;this.context = context;packageManager = context.getPackageManager();}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View view, ViewGroup parent) {if (view == null) {view = LayoutInflater.from(context).inflate(R.layout.item_apk, parent, false);}ApplicationInfo applicationInfo = list.get(position);ImageView icon = (ImageView) view.findViewById(R.id.item_icon);icon.setImageDrawable(applicationInfo.loadIcon(packageManager));TextView label = (TextView) view.findViewById(R.id.item_name);label.setText(applicationInfo.packageName);TextView sign = (TextView) view.findViewById(R.id.item_sign);StringBuilder stringBuilder = new StringBuilder();try {PackageInfo packageInfo = packageManager.getPackageInfo(applicationInfo.packageName, PackageManager.GET_SIGNATURES);Signature[] signs = packageInfo.signatures;for (Signature sig : signs) {String sha1 = ShaUtils.getSHA1(sig.toByteArray());stringBuilder.append("Signature: "+sha1+"\n");Log.d("Signature", "packageName = " + packageInfo.packageName + ", signature = " + sha1);}sign.setText(stringBuilder.toString());} catch (Throwable e) {Log.e("Signature", "getView: ", e);}return view;}
}

以及item的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"android:layout_height="100dp"><ImageViewandroid:layout_width="80dp"android:layout_height="80dp"android:id="@+id/item_icon"android:layout_margin="10dp"/><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_toRightOf="@+id/item_icon"android:layout_marginTop="10dp"android:layout_marginRight="10dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="16sp"android:text="xxx"android:layout_alignParentTop="true"android:textColor="@color/black"android:id="@+id/item_name"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#ff0000"android:textSize="14sp"android:layout_alignParentBottom="true"android:layout_marginBottom="10dp"android:text="xxxxxxxxx"android:id="@+id/item_sign"/></RelativeLayout></RelativeLayout>

最后展示下效果图:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/190303.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LinkedList详解

LinkedList详解 LinkedList是List接口的一个主要的实现类之一&#xff0c;基于链表的实现。以java8为例来了解一下LinkedList的源码实现 继承关系 public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>,…

c++ 执行系统命令system 、popen

一、系统命令system 1、示例&#xff1a; #include <cstdlib> // 必须包含这个头文件来使用system()int main() {system("sleep 10"); // 塞执行return 0; }程序会等待10秒后&#xff0c;执行完成使用system("sleep 10 &");可以实现非阻塞执行…

python中,or、not的用法

or的用法 在python中,or运算符是一个逻辑运算符&#xff0c;用于在多个条件中选择至少一个为真&#xff08;True&#xff09;的情况。 如果条件中的任意一个为真&#xff0c;整个表达式的结果就为真 如&#xff1a; 示例1: 检查两个数字中至少有一个正数 示例2: x True y …

git分支拉取时,提示冲突

stderr: error: unable to resolve reference refs/remotes/origin/xx/20231129: ??? 来自http://192.168.0.xx:6452/xxx-xx/xx-xx ! [新分支] hotfix/20231129 -> origin/xxx/20231129 &#xff08;不能更新本地引用&#xff09; error: 一些本地引用不能被更新&#xf…

【Python-第三方库-pywin32】随笔-基础

win32gui.IsWindow(hwnd) 说明 基于对话框的应用程序一般是要保证应用流程的&#xff0c;比如父窗口不存在了&#xff0c;是否需要该窗口继续存在&#xff0c;这时需要用到 IsWindow 函数。 功能 该函数确定给定的窗口句柄是否标识一个已存在的窗口&#xff1b;判断某个整数…

Python标准库copy【侯小啾python领航班系列(十五)】

Python标准库copy【侯小啾python领航班系列(十五)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹…

(六)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)

一、无人机模型简介&#xff1a; 单个无人机三维路径规划问题及其建模_IT猿手的博客-CSDN博客 参考文献&#xff1a; [1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120 二、Tiki-taka算法&#xff08;TTA&#xf…

15.oracle的 listagg() WITHIN GROUP () 行转列函数使用

1.使用条件查询 查询部门为20的员工列表 -- 查询部门为20的员工列表 SELECT t.DEPTNO,t.ENAME FROM SCOTT.EMP t where t.DEPTNO 20 ; 效果&#xff1a; 2.使用 listagg() WITHIN GROUP () 将多行合并成一行(比较常用) SELECT T .DEPTNO, listagg (T .ENAME, ,) WIT…

柯桥英语口语学习,日常生活用语军大衣用英语怎么说?

那么军大衣跟羽绒服用英语怎么说呢&#xff1f; 跟商英君一起学习一下吧&#xff01; 01 "军大衣"用英语怎么说&#xff1f; 军大衣在英语表达中 也有专门的词汇 即military coat 或 military style cotton coats military有“军人、军事;军事的、军用的…”的…

UVA11729 Commando War

UVA11729 Commando War 题面翻译 突击战 你有n个部下&#xff0c;每个部下需要完成一项任务。第i个部下需要你花Bj分钟交代任务&#xff0c;然后他就会立刻独立地、无间断地执行Ji分钟后完成任务。你需要选择交代任务的顺序&#xff0c;使得所有任务尽早执行完毕&#xff08…

逻辑卷管理器lvm

啥意思&#xff0c;个人理解就是可以将物理分区合并一起组成大的磁盘&#xff0c;也可以移除其中的某个分区。 有四个概念需要了解下 PV&#xff0c;物理卷&#xff0c;VG 卷用户组&#xff0c;PE物理扩展块&#xff0c;LV逻辑卷 p物理&#xff0c;v卷&#xff0c;g用户组&a…

2023年第十二届数学建模国际赛小美赛D题望远镜的微光系数求解分析

2023年第十二届数学建模国际赛小美赛 D题 望远镜的微光系数 原题再现&#xff1a; 当我们使用普通光学望远镜在昏暗的光线下观察远处的目标时&#xff0c;入射孔径越大&#xff0c;进入双筒望远镜的光线就越多。望远镜的放大倍数越大&#xff0c;视野越窄&#xff0c;图像显示…

LightDB - append hint

在 oracle 中插入有两种模式&#xff1a; 传统插入&#xff1a;插入的时候使用表中已有的空闲空间&#xff0c;同时会经过buffer cache&#xff0c;在插入的过程中会维护引用完整性约束direct-path 插入&#xff1a;插入的时候不使用表中已有的空闲空间&#xff0c;直接在已有…

Day62.算法训练

718. 最长重复子数组 class Solution {public int findLength(int[] nums1, int[] nums2) {int max 0;int[][] dp new int[nums1.length][nums2.length];for (int i 0; i < nums1.length; i) {for (int j 0; j < nums2.length; j) {if (nums1[i] nums2[j]) {if (i …

性能分析之tcpdump抓包

1. 简单用法 tcpdump -i any port 8382 -s 0 -C 200 -w steem.cap 1.1. 参数说明 -i any 指定抓取的网卡&#xff0c;通常是eth0&#xff0c;示例里any表示抓取所有网卡的包;&#xff1b; port 8382 指定抓取的端口&#xff0c;包括发送端口或接收端口&#xff0c…

CRM在设备制造行业的应用,优化资源配置

设备制造业竞争激烈&#xff0c;公司要以客户为中心&#xff0c;搞好售后服务。CRM管理软件是设备制造业客户关系管理的重要工具。以下是CRM在设备制造业里的典型应用。 1.营销管理 制订市场策略&#xff1a;设备制造通常涉及较长的决策周期和销售周期。客户可能会在多家供货商…

Adobe Acrobat DC 将PDF转曲步骤

1、编辑--更多--背景--添加 2、只需要将不透明度调为0即可。 3、工具--印刷制作 4、拼合器预览 5、只需要将下面标出来的地方勾选即可 6、可以另存为&#xff0c;不影响源文件 7、检查是否成功&#xff0c;文件--属性--字体为空&#xff0c;说明成功了 参考资料&#xff1a; …

使用 kubeadm 部署 Kubernetes 集群(二)k8s环境安装

一、安装containerd 安装 k8s 有几种方式&#xff1a; 1、 Kubeadm 2、 二进制 这两个是 k8s 官网提供的方式&#xff0c;也是生产环境用的还可以借助第三方平&#xff1a;rancher、kubesphere 都可以装 k8s 这里使用 kubeadm 1.安装 containerd 在 Kubernetes 集群中&#…

C++12.1

三种运算符重载&#xff0c;每个至少实现一个运算符的重载 #include <iostream>using namespace std;class Person {friend const Person operator- (const Person &L, const Person &R);friend bool operator<(const Person &L,const Person &R);f…

opencv2.4 android编译

背景见我的前一篇博客&#xff1a;opencv 编译Simple&#xff0c;转眼6年过去了&#xff0c;最近有个东西想尝试基于opencv来做&#xff0c;所以有本文。 一些背景知识 opencv1.1已经不再维护&#xff0c;目前只能从github中找到一个历史的版本: https://github.com/archith/…