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

简介: 调用Android原生@SystemApi、@Hide方法

 

系统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里写法)


目录
相关文章
|
12月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1141 4
|
2月前
|
存储 API Android开发
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
150 4
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
|
6月前
|
Android开发 开发者
Android自定义view之利用drawArc方法实现动态效果
本文介绍了如何通过Android自定义View实现动态效果,重点使用`drawArc`方法完成圆弧动画。首先通过`onSizeChanged`进行测量,初始化画笔属性,设置圆弧相关参数。核心思路是不断改变圆弧扫过角度`sweepAngle`,并调用`invalidate()`刷新View以实现动态旋转效果。最后附上完整代码与效果图,帮助开发者快速理解并实践这一动画实现方式。
165 0
|
4月前
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
314 11
|
存储 Shell Android开发
基于Android P,自定义Android开机动画的方法
本文详细介绍了基于Android P系统自定义开机动画的步骤,包括动画文件结构、脚本编写、ZIP打包方法以及如何将自定义动画集成到AOSP源码中。
534 2
基于Android P,自定义Android开机动画的方法
|
Android开发
基于android-11.0.0_r39,系统应用的手动签名方法和过程
本文介绍了基于Android 11.0.0_r39版本进行系统应用手动签名的方法和解决签名过程中遇到的错误,包括处理`no conscrypt_openjdk_jni-linux-x86_64`和`RegisterNatives failed`的问题。
626 2
|
Android开发
错误记录:调用原生TvSettings 的 com.android.tv.settings.device.storage.ResetActivity 无法启动
本文记录了一个Android TV设置中由于未设置`android:exported="true"`导致`com.android.tv.settings.device.storage.ResetActivity`无法被第三方app启动的错误,并通过添加该属性成功解决了问题。
233 1
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
469 15
Android 系统缓存扫描与清理方法分析
|
ARouter 测试技术 API
Android经典面试题之组件化原理、优缺点、实现方法?
本文介绍了组件化在Android开发中的应用,详细阐述了其原理、优缺点及实现方式,包括模块化、接口编程、依赖注入、路由机制等内容,并提供了具体代码示例。
268 2
|
Android开发
Android在rootdir根目录创建自定义目录和挂载点的方法
本文介绍了在Android高通平台的根目录下创建自定义目录和挂载点的方法,通过修改Android.mk文件并使用`LOCAL_POST_INSTALL_CMD`变量在编译过程中添加目录,最终在ramdisk.img的系统根路径下成功创建了`/factory/bin`目录。
674 1

热门文章

最新文章