首页 > 其他分享 >访问framework中hide方法

访问framework中hide方法

时间:2024-05-08 10:22:39浏览次数:17  
标签:调用 hide 访问 app framework api hidden 方法 android

经常大家会做安卓系统开发工作问到一个问题,那就是我如果framework代码中增加了一个方法啥的,但是我又不想公开给第三方应用知道,只想让我系统的应用知道,那该怎么办呢?其实这个时候经常就会用到一个hidden的标签,来代表这个方法是隐藏方法,隐藏方法就是给系统内部用的,意味着第三方app就无法使用。这个其实也很常见,自从android p开始android系统就开始对访问hidden的限制越来越严格,虽然我们网络上有各种奇葩招来逃避不允许调用hidden api,这个第三方应用奇葩方法调用hidden不是我们重点。

我们重点当然是我们做android系统的,我们系统源码都可以随意改,根本不需要那种第三方应用使用的奇葩方法来逃避hidden api(毕竟这个属于野路子,google可能下一个版本就改变了,野路子无效了),所以该方案仅仅适用于你可以修改源码情况下,可以对第三方应用,系统应用都可以访问hidden api

1、看看系统中接口是怎么定义成了hidden如下:

我们以ActivityManager的类为例子
frameworks/base/core/java/android/app/ActivityManager.java

    /** @hide */   这里的 
    public static int checkUidPermission(String permission, int uid) {
        try {
            return AppGlobals.getPackageManager()
                    .checkUidPermission(permission, uid);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }
 /** @hide */ 这个标签最为关键,表示这个方法是个隐藏方法不会出现在sdk中,也不会出现编译报错要make update-api

2、那么系统应用app怎么访问这个framework的hidden接口呢?

其实这个hidden接口访问有2中方式

1、反射方法,这种最简单直接调用地方写成反射就可以,但是代码可读性差一点

                    ClassLoader loader = MainActivity.this.getClassLoader();//得到当前类的classLoader
                    Class<?> clz;

                    clz = Class.forName("android.app.ActivityManager"); //加载类
                   @SuppressLint("SoonBlockedPrivateApi") Method m = clz.getDeclaredMethod("checkUidPermission", String.class, int.class); //获取方法


                    int permisson = (Integer) m.invoke(clz, "android.permission.INJECT_EVENTS",1000);  //反射调用,static方法调用时,不必得到对象示例

2、制作一个包装接口jar包,jar是有系统源码编译的,可以访问hidden接口,具体如下:

package com.android.third.call;

import android.app.ActivityManager;

public class ThirdInterface {
    public ThirdInterface() {
    }

    public static int callHiddenFun() {
        return ActivityManager.checkUidPermission("android.permission.INJECT_EVENTS", 1000);
    }
}
注意哦,这里我们需要android源码环境编译哦,编译成一个jar,对应的mk

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_MODULE := thirdinterface
LOCAL_MODULE_STEM := thirdinterface
LOCAL_DEX_PREOPT := false
include $(BUILD_STATIC_JAVA_LIBRARY)

然后 :make thirdinterface 就可以获取对应的jar包

然后需要使用这个jar包的app进行拷贝这个javalib.jar到工程中的lib路径

导入后就可以源码中调用了

 

3、调用成功就能执行成功么?

这个其实在以前android还没有对hidden api的执行做限制时候,确实调用编译通过了就代表执行也也可以成功,但是从android 9以后,发现调用都会出现以下错误logcat打印:
2021-11-28 08:23:55.695 26050-26050/com.example.anrdemo W/example.anrdem: Accessing hidden method Landroid/app/ActivityManager;->checkUidPermission(Ljava/lang/String;I)I (greylist-max-o, linking, denied)

如果看到了Accessing hidden method ,那基本就是代表你其实一切都ok,就是被系统拦截不让你调用了,这里就不用怀疑什么方法写错了,反射写错了,如果没有这个打印要么你就执行成功,要么就是方法写错

4、系统解决hidden api调用

那么系统层面桌面解决让访问调用的hidden api呢?这个其实我们系统层面早就考虑到了需要给一些应用让其可以访问hidden,具体代码可以看这里:
base/core/java/android/content/pm/ApplicationInfo.java

这里其实就有一个isAllowedToUseHiddenApis方法,这个非常关键,分别对代码进行注释讲解:

    private boolean isAllowedToUseHiddenApis() {
        if (isSignedWithPlatformKey()) { //如果app platform签名直接就可以调用hidden api
            return true;
        } else if (isSystemApp() || isUpdatedSystemApp()) { //如果没有platform签名,但是属于system/app,那么就会根据白名单进行过滤是否可以
            return usesNonSdkApi() || isPackageWhitelistedForHiddenApis();
        } else {
            //return false;原来第三方是直接返回false
           return isPackageWhitelistedForHiddenApis();
           //这里改成第三方应用也可以根据这个白名单来
        }
    }
 

那么这个白名单在哪呢?
源码在
~/xiaomi5/frameworks/base/data/etc/hiddenapi-package-whitelist.xml
手机上在:
/system/etc/sysconfig/

看目前内容:

<?xml version="1.0" encoding="utf-8"?>

<config>
  <hidden-api-whitelisted-app package="com.example.anrdemo" /> <!--这里就是我们增加的第三方应用package Name-->
  <hidden-api-whitelisted-app package="android.ext.services" />
  <hidden-api-whitelisted-app package="com.android.apps.tag" />
  <hidden-api-whitelisted-app package="com.android.basicsmsreceiver" />
  <hidden-api-whitelisted-app package="com.android.bookmarkprovider" />
  <hidden-api-whitelisted-app package="com.android.calllogbackup" />
  <hidden-api-whitelisted-app package="com.android.camera" />
  <hidden-api-whitelisted-app package="com.android.car.dialer" />
  <hidden-api-whitelisted-app package="com.android.car.messenger" />
  <hidden-api-whitelisted-app package="com.android.car.overview" />
  <hidden-api-whitelisted-app package="com.android.car.stream" />
  <hidden-api-whitelisted-app package="com.android.companiondevicemanager" />
  <hidden-api-whitelisted-app package="com.android.dreams.basic" />
  <hidden-api-whitelisted-app package="com.android.gallery" />
  <hidden-api-whitelisted-app package="com.android.launcher3" />
  <hidden-api-whitelisted-app package="com.android.mtp" />
  <hidden-api-whitelisted-app package="com.android.musicfx" />
  <hidden-api-whitelisted-app package="com.android.permissioncontroller" />
  <hidden-api-whitelisted-app package="com.android.printservice.recommendation" />
  <hidden-api-whitelisted-app package="com.android.printspooler" />
  <hidden-api-whitelisted-app package="com.android.providers.blockednumber" />
  <hidden-api-whitelisted-app package="com.android.providers.calendar" />
  <hidden-api-whitelisted-app package="com.android.providers.contacts" />
  <hidden-api-whitelisted-app package="com.android.providers.downloads" />
  <hidden-api-whitelisted-app package="com.android.providers.downloads.ui" />
  <hidden-api-whitelisted-app package="com.android.providers.media" />
  <hidden-api-whitelisted-app package="com.android.providers.tv" />
  <hidden-api-whitelisted-app package="com.android.providers.userdictionary" />
  <hidden-api-whitelisted-app package="com.android.smspush" />
  <hidden-api-whitelisted-app package="com.android.spare_parts" />
  <hidden-api-whitelisted-app package="com.android.statementservice" />
  <hidden-api-whitelisted-app package="com.android.storagemanager" />
  <hidden-api-whitelisted-app package="com.android.systemui.plugins" />
  <hidden-api-whitelisted-app package="com.android.terminal" />
  <hidden-api-whitelisted-app package="com.android.wallpaper" />
  <hidden-api-whitelisted-app package="jp.co.omronsoft.openwnn" />
</config>

其实很容易看懂,这下面的名单都可以进行hidden api,我们要增加啥应用只需要加上包名如:

当然这里如果android原生只支持system app,大家有疑问system app难道不应该是platform签名么?那么签名不就直接返回么?其实还真的不是,其实很多系统应用也不一定系统签名哈,有media,啥的签名故就靠这个白名单了。
我们前面对ApplicationInfo进行了修改就可以进行第三方应用包名也写入了。
然后进行编译后,我们第三方应用就可以正常执行hidden api通过了:


标签:调用,hide,访问,app,framework,api,hidden,方法,android
From: https://www.cnblogs.com/terrorists/p/18045302

相关文章

  • 安装tomcat和访问tomcat
    dockerimages#查看镜像如果没有就安装dockerpulltomcat#安装#官方文档解释#-it:交互模式#--rm:容器启动成功并退出以后容器就自动移除,一般在测试情况下使用!dockerrun-it--rmtomcat:9.0#1、下载tomcat镜像dockerpulltomcat#2、启动dockerrun-d......
  • NumPy 数组创建方法与索引访问详解
    NumPy创建数组NumPy中的核心数据结构是ndarray,它代表多维数组。NumPy提供了多种方法来创建ndarray对象,包括:使用array()函数array()函数是最常用的方法之一,它可以将Python列表、元组甚至其他数组转换为ndarray对象。语法:ndarray=np.array(data,dtype=dtype,o......
  • Oracle 给用户授权访问视图
    Oracle给用户授权访问视图createuserc##hrpidentifiedby123456;grantresource,connecttoc##hrp;grantconnecttoc##hrp;grantselectonC##BSKJ.sch_sc_schedulinfotoc##hrp;grantselectonC##BSKJ.sch_sc_classestoc##hrp;grantselectonC##BSKJ.sys_usert......
  • C#的基于.net framework的Winform编程 - 编程手把手系列文章
          对于C#,笔者最早接触的是ASP.NET里的开发,后面对Winform程序也有一定的开发,但是真正理解和重新编码是这些年的事,在我的C#标签里有一些例子,记录了winform程序开发的一些功能。此文只是记录基于.netframework的用C#开发Winform程序的一个过程。1、安装VisualStud......
  • SSH远程访问及控制
    SSH远程访问及控制目录SSH远程访问及控制一、SSH远程管理1、SSH的概述2、SSH的原理二、配置OpenSSH1服务器1、sshd_config配置文件的常用选项设置2、实例操作2.1改端口号2.2禁止root用户登录2.2.3服务端2.2.4客户端2.3白名单和黑名单2.3.1白名单2.3.1.1服务器2.3.1.2客户端2.......
  • Django-rest-framework框架
    【一】drf入门规范【二】序列化组件【三】请求与响应【四】视图组件【五】路由组件【六】认证组件【七】权限组件【八】频率组件【九】过滤与排序【十】异常捕获【十一】分页组件【十二】生成接口文档【十三】序列化类源码分析【十四】JWT介绍【十五】simple-jwt简......
  • 如何使用ISqlSugarClient进行数据访问,并实现了统一的批量依赖注入
    仓储层当前有接口IRepository<T>抽象类 BaseRepository<T>业务逻辑层有抽象类BaseBusiness<M,E>接口IBusiness<M,E>,其中使用ISqlSugarClient,其中还有E表示BaseEntity,M为BaseDto请用C#给出一个案例,支持不同表对应不同的业务逻辑层,然后不同仓储实例,不同表的业务,都实现......
  • kube-ovn中ovn-cni如何访问ovs
    ovs-ovnpod把ovs的db.sock暴露在宿主机上。ovn-cnipod挂载该目录到容器中。ovsdbsocket默认路径就在/run/openvswitch/db.sock。#拷贝ovn-cnipod中ovs-vsctl到pod所在宿主机上kubectlcp-nkube-system-ccni-serverkube-ovn-cni-2hrsn:usr/bin/ovs-vsctlovs-vsc......
  • SSH远程访问及控制
    SSH远程访问及控制目录SSH远程访问及控制一、SSH远程管理1、SSH的概述二、配置OpenSSH1服务器1、sshd_config配置文件的常用选项设置2、实例操作三、sshd服务支持登录验证方式有:密码验证和密钥对验证,可以设置只使用其中一种,也可以都启用3.1密码验证:3.2密钥对验证:四、配置密钥对......
  • K8S 创建Spring-boot项目并进行项目启动与访问
     ##Spring-boot 的helloworld项目packagecom.example.demo;importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMappi......