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;

    @Override
    protected 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">

    <GridView
        android: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();
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public 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"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="100dp">
    <ImageView
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:id="@+id/item_icon"
        android:layout_margin="10dp"
        />
   <RelativeLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_toRightOf="@+id/item_icon"
       android:layout_marginTop="10dp"
       android:layout_marginRight="10dp"
       >
       <TextView
           android: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"
           />
       <TextView
           android: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>

最后展示下效果图:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux破解用户密码【基于redhat9】

Linux破解用户密码【基于redhat9】 操作步骤&#xff1a; 重启虚拟机&#xff0c;选择第二行&#xff0c;按下e键在倒数第二行的末尾加入 rd.break,按下ctrlx键&#xff0c;进入终端界面重新挂载/sysroot为读写切换到bash修改用户密码创建 /.autorelabel 文件使SELinux安全策略…

仿真的整体框架和类图设计

之前的写的模拟代码没有模块&#xff0c;没有对象&#xff0c;写的逻辑结构也很混乱。我花了些时间进行整理&#xff0c;首先所有的类如下图 在管理类中有统一的管理类的接口 &#xff0c;提供所有管理类的虚拟初始化和关闭方法 然后事件的管理类 我希望在这个类中管理所有的脉…

canvas基础:渲染文本

canvas实例应用100 专栏提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。 canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重要的帮助。 文章目录 示例…

操作系统-文件管理

文件的属性 文件名&#xff1a;由创建文件的用户决定文件名&#xff0c;主要说为了方便用户找到文件&#xff0c;同一个目录下不允许有重名文件。 标识符&#xff1a;一个系统内的各文件标识符唯一&#xff0c;对用户来说毫无可读性&#xff0c;因此标识符只是操作系统用于区分…

解决dom4j新增xml节点自动加上xmlns=““的问题

文章目录 问题发生问题原因技术积累问题解决实战演示写在最后 问题发生 有pom.xml文件A&#xff0c;有符合pom.xm格式的l字符串B&#xff1b; 字符串B通过DocumentHelper.parseText(str)转成xml文件&#xff1b; pom.xml文件A通过add(node)方法添加第二步转换完后的pom.xml文件…

微信小程序 内置地图及打开外部地图导航

1. 微信小程序 内置地图及打开外部地图导航 1.1 说明 用户点击通过目的地经纬度打开地图展示坐标点&#xff0c;然后可以选择外部安装的地图app进行导航搜索。    scale“4” 缩放比例&#xff0c;缩放级别&#xff0c;取值范围为3-20。 1.2. wxml代码 <button type&qu…

C++利剑string类(详解)

前言&#xff1a;大家都知道在C语言里面的有 char 类型&#xff0c;我接下来要讲的 string 类功能是使用 char 类型写的类&#xff0c;当然这个是C官方写的&#xff0c;接下来我们将会学会使用它&#xff0c;我们会发现原来 char 这种类型是还能这么好用&#xff0c;授人以…

Flutter学习(七)GetX offAllNamed使用的问题

背景 使用GetX开发应用的时候&#xff0c;也可能有人调用过offAllNamed&#xff0c;会发现所有controller的都被销毁了 环境 win10 getx 4.6.5 as 4 现象 从A页面&#xff0c;跳转到B页面&#xff0c;然后调用offAllNamed进行回到A页面&#xff0c;观察controller声明周期…

Python程序员入门指南:学习时间和方法

文章目录 标题Python程序员入门指南&#xff1a;学习时间、方法和就业前景学习方法建议学习时间 标题 Python程序员入门指南&#xff1a;学习时间、方法和就业前景 Python是一种流行的编程语言&#xff0c;它具有简洁、易读和灵活的特点。Python可以用于多种领域&#xff0c;如…

CentOS或RHEL安装code-server(vscode-web)

下载rpm安装包 网络下载或者下载到本地再上传到服务器&#xff0c;点击访问国内下载地址&#xff0c;不需要积分curl -fOL https://github.com/coder/code-server/releases/download/v4.19.1/code-server-4.19.1-amd64.rpm安装 rpm -i code-server-4.19.1-amd64.rpm关闭和禁用…

