Android 调用系统隐藏的类和方法

news2025/1/11 12:52:18

1.Android系统隐藏的类和方法

阅读Android源码时,会发现很多被@UnsupportedAppUsage注解的方法,这些方法不能被外部应用访问。

比如Android中的PackageParser类,这个类是在android.content.pm包下面:

0d41f917553b4ea0a837b6e1cb012067.png

可以看到这个类是隐藏的(@hide),不对外提供sdk的调用,所以不能直接去实例化。

这个类里面有一个parsePackageLite静态方法:

c70522b8cf094f05ba6f791955c9e2e6.png

这个方法有@UnsupportedAppUsage注解,表示该方法不支持用户app去调用。

 

2.调用系统隐藏的类和方法

①通过反射

private void testReflect() {

    try {

        Class<?> cls=Class.forName( "android.content.pm.PackageParser");

        Method[] methods=cls.getMethods();

        for (int i = 0; i < methods.length; i++) {

            Log.i("RR",methods[i].getName());

        }

    } catch (ClassNotFoundException e) {

        e.printStackTrace();

    }

}

0993a440524a4d09a276a919e9f49905.png通过log可以看到,是可以获得到这个方法的。

②声明系统的类,空实现,抛异常

在查看类的时候,经常可以看到下面的代码,这个是编译通过,在最终调用的时候,会去找最终的系统实现类。

cf5bc56f0de0432abb53999ac4e26678.png

于是就参照系统的写法来试试

c6523821ba18476baec4d7b23346b893.png

要保证创建的类和系统的包名一样,里面需要引用的其他类也要声明,写上。

PackageParser.java:

package android.content.pm;

import java.io.File;

import java.security.cert.Certificate;

import java.util.List;

public class PackageParser {

    public static PackageLite parsePackageLite(File packageFile, int flags) throws PackageParserException {

        throw new RuntimeException("Stub!");

    }

    public static class PackageLite {

        public final String packageName;

       ……所有属性直接拷过来

        public PackageLite(String codePath, ApkLite baseApk, String[] splitNames, String[] splitCodePaths, int[] splitRevisionCodes) {

            this.packageName = baseApk.packageName;

           ……所有属性赋值直接拷过来

        }

        public List<String> getAllCodePaths() {

          throw new RuntimeException("Stub!");

        }

    }

    public static class ApkLite {

        public final String codePath;

       ……所有属性拷过来

        public ApkLite(String codePath, String packageName, String splitName, int versionCode, int revisionCode, int installLocation, List<VerifierInfo> verifiers, Signature[] signatures, Certificate[][] certificates, boolean coreApp, boolean multiArch, boolean use32bitAbi, boolean extractNativeLibs) {

         throw new RuntimeException("Stub!");

        }

    }

    public static class PackageParserException extends Exception {

        public final int error;

        public PackageParserException(int error, String detailMessage) {

            super(detailMessage);

         throw new RuntimeException("Stub!");

        }

        public PackageParserException(int error, String detailMessage, Throwable throwable) {

            super(detailMessage, throwable);

         throw new RuntimeException("Stub!");

        }

    }

}

可以看到,实现的部分都用throw new RuntimeException(“Stub!”); 这个代替了。

注意:属性要全部写上(有UnsupportedAppUsage注解的,把注解删掉),可以把源码拷贝过来,然后把实现替代为throw new RuntimeException(“Stub!”);

VerifierInfo.java:

package android.content.pm;

import android.os.Parcel;

import android.os.Parcelable;

import java.security.PublicKey;

public class VerifierInfo implements Parcelable {

    public final String packageName;

    public final PublicKey publicKey;

    public VerifierInfo(String packageName, PublicKey publicKey) {

        throw new RuntimeException("Stub!");

    }

    private VerifierInfo(Parcel source) {

        throw new RuntimeException("Stub!");

    }

    @Override

    public int describeContents() {

        throw new RuntimeException("Stub!");

    }

    @Override

    public void writeToParcel(Parcel dest, int flags) {

        throw new RuntimeException("Stub!");

    }

    public static final Parcelable.Creator<VerifierInfo> CREATOR = new Parcelable.Creator<VerifierInfo>() {

        public VerifierInfo createFromParcel( Parcel source) {

         throw new RuntimeException("Stub!");

        }

        public VerifierInfo[] newArray(int size) {

         throw new RuntimeException("Stub!");

        }

    };

}

接下来就可以在app中调用该隐藏方法了:

private void testRuntimeExp() {

    File file=new File( Environment.getExternalStorageDirectory().getPath()+"/mm/app-debug.apk");

    if (!file.exists()) {

        Toast.makeText(this, "file is not exist", Toast.LENGTH_SHORT).show();

        return;

    }

    try {

       PackageParser.PackageLite packageLite= PackageParser.parsePackageLite(file,0);

       Log.i("RR","packageName:" + packageLite.packageName);

       Log.i("RR","versionCode:" + packageLite.versionCode);

       Log.i("RR","installLocation:" + packageLite.installLocation);

       Log.i("RR","codePath:" + packageLite.codePath);

       Log.i("RR","baseCodePath:" + packageLite.baseCodePath);

       Log.i("RR","coreApp:" + packageLite.coreApp);

        String s="";

    } catch (PackageParser.PackageParserExc eption e) {

        e.printStackTrace();

    }

}

结果:

9eb01c4a2e68489eaada4bf516c5953e.png

看到结果是正确的,可以获得信息。

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

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

相关文章

有哪些自动化构建工具推荐? - 易智编译EaseEditing

以下是几个常用的自动化构建工具推荐&#xff1a; Jenkins&#xff1a; Jenkins 是一个开源的自动化构建工具&#xff0c;广泛用于持续集成和持续交付。 它支持各种编程语言和版本控制系统&#xff0c;并提供了丰富的插件生态系统&#xff0c;可实现灵活的构建流程和自动化部…

【Spring】— 动态SQL :<choose>、<when>和<otherwise>元素

<choose>、<when>和<otherwise>元素 在使用<if>元素时&#xff0c;只要test属性中的表达式为true&#xff0c;就会执行元素中的条件语句&#xff0c;但是在实际应用中&#xff0c;有时只需要从多个选项中选择一个执行。例如&#xff0c;若用户姓名不为…

九、Docker网络

Docker网络 一、docker网络介绍 Docker网络在Docker的基础知识中算比较重要的了&#xff0c;需要多多实验理解。 Docker服务安装启动后默认在host上创建了三个网络&#xff1a; [rootk8s-m1 ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UN…

毛毛莫名的大一生活总结

毛毛莫名的大一生活总结 1. 关于高考我的看法1.1 初中1.2 高中 2. 大一开学前的暑假3. 大一开学3.1 军训3.2 学生会 学校社团 运动团体3.2.1 学生会3.2.1.1 院学生会3.2.1.2校学生会 3.2.2 社团3.2.3 运动团体 4. 大学生活 1. 关于高考我的看法 1.1 初中 初一初二对学习不用太…

一种简单的Android骨架屏实现方案----0侵入0成本

对骨架屏的理解 什么是骨架屏 所谓骨架屏&#xff0c;就是在页面进行耗时加载时&#xff0c;先展示的等待 UI, 以告知用户程序目前正在运行&#xff0c;稍等即可。 等待的UI大部分是 loading 转圈的弹窗&#xff0c;有的是自己风格的小动画。其实大同小异。而骨架屏无非也是一…

本地部署github上的stable diffuion,轻松玩转ai绘画(新手小白也能懂)

你也想自己生成上面这样好看的图片吗&#xff1f;废话不多说&#xff0c;跟着博主&#xff0c;按步骤来&#xff0c;做完你也就可以了&#xff0c;而且无任何限制&#xff0c;懂得都懂&#xff01;&#x1f60e; 目录 第一步&#xff1a;准备VPN 第二步&#xff1a;安装Pyth…

LabVIEWCompactRIO 开发指南第七章48

LabVIEWCompactRIO 开发指南第七章48 5.如果控制器上已经安装了LabVIEW实时和NI-RIO&#xff0c;请选择自定义软件安装并点击下一步。如果出现警告对话框&#xff0c;请单击“是”。单击NI-工业通信用于EtherCAT的框。将自动检查所需的依赖项。单击下一步继续在控制器上安装软…

一款开源的无线CMSIS DAP ARM芯片下载调试器详细说明

文章目录 概要1. 一般概念1.1 CMSIS—DAP的一般概念1.2 支持的芯片1.3 典型应用场景 2. 原理图与尺寸图2.1 Host端&#xff08;发送端&#xff09;原理图2.2 Target&#xff08;目标&#xff09;端原理图2.3 Host尺寸图2.4 Target尺寸图2.5 实物图 3. 使用方法3.1 连接方法3.1.…

群晖折腾记1—群晖NAS使用docker中的ddns-go,DDNS阿里云ali实现Ipv6访问

