首页 > 其他分享 >调用Android原生@SystemApi、@Hide方法

调用Android原生@SystemApi、@Hide方法

时间:2023-03-03 17:22:42浏览次数:45  
标签:调用 Hide 方法 SystemApi 编译 api Android LOCAL

 

 

系统api.png

如上图所示,PackageManager.getPermissionFlags()方法是被@SystemApi注解修饰过的方法,@SystemApi 只允许system app 调用或者用反射方法调用, 反射方法实例:

this.mPackageManager = context.getPackageManager();
try {
    Method method = mPackageManager.getClass(). getMethod("getPermissionFlags");
    method.invoke(mPackageManager, permName, packageName, user);
} catch (NoSuchMethodException e) {
    e.printStackTrace();
}

需要注意的是非 system app 用反射方法调用SystemApi,即使编译通过, 实际运行是还会遇到permission check。例如getPermissionFlags就需要GRANT_RUNTIME_PERMISSIONS,REVOKE_RUNTIME_PERMISSIONS,GET_RUNTIME_PERMISSIONS中的任意一个,如果应用没有申请这其中的任意一个权限,运行是也会报错。申请了以上三个中任意一个权限,就需要有系统签名。归根究底,要调用系统API就必须要系统签名,否则即使编译成功了,运行时也会报错。

2.源码编译模块

在使用mk文件编译的时候,会有LOCAL_PRIVATE_PLATFORM_APISLOCAL_SDK_VERSION参数选择,在mk文件中声明这两个参数的时候是互斥的,意思是只能声明其中一个

  • LOCAL_PRIVATE_PLATFORM_APIS设置之后,如果模块中有用到系统api,会使用sdk的hide的api来编译。
  • LOCAL_SDK_VERSION设置之后,编译的应用不能访问hide的api,会报找不到该方法错误。
# 可以调用系统的api,但是需要给apk系统签名
# LOCAL_CERTIFICATE := platform
LOCAL_PRIVATE_PLATFORM_APIS := true

# 编译时忽略系统隐藏类(@hide)
LOCAL_SDK_VERSION := current

源码编译时会用ProGuard混淆器做代码混淆、优化,过程中可能会删除掉个别类里的个别方法。

处理代码混淆问题有两个方法:

  • 在mk文件里加上一句:LOCAL_PROGUARD_ENABLED := disabled,禁用混淆器。
  • 在mk文件里加上一句:LOCAL_PROGUARD_FLAG_FILES := proguard.flags,然后创建一个配置文件"proguard.flags",配置部分类/方法/属性禁止混淆。(可以参照源码环境下的Settings里写法)

标签:调用,Hide,方法,SystemApi,编译,api,Android,LOCAL
From: https://www.cnblogs.com/wanglongjiang/p/17176363.html

相关文章

  • android studio 打包发布 Cause: failed to decrypt safe contents entry: javax.cryp
    androidstudio打包发布错误:Cause:failedtodecryptsafecontentsentry:javax.crypto.BadPaddingException:Givenfinalblocknotproperlypadded.Suchissues......
  • Android studio 使用小米手机(Redmi K30 Pro)真机调试
    Androidstudio虚拟机调试启动很慢,而且有些应用还必须要用手机调试,还得把apk发到手机上安装,比较麻烦。所以手机通过USB直接连接电脑在线调试,方便快捷。手边有一部小米的R......
  • Android的延迟实现的几种解决方案以及原理分析
    写这篇文章的目的,是看到群里有人在实现延迟的时候,用如下的第四种方法,个人感觉有点不妥,为了防止更多的人有这种想法,所以自己抽空深入分析,就分析的结果,写下此文,希望对部分人......
  • Android换肤原理和Android-Skin-Loader框架解析
    Android换肤技术已经是很久之前就已经被成熟使用的技术了,然而我最近才在学习和接触热修复的时候才看到。在看了一些换肤的方法之后,并且对市面上比较认可的Android-Skin-Loa......
  • 【android】Android SharedPreferences使用详解
    【参考连接】AndroidSharedPreferences使用详解androidSharedPreferences实现用户的注册和保存账号密码......
  • Android线上包
    Android线上包抓包教程由于当前主流手机系统都是稳定版,无法进行root,目前该方法只支持模拟器。准备工具:模拟器,linux或git,抓包工具1、模拟器连接抓包工具并下载证书2、找......
  • Android Studio 之连接mysql实现添加功能
    昨天经过几个小时的奋斗,终于是连接上了mysql说实话过程十分艰辛,包括查ip换网络改权限改数据库的表改网络等等之后也尝试过在自己电脑上下另一个版本的mysql但是都以......
  • 3月2号Android开发学习
    (2)视图基础1.设置视图的高度视图宽度通过属性Android:layout_width表达,视图高度通过属性android:layout_heigth表达,宽高的取值主要有以下三种1.match_parent:表示......
  • android studio有关grdle配置
    我们每次新建工程的时候,项目都会通过该路径下寻找适合的gradle包,如果没有则会自动下载到对应的文件夹下......
  • Android-Toast
    Toast(吐司) Android用于提示信息的一个控件也就是一个消息提示框,能显示一个框,没任何按钮,一段时间过后自动消失,是很常用的一个知识   toast的使用非常简单,格式和......