当前位置: 首页 > news >正文

在 Android 框架中,接口的可见性规则

!!!出现问题:当普通应用通过SDK调用接口时遇见AndroidRuntime: java.lang.NoSuchMethodError: No virtual method

得知:Android 中接口访问控制规则说明

在 Android 系统开发中,不同包名下的接口默认访问权限是不一样的。以下是详细的说明。

1. frameworks/base/core/java/android.* 包下新增的接口

  • 默认访问权限:公开(public)
  • 是否可被普通应用直接访问:✅ 是
  • 说明
    • 这些接口属于系统公开 API。
    • 普通应用可以直接调用这些类和方法。
    • 系统应用可以直接调用这些类和方法。

示例:

package android.app;public class MyManager {public void doSomething() { ... }
}

该方法 doSomething() 可以被任意普通 App 调用。


2. 其他包下新增的接口(如 frameworks/base/core/java/com/android/server, frameworks/base/core/java/com/android/internal,只要不是 frameworks/base/core/java/android.*都是默认隐藏的接口)

  • 默认访问权限:隐藏(hidden)
  • 是否可被普通应用直接访问:❌ 否
  • 是否可被系统应用直接访问:✅ 是
  • 说明
    • Android 从 10 开始加强了对隐藏 API 的限制(Hidden API Policy)。
    • 即使你在 SDK 中能看到这些类或方法,运行时也会被限制访问。
    • 只有系统应用能正常访问

3. 如何开放隐藏接口给普通应用?

使用注解:

@UnsupportedAppUsage

作用:

  • 标记该方法为“被系统使用”,并允许通过反射等方式被普通应用访问。
  • 在构建时,该注解会保留到 public-api.xmlsystem-api.xml 中,避免被标记为 hidden。

示例:

package com.android.server.myfeature;import android.annotation.UnsupportedAppUsage;public class MyInternalService {@UnsupportedAppUsagepublic void exposeToApp() {// 可以被普通 App 调用}
}

添加此注解后,普通应用可以通过以下方式调用:

  • 反射调用;
  • 在调试模式下(开启 --runtime-flags allow-incompatible-changes)直接调用。

⚠️ 注意事项

项目说明
注解用途用于兼容性过渡,不建议长期依赖
兼容性风险使用隐藏 API 有版本升级不兼容的风险
官方推荐如果需要开放接口,应申请加入 SDK Public API
Android 版本限制Android 10 及以上加强了 hidden API 控制,需特别注意

🧩 延伸建议

如果你是在系统框架层修改代码,并希望某个接口能被第三方 App 调用,请确保:

  1. 接口所在的类/包不是 @hide
  2. 方法上加上 @UnsupportedAppUsage
  3. 构建时确认其出现在 public-api.xml 中;
  4. App 编译时能找到对应的类和方法(可通过反射或定制 framework.jar)。

相关文章:

  • Excel 透视表以及透视图应用(基础版)
  • 实验设计如何拯救我的 CEI VSR 28G 设计
  • Springboot——整合websocket并根据type区别处理
  • Git忽略规则.gitignore不生效解决
  • Dockerfile基础
  • 【Docker 从入门到实战全攻略(二):核心概念 + 命令详解 + 部署案例】
  • 【计算机网络】HTTPS
  • FTPS、HTTPS、SMTPS以及WebSockets over TLS的概念及其应用场景
  • JUC并发编程(二)Monitor/自旋/轻量级/锁膨胀/wait/notify/等待通知机制/锁消除
  • 结构型设计模式之Proxy(代理)
  • 基于VMD-LSTM融合方法的F10.7指数预报
  • 证券交易柜台系统解析与LinkCounter解决方案开发实践
  • 基于Axure+墨刀设计的电梯管理系统云台ERP的中保真原型图
  • Axure 下拉框联动
  • 如果安装并使用RustDesk
  • nt!CcInitializeCacheMap函数分析初始化Vacbs结构
  • 机器学习实战37-基于情感字典和机器学习的股市舆情分析可视化系统
  • CSP严格模式返回不存在的爬虫相关文件
  • 豆包突然没法用了,一打开就提示网络连接错误
  • 如何从零开始建设一个网站?
  • 济南槐荫区做网站的/网络推广最好的网站有哪些
  • 武汉网站seo服务/注册域名后怎么建网站
  • 极简风格 网站/电话营销
  • 做网站加入视频无法播放/汽车seo是什么意思
  • 做建网站的工作一年赚几百万/系统优化是什么意思
  • 网站免费备案/山东一级造价师