android关于获取隐藏类的心得

对于在系统源码中有些类被@hide了。我们在做apk开发时无法像其他类一样 直接调用。所以我们有以下方法:

1.反射

2.放到系统源码下编译

3.用系统签名打包apk

先说说第一种吧 反射:

主要是利用java 中java.lang.Object下的Method类

Method提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。

Method允许在匹配要调用的实参与基础方法的形参时进行扩展转换;但如果要进行收缩转换,则会抛出IllegalArgumentException。

 public static boolean[] deviceHasKeys(int[] keyCodes) {
        boolean[] ret = new boolean[keyCodes.length];
        IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
        try {
            wm.hasKeys(keyCodes, ret);
        } catch (RemoteException e) {
            // no fallback; just return the empty array
        }
        return ret;
    }

其中 IWindowManager ServiceManageer均为隐藏类,

要想这样用,有两个方法:

1是修改framwork 让其不为hide class 从而可以使用

2是使用java的映射机制。

下面是使用映射后,对应的代码:

 public static boolean[] deviceHasKeys(int[] keyCodes) {
        boolean[] ret = new boolean[keyCodes.length];
        Method method;
        String methodName = "hasKeys";//haskey 为隐藏类的隐藏method
         try {
           method = Class.forName("android.view.IWindowManager.Stub").getMethod(methodName, String.class);
            try {
                method.invoke(Class.forName("android.view.IWindowManager.Stub"),keyCodes,ret);
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }    
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return ret;    

    }


说说第三种引用系统签名打包apk

因为我们的 apk有隐藏类。先生成apk,然后用系统签名文件在build/target/product/security下的platform.pk8和platform.x509.pem这2个文件打包apk(可能根据系统不同。文件名不一样)。然后用java命令打包apk:

java -jar signapk.jar platform.x509.pem platform.pk8 D:\xxx.apk D:\xxxSigned.apk

后一个apk为签名后 的apk

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值