jQuery鼠标指针特效

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

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

生成的jar包位置:
在out/target/common/obj/JAVA_LIBRARIES目录下找到framework-minus-apex_intermediates目录,11之前的好像是framework_intermediates目录 现在改成了这个framework-minus-apex_intermediates

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 android.app. " +     //add_text
"--api-lint-ignore-prefix junit. " +
"--api-lint-ignore-prefix com.xxx.test. " //其中 com.xxx.test是包名的前缀。

Android13源码添加系统服务

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供第三方应用开发者调用
在vendor目录添加zdz目录,创建Android.bp,编译生成jar包!

/vendor/zdz/Android.bp

java_library_static {
    name: "zdz-sdk-api",
    srcs: ["com/zdz/**/*.java"],
}

/vendor/zdz/com/zdz/api/ApiManager.java

package com.zdz.api;

import android.content.Context;
import com.xxx.test.XXXApiManager;

public class ApiManager {
    private static final String TAG = "XXXApiManager";

    private final Context mContext;

    private XXXApiManager mXXXApiManager;

    public ApiManager(Context context) {
        mContext = context;
        mXXXApiManager = (XXXApiManager) context.getSystemService("xxx_service");
    }

    public boolean test() {
        return mXXXApiManager.test();
    }
}

mma vendor/zdz/ 或者 make zdz-sdk-api 生成zdz-sdk-api. 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
在Android系统中实现AIDL接口回调

1.创建 XXXApiManager.java 和 IXXXApiService.aidl
2.创建对应的XXXApiService.java

3.注册服务:frameworks/base/core/java/android/app/SystemServiceRegistry.java
Context.xxx_TEST_SERVICE = "xxx_service"--->不想在Context.java中定义的话,直接用字符串,保证相同就行了
static {
...
        registerService("xxx_service", XXXApiManager.class,
                new CachedServiceFetcher<XXXApiManager>() {
                    @Override
                    public XXXApiManager createService(ContextImpl ctx)
                            throws ServiceNotFoundException {
                        IBinder b = ServiceManager.getServiceOrThrow("xxx_service");
                        return new XXXApiManager(ctx, IXXXApiService.Stub.asInterface(b));
                    }
                }); 

...
}

4.启动服务:frameworks/base/services/java/com/android/server/SystemServer.java,所有的系统服务都在这里初始化

XXXApiService xxxApi = null;//add
private void startOtherServices(@NonNull TimingsTraceAndSlog t){
            ...
+            traceBeginAndSlog("StartTestService");
+            try {
+                Slog.i(TAG, "add test Service");
+                xxxApi = new XXXApiService(context);
+                ServiceManager.addService("xxx_service", xxxApi);
+            } catch (Throwable e) {
+                reportWtf("starting test Service", e);
+            }
+            traceEnd();

            ...
}

5.添加编译规则,Android11的framework的Android.bp,默认全部加载,所以不需要去加了!!!
6.添加SELinux权限,其他的参考上面链接,这个这是简单梳理一下流程!!!

最后验证:全编译刷机验证,adb shell service list,查看系统中的服务列表!!!!

实现PRODUCT_BOOT_JARS/boot jar

Android STB 编译自定义jar

Android11编译导入PRODUCT_BOOT_JARS

Android 源码系统导入开机加载的第三方jar库_ims-common-CSDN博客

什么是boot.jar

手把手教你aosp13/14上实现PRODUCT_BOOT_JARS/boot jar-CSDN博客

字面意思理解就是一开机启动系统就已经自动加载好了的jar包.

具体验证方式:输入$BOOTCLASSPATH命令

127|rk3566_r:/ $ $BOOTCLASSPATH
/system/bin/sh: /apex/com.android.art/javalib/core-oj.jar:/apex/com.android.art/javalib/core-libart.jar:/apex/com.android.art/javalib/core-icu4j.jar ...:/system/framework/framework.jar:/system/framework/telephony-common.jar
:/apex/com.android.permission/javalib/framework-permission.jar

为什么要自定义boot.jar

客户的三方app需要调用系统层的方法,但是如果都集成到framework.jar,不够灵活,太耦合了。

为了方便移植和应用开发,在Android系统之外增加的部分framework,一般都会仿照framework打包为一个jar包供应用调用。

需要在device目录下的具体产品目录的mk中增加PRODUCT_BOOT_JARS的声明,

不仅如此还需要在build目录下的package_whitelist.txt中声明包名,否则编译会出错。同理,可以把不需要的在这里删掉。

device/rockchip/rk356x/rk3568_r/rk3568_r.mk

PRODUCT_BOOT_JARS += \
        text_mdm
        
./build/make/core/tasks/check_boot_jars/package_allowed_list.txt

# delete
# telephony-common.jar
com\.google\..*
# delete end
# add
com\.ttt\..*
com\.www\..*
com\.mdm\..*
# add end

编写自定义boot.jar流程

在过去的Android平台中,boot.jar是可以通过mk文件编写的,但是在Android P以后,必须通过Android.bp文件编写,否则不允许添加到PRODUCT_BOOT_JARS 变量中!

Step1:定义需要做成boot.jar的模块boottest

Step2:在device中用于指定编译哪些模块的mk文件(各公司各项目可能不一样)中添加boottest
以及权限文件

Step3:在mk文件中定义PRODUCT_BOOT_JARS的地方添加boottest,并将boottest加入白名单。
白名单文件路径:

Step4:在adb shell中通过指令adb shell $BOOTCLASSPATH验证BOOTCLASSPATH是否已包含所添加的boottest