群晖折腾记1—群晖NAS使用docker中的ddns-go,DDNS阿里云ali实现Ipv6访问 前置条件科普时间具体步骤1. 域名购买2. 获取AccessKey ID和Secret3. 获取免费SSL证书4. 在docker中运行ddns-go6.设置反向代理 前置条件 1、移动宽带只有IPv6公网地址&#xff0c;若你的宽带为电信或联…

Eslint配置指南

ESLint最初是由Nicholas C. Zakas 于2013年6月创建的开源项目。ESLint 是一个开源的 JavaScript 代码检查工具&#xff0c;它是用来进行代码的校验&#xff0c;检测代码中潜在的问题&#xff0c;比如某个变量定义了未使用、函数定义的参数重复、变量名没有按规范命名等等。 中…

logging 模块因权限问题写入日志失败

哈喽大家好&#xff0c;我是咸鱼 今天跟大家分享一个使用 Python 的 logging 模块写入日志文件时遇到的权限问题&#xff0c;不知道你们有没有遇到过 1.案例现象 今天上班的时候手机短信收到了 zabbix 告警&#xff0c;但是发现了不对劲的地方&#xff1a;微信没有收到告警信…

【C++】虚函数相关常见问题

【C】虚函数相关常见问题 文章目录 【C】虚函数相关常见问题1.说说为什么要虚析构&#xff1f;2. C默认的析构函数为什么不是虚函数?3. 构造函数能不能是虚函数4. 说说什么是虚继承&#xff0c;解决什么问题&#xff0c;如何实现&#xff1f;5. 说说什么是虚函数6.说说虚函数的…

VESC操作入门——PPM输入控制和ADC输入控制

目录 一、PPM输入控制1.1、硬件准备1.2、PPM信号1.3、校准电机1.4、输入设置 二、ADC输入控制2.1、硬件准备2.2、更改固件2.3、电压信号2.4、校准电机2.5、输入设置 三、电动车转把控制3.1、转把说明3.2、转把测试 ODrive、VESC和SimpleFOC 教程链接汇总&#xff1a;请点击 一、…

SpringBoot作日志切面记录

目录 1.WebLogAspect 2.配置log4j2.yml 3.效果 话不多说&#xff0c;直接上代码&#xff1a; 1.WebLogAspect import java.util.Arrays;import javax.servlet.http.HttpServletRequest;import org.apache.commons.lang3.StringUtils; import org.apache.commons.text.Str…

第Y2周:训练自己的数据集

我的环境&#xff1a; 训练自己的数据集 一、准备自己的数据集1. 编写split_train_val.py文件2.生成训练文件索引文件 二、创建训练yaml文件三、开始训练 一、准备自己的数据集 数据集来源&#xff1a;kaggle水果检测 目录结构如下&#xff1a; 1. 编写split_train_val.py…

ClickHouse基本使用总结

查看系统配置 查看系统表 select * from system.clusters; 验证zookeeper #验证zookeeper是否与当前数据库clickhouse进行了正确的配置 SELECT * FROM system.zookeeper WHERE path /clickhouse; 建表 创建本地表 MergeTree&#xff0c;这个引擎本身不具备同步副本的功能&…

Kali Linux 2023.2 发布(Hyper-V 和 PipeWire)

Kali Linux 2023.2 发布&#xff08;Hyper-V 和 PipeWire&#xff09; 请访问原文链接&#xff1a;https://sysin.org/blog/kali-linux-2023/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 更新说明 2023 年 5 月 30 日&…

国产上新!芯驰D9多核Cortex-A55核心板,国产车规级平台

随着信息技术的快速发展&#xff0c;市场对芯片的需求越来越大&#xff0c;中国芯片行业自20世纪80年代开始起步&#xff0c;经过近40年的努力&#xff0c;也进入了一个新的时代&#xff0c;芯片国产化乃未来发展的大势所趋。米尔电子作为行业领先的嵌入式模组厂商&#xff0c;…

【Difussion Model】理解和编程

目录 理论框架text-to-imgaedecodergeneration modelclip的原理 FID指标&#xff1a;评估图像生成的好坏数学原理 理论 框架 不断的进行去噪&#xff0c;并且在这个过程中&#xff0c;step也作为“去噪模型&#xff08;其实就是扩散模型&#xff09;”的输入&#xff1a; de…

iOS应用上架详细图文教程

App Store作为苹果官方的应用商店&#xff0c;审核严格周期长一直让用户头疼不已&#xff0c;很多app都“死”在了审核这一关&#xff0c;那我们就要放弃iOS用户了吗&#xff1f;当然不是&#xff01;本期我们从iOS app上架流程开始梳理&#xff0c;详细了解下iOS app上架的那些…