Android 11 Framework 增加自定义API到系统中

本文描述了作者如何在Android11源码基础上创建自定义模块,如何处理未公开API的权限问题,以及通过系统签名和文档配置来确保应用与新系统兼容的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于 Android 11 源码

根据网上的教程, 自己先捣鼓一波:

frameworks\base\services 创建 hzyd文件夹
在这里插入图片描述

Android.bp内容:

android_library_import {
    name: "services.hzyd",
    aars: ["MobileSDK-release.aar"],
    sdk_version: "current",
}
  1. 修改 frameworks\base\Android.bp
    在这里插入图片描述
    在任意java_library 节点引用这个模块即可

  2. 重新编译 make j80
    重新编译系统, 成功后,验证代码有没有增加到framework.jar中
    在这里插入图片描述

直接用jd-gui 打开是看不到的, 里面分了很多个 classes.dex
在这里插入图片描述

将framework.jar 解压出来, 用 d2j-dex2jar 反编译成jar
在这里插入图片描述

没毛病, 自定义的相关类都在framework.jar里了.

  1. 刷机 将 out\target\product\rk3568_r\super.img 刷入系统.
    在这里插入图片描述

  2. 验证SDK是否能调用
    在这里插入图片描述

compileOnly 表示只参与编译不参与打包

直接运行APP看看效果
在这里插入图片描述

毫无疑问, 直接崩溃了, 原因是这个属于未公开的API, android 11不让上层应用调用.

将测试应用切换成系统签名后重新运行.
在这里插入图片描述
在这里插入图片描述

由于客户的应用是自己的签名, 并不属于系统应用, 于是重新修改编译, 将源代码直接复制到framework中.

将代码复制到 frameworks\base\core\java 目录下
设置基线检查, 忽略自定义包名

修改: frameworks\base\StubLibraries.bp 
packages_to_document{
    "com.xxxxx", //你的包名
}

修改: frameworks\base\Android.bp
metalava_framework_docs_args = ... +
	"--api-lint-ignore-prefix com.xxxx. "
  1. 更新系统API 执行 make update-api

  2. 重新编译 make -j80

  3. 刷入 super.img 验证OK 特此记录.

Android 11引入了一些新的框架和API,使得开发者能够更容易地添加自定义系统服务。要创建并调用一个自定义系统服务,你可以按照以下步骤操作: 1. **创建Service组件**: 首先,你需要创建一个新的Service类,继承自`android.app.Service`。例如,假设你创建了一个名为`MyCustomService`的服务: ```java public class MyCustomService extends Service { // 定义必要的生命周期回调函数,如onStartCommand() 和 onBind() @Override public int onStartCommand(Intent intent, int flags, int startId) { // 在这里处理启动请求 return START_STICKY; } @Nullable @Override public IBinder onBind(Intent intent) { // 返回Binder,以便外部应用通过Intent绑定到服务 return new MyCustomBinder(); } private class MyCustomBinder extends Binder { // 提供一些方法供外界应用程序调用 public void performCustomAction(String action) { // 自定义业务逻辑 } } } ``` 2. **添加权限和声明**: 在AndroidManifest.xml中,你需要为服务添加相应的权限,并在<application>标签内声明它: ```xml <uses-permission android:name="android.permission.BIND_SERVICE" /> ... <service android:name=".MyCustomService" android:permission="android.permission.BIND_SERVICE"> <intent-filter> <action android:name="com.example.MY_CUSTOM_ACTION" /> </intent-filter> </service> ``` 3. **在App中调用服务**: 为了在你的应用中调用这个服务,你需要发送一个意图(Intent)。例如,在`MainActivity`或`Fragment`中: ```java Intent serviceIntent = new Intent(this, MyCustomService.class); serviceIntent.setAction("com.example.MY_CUSTOM_ACTION"); startService(serviceIntent); // 或者如果服务支持绑定,你可以这样做: IBinder binder = getApplicationContext().bindService(serviceIntent, new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { ((MyCustomBinder) service).performCustomAction("your_action_here"); } @Override public void onServiceDisconnected(ComponentName name) { // 服务断开连接时调用 } }, Context.BIND_AUTO_CREATE); ``` 注意:确保在API级别低于29的应用中,遵循兼容模式并适配旧版本的Android
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值