IP地理定位技术的服务内容详解

IP地理定位技术是一种通过IP地址确定设备或用户地理位置的技术&#xff0c;广泛应用于广告定向、网络安全、位置服务等领域。本文将深入探讨IP地理定位技术的服务内容&#xff0c;解析其在不同场景中提供的多种服务。 1. 准确的地理位置信息提供&#xff1a; IP地理定位技术的…

CGAL中2D三角剖分的数据结构

1、定义 三角剖分数据结构是一种设计用于处理二维三角剖分表示的数据结构。三角剖分数据结构的概念主要是设计用作CGAL2D三角剖分类的数据结构&#xff0c;这些类是嵌入平面中的三角剖分。然而&#xff0c;这个概念似乎更一般&#xff0c;可以用于任何可定向的无边界三角剖分曲…

6.1810: Operating System Engineering <Lab2 syscall: System calls>

课程链接&#xff1a;6.1810 / Fall 2023 一、本节任务 二、要点 操作系统要满足三要素&#xff1a;并发、隔离、交互&#xff08;multiplexing, isolation, and interaction&#xff09;。 宏内核&#xff08;monolithic kernel&#xff09;&#xff1a;是操作系统核心架构…

开源图床Qchan本地部署远程访问,轻松打造个人专属轻量级图床

文章目录 前言1. Qchan网站搭建1.1 Qchan下载和安装1.2 Qchan网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar云端设置2.2 Cpolar本地设置 3. 公网访问测试总结 前言 图床作为云存储的一项重要应用场景&#xff0c;在大量开发人员的努力下&#xff0c;已经开发出大…

基于机器深度学习的交通标志目标识别

在线工具推荐&#xff1a; 三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数据生成器 - 3D模型在线转换 - 3D模型预览图生成服务 智能交通系统&#xff08;ITS&#xff09;&#xff0c;包括无人驾驶车辆&#xff0c;尽管在道路…

最受好评的 5 款最佳安卓手机数据恢复工具

您想从 Android 手机中恢复永久删除或丢失的数据和文件吗&#xff1f;您可以借助顶级 Android 数据恢复软件来完成此操作。如果您的数据已被删除、损坏或格式化&#xff0c;则可以将已删除的文件恢复到您的 Android 手机中。Android 设备丢失文件的原因可能有多种。 不管你的手…

非全自研可视规则引擎RuleLinK可视化之路

导读 上一篇《非全自研可视化表达引擎-RuleLinK》介绍了RuleLink的V1.0版本&#xff0c;虽说一定程度上消除了一些配置相关的样板式代码&#xff0c;也肉眼可见的消除了一些研发资源的浪费&#xff1b;RuleLink的初衷是让业务配置变得简单&#xff0c;是面向运营同学。要真正面…

聚观早报 |国行PS5轻薄版开售;岚图汽车11月交付7006辆

【聚观365】12月2日消息 国行PS5轻薄版开售 岚图汽车11月交付7006辆 比亚迪推出12月限时优惠 特斯拉正式交付首批Cybertruck 昆仑万维发布「天工 SkyAgents」平台 国行PS5轻薄版开售 索尼最新的PlayStation5主机&#xff08;CFI-2000型号组-轻薄版&#xff09;国行版本正…

OpenHarmony 关闭息屏方式总结

前言 OpenHarmony源码版本&#xff1a;4.0release 开发板&#xff1a;DAYU / rk3568 一、通过修改系统源码实现不息屏 修改目录&#xff1a;base/powermgr/power_manager/services/native/profile/power_mode_config.xml 通过文件中的提示可以知道DisplayOffTime表示息屏的…

EasyExcel两行表头

例子&#xff1a; 代码&#xff1a; StorageService localStorageService storageFactory.getLocalStorageService();String path "";// 文件信息String dateTime DateUtils.formatTimestampToString(new Date());String title "xxx统计";String fil…