searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Android系统自定义jar添加流程

2023-03-27 01:56:51
517
0

引言

通常我们进行Android应用开发的时候,需要导入Android SDK,也就是android.jar,是一个动态jar包。android.jar提供了framework层的接口能力,其中framework.jar和services.jar是两个重要的jar包,分别做接口暴露和接口实现。

通过adb连接手机,分别输入$BOOTCLASSPATH和$SYSTEMSERVERCLASSPATH可以查看framework.jar和services.jar的实际路径。

$BOOTCLASSPATH

$SYSTEMSERVERPATH

简单理解:

导入的android.jar提供接口声明,应用工程里导入和实现接口调用,在App编译打包的时候骗过编译机制(使编译打包通过),其实接口代码实现并不在App的代码中,而等到App在系统中运行时,调用接口的真正实现在系统的framework.jar和services.jar里面。这也是动态jar包的概念。

我们是否也可以添加自定义的framework.jar和services.jar?如my-framework.jar和my-services.jar。
答案是肯定的,而且好处甚多。

  1. 打包自己的jar包提供给第三方应用导入,实现接口暴露。
  2. 自己的代码和原生代码分开管理。

那么下面就参考原生的做法,在Android 9工程源码上添加自己的系统jar包。

1. 添加my-framework和my-services模块

1.1 代码目录结构

我们可以在aosp的任意目录下构建自己的jar包路径,一般在frameworks或者vendor目录下。

以下是在vendor目录下定义myjar模块。

vendor/myjar/
└── source
    └── frameworks
        ├── Android.bp
        ├── core
        │   └── java
        │       └── android
        │           └── content
        │               └── ContextEx.java
        └── services
            ├── Android.bp
            └── core
                └── java
                    └── com
                        └── android
                            └── server
                                └── MyManagerService.java

1.2 添加Android.bp

一、在vendor/myjar/source/frameworks/Android.bp中定义my-framework

java_library {
    name: "my-framework",
    srcs: [
        // EX-FRAMEWORK_BASE_SUBDIRS
        "core/java/**/*.java",
        "core/java/**/*.aidl",
    ],
    exclude_srcs: [
    ],
    static_libs: [
    ],
    dxflags: [
        "--core-library",
        "--multi-dex",
    ],
}

二、在vendor/myjar/source/frameworks/services/Android.bp中定义my-services

java_library {
    name: "my-services",
    srcs: [
        // From build/make/core/pathmap.mk FRAMEWORK_BASE_SUBDIRS
        "core/java/**/*.java"
    ],
    exclude_srcs: [
    ],
    libs: [
       "my-framework",
       "services",
    ],
    // Loaded with System.loadLibrary by android.view.textclassifier
    required: [
    ],

    dxflags: [
        "--core-library",
        "--multi-dex",
    ],
}

注意my-services中会引用my-framework和原生services的类,因此需要声明依赖的jar。

2. 加入编译环境

2.1 加入PRODUCT_PACKAGES

my-framework和my-services模块声明并单独编译通过后,接下来就加入导工程的编译环境中,这样我们全编工程后就会生成这两个模块。
我们可以在源码工程的device或者build目录下查找“PRODUCT_PACKAGES”关键字,找对应产品的makefile文件在里面添加即可。

+PRODUCT_PACKAGES += \
    my-framework \
    my-services \

2.2 加入BOOTCLASSPATH

my-framework模块作为接口声明jar,添加到BOOTCLASSPATH。
路径:build/make/target/product/core_minimal.mk

# The order of PRODUCT_BOOT_JARS matters.
# add my-framework
PRODUCT_BOOT_JARS := \
    $(TARGET_CORE_JARS) \
    ext \
    framework \
    my-framework \
    telephony-common \
    voip-common \
    ims-common \

1.Android 12的添加路径有差异,可以在build下搜索PRODUCT_BOOT_JARS关键字
2.注意添加的顺序,从上至下代表系统加载优先级,也表示依赖关系(下依赖上)

2.3 加入SYSTEMSERVERCLASSPATH

my-services模块作为接口实现,添加到SYSTEMSERVERCLASSPATH。
路径:build/make/target/product/core_minimal.mk

# The order of PRODUCT_SYSTEM_SERVER_JARS matters.
# add by quexiaolong 
PRODUCT_SYSTEM_SERVER_JARS := \
    services \
    my-services \
    ethernet-service \
    wifi-service \

1.Android 12的添加路径有差异,可以在build下搜索PRODUCT_SYSTEM_SERVER_JARS 关键字
2.注意添加的顺序,从上至下代表系统加载优先级,也表示依赖关系(下依赖上)

以上就是在Android系统添加自定义jar的基本流程,不同的Android版本会有差别。

0条评论
0 / 1000
hi_long
13文章数
0粉丝数
hi_long
13 文章 | 0 粉丝