首页 > 其他分享 >Android11 - 添加自定义服务注意事项

Android11 - 添加自定义服务注意事项

时间:2024-04-07 18:38:06浏览次数:26  
标签:UID 自定义 Android11 xxx APK 注意事项 test Android android

添加自定义服务注意事项:

a:(Android 11)快速编译framework.jar ./prebuilts/build-tools/linux-x86/bin/ninja -f out/combined-xx.ninja framework-minus-apex

b:在framework/base/core目录下添加文件java和aidl文件后,编译时需要先make update-api去更新current.txt文件,然后才能完整编译android,但Android 11 以后谷歌强制开启lint检查,lint检查不过编译会报错,可以让lint检查忽略掉自己的模块在framework/base下的Android.bp忽略掉代码检查,或者可以添加@hide 避免报错:

metalava_framework_docs_args = 
...
"--api-lint-ignore-prefix junit. " +
"--api-lint-ignore-prefix com.xxx.test. " //其中 com.xxx.test是包名的前缀。

c:编译的时候报错:

out/target/common/obj/JAVA_LIBRARIES/framework-minus-apex_intermediates/classes.jar contains class file com/xxx/test/XXXApiManager.class,
whose package name com.xxx.test is empty or not in the allow list build/make/core/tasks/check_boot_jars/package_allowed_list.txt of packages allowed on the bootclasspath.

怎么解决,看报错去找这个 build/make/core/tasks/check_boot_jars/package_allowed_list.txt,找到这个文件,添加

###################################################
# framework.jar
javax\.microedition\.khronos\.opengles
...
# Packages used for Android in Chrome OS
 org\.chromium\.arc
 org\.chromium\.arc\..*
# Packages user for test add
com\.xxx\.test            //add
com\.xxx\.test\..*        //add

参考1

d:在Framework中新增AIDL接口,默认是non-sdk的接口,APK在调用使用时会因Restrictions on non-SDK interfaces功能导致Crash,日志中有如下打印信息:

Accessing hidden method 类完整路径 -> 方法名()V (blacklist, linking, denied)

如何让隐藏方法允许应用层调用?在 /frameworks/base/config/hiddenapi-greylist-packages.txt 添加对应的名单,注意不能有空行!!!

Lcom/xxx/test/XXXApiManager;-><init>(Landroid/content/Context;)V
Lcom/xxx/test/XXXApiManager;->setVolume(I)V

或者直接加包名前缀:

com.xxx.test

参考2

参考3

e:调用aidl的方法,报错java.lang.SecurityException: Permission Denial: package=android does not belong to uid=10132,调用端没有权限导致的!!!

如果没办法再调用端更新权限,就修改被调用端的系统服务,采取Handler的方式执行函数:

frameworks\base\core\java\com\xxx\test\
		XXXApiManager.java
		IXXXApiService.aidl
frameworks\base\services\core\java\com\android\server\xxx\test\
		XXXApiService.java
		
public class XXXApiService extends IXXXApiService.Stub {
	...
	final H mHandler = new H();
	
	@Override
    public void testJJ(int mode) throws RemoteException {
        Message msg = Message.obtain();
        msg.what = CORE_0;
        msg.obj = "linux";
        mHandler.sendMessage(msg);
    }
    
     final class H extends android.os.Handler {
        public static final int CORE_0 = 0;
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case CORE_0: {
                    realFunctionName();
                    break;
                } 
            }   
        }   
    }
    
    private void realFunctionName() {
     //do something
	} 
    ...
}

参考4

参考5

关于Android系统的UID:

系统进程UID有三种:

  • android:sharedUserId="android.uid.system"
  • android:sharedUserId="android.uid.shared"
  • android:sharedUserId="android.media"

UID

因此在android中PID,和UID都是用来识别应用程序的身份的,但UID是为了不同的程序来使用共享的数据。
对于一个APK来说,如果要使用某个共享UID的话,必须做一下两部步:
1、相同的在Manifest节点中增加android:sharedUserId属性。
2、相同的在Android.mk中增加LOCAL_CERTIFICATE的定义。(既签名相同)

系统源码可以看到一些系统应用就是这样:
系统中所有使用android.uid.system作为共享UID的APK,都会首先在manifest节点中增加 android:sharedUserId=“android.uid.system”,然后在Android.mk中增加 LOCAL_CERTIFICATE := platform。可以参见Settings等

系统中所有使用android.uid.shared作为共享UID的APK,都会在manifest节点中增加 android:sharedUserId=“android.uid.shared”,然后在Android.mk中增加 LOCAL_CERTIFICATE := shared。可以参见Launcher等

系统中所有使用android.media作为共享UID的APK,都会在manifest节点中增加 android:sharedUserId=“android.media”,然后在Android.mk中增加LOCAL_CERTIFICATE := media。可以参见Gallery等。

关于签名:
build/target/product/security目录中有四组默认签名供Android.mk在编译APK使用:

1、testkey:普通APK,默认情况下使用。
2、platform:该APK完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,这种方式编译出来的APK所在进程的UID为system。
3、shared:该APK需要和home/contacts进程共享数据。
4、media:该APK是media/download系统中的一环。

UID参考

f:封装自定义服务,提供jar供第三方应用开发者调用

Android11.0Frameworks中添加一个自定义系统服务,并提供jar包供应用开发调用_安卓framework自定义manager-CSDN博客

Android系统自定义jar添加流程)

Android原生系统开发如何优雅的提供系统级的API供第三方程序调用?

[Android AIDL系列 1] 手动编译aidl文件,生成Java、C++[android]、C++[ndk]、Rust接口_aidl c++-CSDN博客

android源码中编译jar

标签:UID,自定义,Android11,xxx,APK,注意事项,test,Android,android
From: https://www.cnblogs.com/kato-T/p/18119646

相关文章

  • csdn博客自定义模块:显示实时天气、日历、随机语录代码
    目录1.样式说明2.效果展示3.代码下载1.样式说明vip会员或者博客专家可以自定义模块代码,比如我博客的样式,有这几部分组成:灯笼祝福(我这里是龙年快乐,可以自定义更改任何字)、滚动欢迎语(我这里是欢迎访问我的博客,可以自定义更改任何欢迎语)github链接、知乎链接、邮箱发......
  • 自定义排序
    问题:按照A列的排序依据进行排序函数公式:=SORTBY(C2:D8,MATCH(C2:C8,A2:A8,))自定义序列排序:设置自定义序列(如需要): 选取A2:A8》文件》选项》自定义序列》导入自定义排序:选取数据》数据》排序》自定义排序……次序设置为自定义序列......
  • Promise详解与自定义封装
    文章目录概要一、Promise详解1.构造函数1.1语法1.2参数1.3返回值2.属性2.1[[PromiseState]]2.2[[PromiseResult]]3.方法3.1Promise.prototype.then3.1.1语法3.1.2参数3.1.3返回值3.2Promise.prototype.catch3.2.1语法3.2.2参数3.2.3返回值3.3Promis......
  • Avalonia的自定义用户组件
    Avalonia中的自定义用户控件Avalonia是一个跨平台的.NETUI框架,它允许开发者使用C#和XAML来构建丰富的桌面应用程序。自定义用户控件(UserControl)是Avalonia中一种重要的组件,它允许我们将多个控件组合成一个可重用的单元。本文将介绍如何在Avalonia中定义和使用自定义用户控件,并......
  • 信息化系统项目验收阶段的一些注意事项总结分享
    在信息化系统项目的生命周期中,项目验收是确保项目质量、满足客户需求并成功交付的重要环节。作为项目经理,须深知项目验收的复杂性和重要性,以下是我根据过往经验,对信息化系统项目验收注意事项的总结。一、验收过程中需归档的一些主要材料在项目验收过程中,为确保项目的可追溯性和......
  • 【C语言】:自定义类型__结构体
    这里写目录标题1、结构体的声明1.1结构体的声明1.2特殊的声明2、结构体变量的定义和初始化3、结构的自引用4、结构体内存对齐4.1结构体内存的对齐规则4.2为什么存在内存对齐4.3修改默认对齐数5、结构体传参6、结构体实现位段6.1什么是位段6.2位段的内存分配6.3......
  • PVE安装PBS注意事项
    注意事项:1.HA需要三节点,添加PBS需要3节点在线2.PBS先创建目录,取消创建数据存储;再单独添加数据存储;3.debian使用vimDebian安装PBS:安装系统时选择debian源参考链接:https://pbs.proxmox.com/docs/installation.html#id31.安装工具;su-apt-getinstallnet-toolsvim-......
  • 代码手术刀—自定义你的代码重构工具
    前言笔者近日在做代码仓库的存量代码缩减工作,首先考虑的是基于静态扫描的缩减,尝试使用了很多工具来对代码进行优化,例如PMD、IDEA自带的inspect功能、findBugs等。但是无一例外,要么过于“保守”,只给出扫描结果,但是无法实现一键优化,要么直接就是有bug(这里特指IDEA2023.1.5专业版-in......
  • Vue input密码输入框自定义密码眼睛icon
    我们用的饿了么UI组件库里,密码输入框的icon是固定不变的,如下所示:点击"眼睛"这个icon不变,现在需求是UI给的设计稿里,密码输入框的"眼睛"有如下两种:代码如下:<el-input:key="passwordType"ref="password"......
  • 使用POI填充Word文档,一些注意事项以及解决办法
    有这样一个需求:需要将用户输入的数据填写到准备好的Word模版中并提供下载,最终选择POI-tl和POI来完成上述需求。在这个过程中,主要遇到了以下两个问题:1.Word的两个格式doc和docx(两种文件的区别大家可以自行百度了解下),POI并没有提供统一的处理类。分别用HWPFDocument处理doc......