[Android Framework]隐藏模块源码并封装为BootJar实战_android_DinDjarin-华为开发者空间

实际添加

//frameworks/base/cmds/boot_test/Android.bp

// Copyright 2008 The Android Open Source Project

java_library {
    name: "boot_jar",
    srcs: [
        "src/**/*.java",
    ],
    installable: true,
}


\frameworks\base\cmds\boot_test\src\com\test\BootTest.java

package com.test;

public class BootTest {
    public void testBootJar() {
        android.util.Log.i("txx", "testBootJar --- start test");
    }
}


+++ b/build/make/target/product/base_system.mk
@@ -17,6 +17,7 @@
 # Base modules and settings for the system partition.
 PRODUCT_PACKAGES += \
     adbd_system_api \
+    boot_jar \
     am \
     android.hidl.allocator@1.0-service \
     android.hidl.base-V1.0-java \
@@ -326,6 +327,7 @@ PRODUCT_BOOT_JARS := \
     ext \
     telephony-common \
     voip-common \
+    boot_jar \
     ims-common

    
+++ b/build/make/core/tasks/check_boot_jars/package_allowed_list.txt
@@ -246,3 +246,7 @@ com\.google\.i18n\.phonenumbers
 # Packages used for Android in Chrome OS
 org\.chromium\.arc
 org\.chromium\.arc\..*
+###################################################
+# Packages used for com.test
+com\.test
+com\.test\..*

       

测试demo

+++ b/packages/apps/Launcher3/Android.mk
@@ -135,6 +135,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := \
     SystemUI-statsd \
     SystemUISharedLib \
     launcherprotosnano \
+    boot_jar \
     launcher_log_protos_lite



+++ b/packages/apps/Launcher3/src/com/android/launcher3/Launcher.java
@@ -1827,6 +1827,7 @@ public class Launcher extends StatefulActivity<LauncherState> implements Launche
                 break;
         }
         TestLogging.recordMotionEvent(TestProtocol.SEQUENCE_MAIN, "Touch event", ev);
+        new com.test.BootTest().testBootJar();
         return super.dispatchTouchEvent(ev);
     }

只要触摸lauuncher3,就会打印如下日志 ,测试成功



2025-07-09 11:58:12.864  1045-1045  txx                     com.android.launcher3                I  testBootJar --- start test
2025-07-09 11:58:12.895  1045-1045  txx                     com.android.launcher3                I  testBootJar --- start test
2025-07-09 11:58:12.929  1045-1045  txx                     com.android.launcher3                I  testBootJar --- start test


C:\Users\Aaaa>adb shell
rk3568_r:/ $  $BOOTCLASSPATH
:/system/framework/voip-common.jar:/system/framework/boot_jar.jar:
Android.bp语法以及与mk语法之间的对比
java_library_static { //编译一个静态库
    name: "services.core.unboosted",//模块名称, 类似Android.mk中的LOCAL_MODULE

    aidl: {//aidl文件路径
        include_dirs: [//指定的文件查找路径
            "frameworks/base/cmds/idmap2/idmap2d/aidl",
        ],
    },
    srcs: [//源码
        "java/**/*.java",
        ":dumpstate_aidl",
    ],

    libs: [//动态库
        "services.net",
    ],

    required: [//前提条件
        "gps_debug.conf",
    ],

    static_libs: [//静态库
        "time_zone_distro",
    ],
}

java_genrule {//类似于file_group的用法
    name: "services.core.priorityboosted",
    srcs: [":services.core.unboosted"],
    tools: ["lockedregioncodeinjection"],
    cmd: "$(location lockedregioncodeinjection) " +
        "  --targets \"Lcom/android/server/am/ActivityManagerService;,Lcom/android/server/wm/WindowManagerGlobalLock;\" " +
        "  --pre \"com/android/server/am/ActivityManagerService.boostPriorityForLockedSection,com/android/server/wm/WindowManagerService.boostPriorityForLockedSection\" " +
        "  --post \"com/android/server/am/ActivityManagerService.resetPriorityAfterLockedSection,com/android/server/wm/WindowManagerService.resetPriorityAfterLockedSection\" " +
        "  -o $(out) " +
        "  -i $(in)",
    out: ["services.core.priorityboosted.jar"],
}

java_library {//编译生成一个库
    name: "services.core",
    static_libs: ["services.core.priorityboosted"],
}

prebuilt_etc {//预编译配置文件,权限文件也通过该方式
    name: "gps_debug.conf",
    src: "java/com/android/server/location/gps_debug.conf",
}




build/soong/androidmk/cmd/androidmk/android.go

//针对该场景和需求所需知道的MK与BP文件的部分对照内容,详情可直接阅读源码:

	"BUILD_JAVA_LIBRARY":             "java_library",
    "BUILD_STATIC_JAVA_LIBRARY":      "java_library_static",
    "BUILD_HOST_JAVA_LIBRARY":        "java_library_host",
    "BUILD_HOST_DALVIK_JAVA_LIBRARY": "java_library_host_dalvik",
    "BUILD_PACKAGE":                  "android_app",
    
	"SHARED_LIBRARIES": "cc_prebuilt_library_shared",
    "STATIC_LIBRARIES": "cc_prebuilt_library_static",
    "EXECUTABLES":      "cc_prebuilt_binary",
    "JAVA_LIBRARIES":   "prebuilt_java_library",


posted @ 2024-04-07 18:25  僵小七  阅读(654)  评论(0)    收藏  举报