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

news/2024/12/29 1:36:53/

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.ppmy.cn/news/171791.html

相关文章

小话圆圈C怎么打出来的?

只需要Alt 169即可&#xff0c;就这么任性&#xff0c;试一下吧©

matlab .mat转.txt

matlab 处理数据将.mat转.txt&#xff0c; 代码如下 clear all load(MixPA.mat) Tcell2table(protein_A); #数据集里面有个名字 writetable(T,Mix.AC_P1.txt); 我应该集齐了所有文件转换处理的方法&#xff0c;摸摸自己&#xff0c;今天又是洒泪的一天&#xff0c;嘿嘿嘿……

如何在WordPress网站底部中间添加备案号

如何在WordPress网站底部中间添加备案号 为什么要添加备案号添加备案号 为什么要添加备案号 之所以写下这篇文章&#xff0c;原因是之前搭了一个博客网站&#xff0c;备了案&#xff0c;但是没有在网页的底部添加备案号 然后我们的腾讯云客服小姐姐就电话通知了一下&#xff0…

c库(上)----小话c语言(17)

[Win7 vs2010] Q&#xff1a; C库和系统api之间是什么关系&#xff1f; A&#xff1a; 如下图&#xff0c;简单示意&#xff1a; 可以看出&#xff0c;C库一部分是使用系统api实现自身功能(比如文件操作)&#xff0c;另一部分并不会直接依赖系统api&#xff0c;单独实现功能(…

基本输入输出,基本但不简单----小话c语言(4)

开头将文章中代码所在的环境介绍下&#xff1a; [Mac-10.7.1 Lion Intel-based] Q&#xff1a; 看到stdio.h中有这么多关于输入或者输出的函数&#xff0c;怎么会这么多&#xff1f; A&#xff1a; 其实基本的函数不多&#xff0c;不过从易于上层使用的角度&#xff0c;又被封…

小话游戏脚本(一)

小话游戏脚本(一) ( 题记&#xff1a;近来在网上学习到一个新的观点(应该是来自刘未鹏的BLOG :) )&#xff1a;书写是为了更好的学习&#xff0c;这与之前脑子里传道授业解惑的观点颇为迥异&#xff0c;品一品又颇以为然&#xff0c;事物不都是两面的吗&#xff0c;这只是看待角…

小话HTTP Authentication

什么是Authentication&#xff1f; 首先解释两个长的很像、容易混淆的单词&#xff0c;Authentication&#xff08;鉴定、认证&#xff09;和Authorization&#xff08;授权&#xff09;。 Authentication就是要证明你是谁。举个例子&#xff0c;你告诉别人你的名字叫Alice&a…

当写C语言写多了,自然就喜欢C++了----小话c++(1)

[Mac 10.7.1 Lion x64 Intel-based gcc4.2.1 xcode4.2] Q&#xff1a; 解释下标题吧。 A&#xff1a; 依稀记得&#xff0c;写一个数值绝对值的函数时&#xff0c;写到第三个&#xff0c;实在感觉很痛苦&#xff0c;重复了这么多遍&#xff0c;立刻体会了重载和STL的重要…