首页 > 其他分享 >MTK Android 12 环境中编译生成 NVRAM 相关 JAR 文件调用的完整步骤

MTK Android 12 环境中编译生成 NVRAM 相关 JAR 文件调用的完整步骤

时间:2024-07-05 10:56:53浏览次数:27  
标签:core 12 java mediatek JAR hardware NVRAM android os

在本文中,我将详细介绍如何在 MTK 方案 Android 12 环境中,从初始配置到生成 [email protected]_intermediates/classes.jar 文件给应用调用INvram agent = INvram.getService();的完整过程。

最开始想解决这个问题的原由,是因为想在AS里调用 INvram agent = INvram.getService();,这个文件之前的版本是在, out\target\common\obj\JAVA_LIBRARIES\[email protected]_intermediates\classes.jar ,但是搜遍了out目录下没有,所以打算研究一下怎么生成。

1. 初始配置

首先,系统 NVRAM 源码在 vendor/mediatek/proprietary/hardware/interfaces/nvram/1.0 文件夹下有一个基本的 Android.bp 文件来描述 NVRAM 的 HAL 接口,并启用 Java 生成:

// This file is autogenerated by hidl-gen -Landroidbp.

hidl_interface {
    name: "[email protected]",
    root: "vendor.mediatek.hardware",
    srcs: [
        "INvram.hal",
    ],
    interfaces: [
        "[email protected]",
    ],
    gen_java: true,
}

2. 生成 Java 文件

使用 hidl-gen 工具生成 Java 文件 INvram.java

hidl-gen -o ./gen -Ljava -r vendor.mediatek.hardware:vendor/mediatek/proprietary/hardware/interfaces [email protected]

执行上述命令后,生成的 Java 文件应位于 vendor/mediatek/proprietary/hardware/interfaces/nvram/1.0/gen/vendor/mediatek/hardware/nvram/V1_0 目录中。

3. 修改 Android.bp 文件

为确保生成的 Java 文件能够被打包成 JAR 文件,需要在 Android.bp 文件中添加 java_libraryjava_library_static 模块:

// 增加 java_library 的定义
java_library {
    name: "[email protected]",
    srcs: [
        "gen/vendor/mediatek/hardware/nvram/V1_0/*.java",
    ],
    sdk_version: "system_current",
    static_libs: [
        "android.hidl.base-V1.0-java",
        "android.hidl.manager-V1.0-java",
    ],
}

// 增加 java_library_static 的定义
java_library_static {
    name: "[email protected]",
    srcs: [
        "gen/vendor/mediatek/hardware/nvram/V1_0/*.java",
    ],
    sdk_version: "system_current",
    static_libs: [
        "android.hidl.base-V1.0-java-static",
        "android.hidl.manager-V1.0-java-static",
    ],
}

4. 编译

在修改完 Android.bp 文件后,清理编译环境并重新编译项目:

rm -rf out/target/common/obj/JAVA_LIBRARIES/[email protected]*

make [email protected]
make [email protected] // 不用编这个也可

5. 生成的输出

编译成功后,检查生成的 JAR 文件:

ls out/target/common/obj/JAVA_LIBRARIES/[email protected]_intermediates/classes.jar
ls out/soong/.intermediates/vendor/mediatek/proprietary/hardware/interfaces/nvram/1.0/[email protected]

输出目录中应包含以下内容:

[email protected]                 [email protected]
[email protected]_genc++          [email protected](新增)
[email protected]_genc++_headers  [email protected](新增)

遇到的问题及解决方案

问题1

编译出 [email protected]_intermediates/classes.jar 后,放到 AS 准备调试接口时,遇到以下错误:

SNParamUtils.java:22: error: cannot access IHwInterface
            INvram agent = INvram.getService();
                                 ^
  class file for android.os.IHwInterface not found

提示找不到 IHwInterface.java。在 Android 8.1 中,该文件位于 hwbinder_intermediates 目录中,而在 Android 12 中则使用 framework-minus-apex_intermediates 中的 classes.jar

解决方法

最开始的解决办法是,将 framework-minus-apex_intermediates 中的 classes.jar[email protected]_intermediates 中的 classes.jar 同时拷入到 AS 项目中。后来决定将这些类打包成一个 classes.jar,最终在 framework/base/Android.bp 增加一个名为 hwbinderjava_library

问题2

在编译 [email protected] 时,遇到以下错误:

make [email protected]
module [email protected] missing dependencies: android.hidl.base-V1.0-java-static

提示缺少 android.hidl.base-V1.0-java-static 依赖项。

解决方法

确保在 Android.bp 文件中正确引用并添加 android.hidl.base-V1.0-java-static 模块:

java_library_static {
    name: "[email protected]",
    srcs: [
        "gen/vendor/mediatek/hardware/nvram/V1_0/*.java",
    ],
    sdk_version: "system_current",
    static_libs: [
        "android.hidl.base-V1.0-java-static",
        "android.hidl.manager-V1.0-java-static",
    ],
}
问题3

编译 hwbinder 模块时,遇到依赖文件缺失问题:

java_library {
    name: "hwbinder",
    srcs: [
        "core/java/android/os/HidlSupport.java",
        "core/java/android/annotation/NonNull.java",
        "core/java/android/os/HwBinder.java",
        "core/java/android/os/HwBlob.java",
        "core/java/android/os/HwParcel.java",
        "core/java/android/os/IHwBinder.java",
        "core/java/android/os/IHwInterface.java",
        "core/java/android/os/DeadObjectException.java",
        "core/java/android/os/DeadSystemException.java",
        "core/java/android/os/RemoteException.java",
        "core/java/android/util/AndroidException.java",
    ],
    sdk_version: "module_current", // 调整为 module_current
    dxflags: ["--core-library"],
    installable: false,
}

因为在编译名为 hwbinderjava_library 时,少了一些依赖文件导包,导致编译报错:

@NonNull
 ^
符号:   类 NonNull
位置: 类 RemoteException
frameworks/base/core/java/android/os/HwParcel.java:54: 错误: 找不到符号
@UnsupportedAppUsage
 ^
符号:   类 UnsupportedAppUsage
位置: 类 HwParcel
frameworks/base/core/java/android/os/HwParcel.java:141: 错误: 找不到符号
public native final void writeNativeHandle(@Nullable NativeHandle val);
                                            ^
符号:   类 Nullable
位置: 类 HwParcel
frameworks/base/core/java/android/os/HwParcel.java:314: 错误: 找不到符号
public final void writeNativeHandleVector(@NonNull ArrayList<NativeHandle> val) {
解决方法

找到这些文件,追加引用。假设 SystemApi.java 等文件位于 frameworks/libs/modules-utils/java/android/annotation/ 目录中,设置相对路径。在 frameworks/base/Android.bp 文件中定义 hwbinder 模块:

// 在 frameworks/base/Android.bp 文件中定义 hwbinder 模块

java_library {
    name: "hwbinder",
    srcs: [
        "core/java/android/os/HidlSupport.java",
        "core/java/android/annotation/NonNull.java",
        "core/java/android/os/HwBinder.java",
        "core/java/android/os/HwBlob.java",
        "core/java/android/os/HwParcel.java",
        "core/java/android/os/IHwBinder.java",
        "core/java/android/os/IHwInterface.java",
        "core/java/android/os/DeadObjectException.java",
        "core/java/android/os/DeadSystemException.java",
        "core/java/android/os/RemoteException.java",
        "core/java/android/util/AndroidException.java",
        // 添加对 android.annotation 包的依赖
        "../../libs/modules-utils/java/android/annotation/SystemApi.java",
        "../../libs/modules-utils/java/android/annotation/NonNull.java",
        "../../libs/modules-utils/java/android/annotation/Nullable.java",
        "../../libs/modules-utils/java/android/compat/annotation/UnsupportedAppUsage.java",
    ],
    sdk_version: "module_current",
    dxflags: ["--core-library"],
    installable: false,
}

继续编译,出现问题 4。

问题4

在编译过程中,遇到路径引用错误:

Path is outside directory: ../../libs/modules-utils/java/android/annotation/SystemApi.java

提示引用路径错误,路径不能在模块目录之外。

解决方法

使用 filegroup 来定义文件集合并引用这些文件:

  1. frameworks/libs/modules-utils 中创建或更新 Android.bp

    filegroup {
        name: "modules-utils-annotation",
        srcs: [
            "java/android/annotation/SystemApi.java",
            "java/android/annotation/NonNull.java",
            "java/android/annotation/Nullable.java",
            "java/android/annotation/IntDef.java",
        ],
        visibility: ["//frameworks/base"], // 设置可见性
    }
    
  2. 更新 hwbinder 模块

    frameworks/base/Android.bp 文件中定义 hwbinder 模块:

    java_library {
        name: "hwbinder",
        srcs: [
            "core/java/android/os/HidlSupport.java",
            "core/java/android/os/HwBinder.java",
            "core/java/android/os/HwBlob.java",
            "core/java/android/os/HwParcel.java",
            "core/java/android/os/IHwBinder.java",
            "core/java/android/os/IHwInterface.java",
            "core/java/android/os/DeadObjectException.java",
            "core/java/android/os/DeadSystemException.java",
            "core/java/android/os/RemoteException.java",
            "core/java/android/util/AndroidException.java",
            ":modules-utils-annotation", // 引用 filegroup
        ],
        sdk_version: "module_current",
        dxflags: ["--core-library"],
        installable: false,
    }
    

继续编译,出现问题 5。

问题5

在编译过程中,遇到以下错误:

frameworks/base/core/java/android/os/HwBinder.java:20: 错误: 程序包 android.compat.annotation 不存在
import android.compat.annotation.UnsupportedAppUsage;

还需要创建一个包含 UnsupportedAppUsagefilegroup 并将其添加到 hwbinder 模块中来解决这个问题。但是文件位于 tools/platform-compat/java/android/compat/annotation/UnsupportedAppUsage.java,只能在 tools/platform-compat/Android.mk 中增加一个名为 modules-utils-compat-annotationjava_library

解决方法
+++ b/tools/platform-compat/Android.mk

# 在 tools/platform-compat/Android.mk 文件中增加
LOCAL_PATH := $(call my-dir)

# 定义一个文件组
include $(CLEAR_VARS)
LOCAL_MODULE := modules-utils-compat-annotation
LOCAL_SRC_FILES := \
    java/android/compat/annotation/UnsupportedAppUsage.java
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
include $(BUILD_JAVA_LIBRARY)
问题6

在编译过程中,遇到以下错误:

tools/platform-compat/Android.mk: error: modules-utils-compat-annotation: Invalid LOCAL_SDK_VERSION 'module_current' Choices are: 10 11 12 13 14 15 16 17 18 19 20 21 22 23 system_23 24 25 26 27 28 system_28 29 system_29 test_29 30 system_30 test_30 31 system_31 test_31 4 5 6 7 8 9 core_current current system_current test_current 

提示 LOCAL_SDK_VERSION 设置无效。

解决方法

确保在 Android.mk 文件中使用有效的 LOCAL_SDK_VERSION。例如,可以使用 system_current 或其他有效值:

  1. 更新 Android.mk 文件

    # 在 tools/platform-compat/Android.mk 文件中
    
    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    LOCAL_MODULE := modules-utils-compat-annotation
    LOCAL_SRC_FILES := \
        java/android/compat/annotation/UnsupportedAppUsage.java
    LOCAL_MODULE_CLASS := JAVA_LIBRARIES
    LOCAL_SDK_VERSION := system_current
    include $(BUILD_JAVA_LIBRARY)
    

确保依赖模块的 sdk_version 一致,检查 modules-utils-compat-annotationhwbinder 模块的 Android.bp 文件,确保它们的 sdk_versionhwbinder 一致。

问题7

在编译过程中遇到了一些问题,最终决定不使用 tools/platform-compat/Android.mk 添加 java_library,而是引用现有的库。

解决方法
// 在 frameworks/base/Android.bp 文件中定义 hwbinder 模块

java_library {
    name: "hwbinder",
    srcs: [
        "core/java/android/os/HidlSupport.java",
        "core/java/android/os/HwBinder.java",
        "core/java/android/os/HwBlob.java",
        "core/java/android/os/HwParcel.java",
        "core/java/android/os/IHwBinder.java",
        "core/java/android/os/IHwInterface.java",
        "core/java/android/os/DeadObjectException.java",
        "core/java/android/os/DeadSystemException.java",
        "core/java/android/os/RemoteException.java",
        "core/java/android/util/AndroidException.java",
        ":modules-utils-annotation", // 引用 filegroup
        // ":modules-utils-compat-annotation", // 引用新的 filegroup
    ],
    libs: [
        // 引用新的解决 UnsupportedAppUsage.java 报错问题
        "app-compat-annotations",
        "framework-updatable-stubs-module_libs_api",
        "unsupportedappusage",
    ],
    sdk_version: "module_current",
    dxflags: ["--core-library"],
    installable: false,
}
问题8

在调用 HAL 服务时遇到 NoSuchElementException 错误:

java.util.NoSuchElementException
    at android.os.HwBinder.getService(Native Method)
    at android.os.HwBinder.getService(HwBinder.java:81)
    at vendor.mediatek.hardware.nvram.V1_0.INvram.getService(INvram.java:132)

提示未找到服务。

解决方法

单独编译了这些 JAR,放到 AS,但运行的系统没有更新到最新已包含这些 JAR 的固件系统,所以需要将系统升级到最新的固件。

总结

通过正确配置 Android.bp 文件,添加必要的依赖项,并清理和重新编译项目,成功生成了 [email protected]_intermediates/classes.jar 文件。这个文件可以提供给应用程序使用,从而实现与 NVRAM 相关的功能调用。这篇文章详细记录了从问题发现到解决的完整过程,希望对在 MTK Android 12 环境中进行类似开发的兄弟萌有所帮助。如果有更多问题,欢迎交流讨论。

标签:core,12,java,mediatek,JAR,hardware,NVRAM,android,os
From: https://blog.csdn.net/SHH_1064994894/article/details/140201664

相关文章

  • git新建分支的时候,使用fix/bug_123好还是fix_bug_123?
    在Git中创建分支时,选择分支名称的命名规范非常重要,因为它不仅有助于代码审查和协作,还能提高项目管理和追踪问题的效率。在给定的两个选项之间选择,fix/bug_123和fix_bug_123,通常推荐使用带有斜杠/的风格,即fix/bug_123,原因如下:语义清晰:使用/分隔符可以清楚地区分分支的......
  • 第12篇:对话生成的挑战与解决方案
    在自然语言处理(NLP)领域,对话生成是一项重要而富有挑战的任务。生成自然且连贯的对话,既需要模型理解上下文,又需要处理生成过程中的各种问题。本文将详细讲解对话生成中的主要挑战及其解决方案,探讨如何提升对话的一致性、自然性与连贯性。我们将通过具体的Python代码示例,展示如......
  • python - [12] 脚本一文通
    题记部分 一、文件夹&文件(1)删除空文件夹#删除目录中的空文件夹importosdefmove_epty_folders(directory_path):forroot,dirs,filesinos.walk(directory_path,topdown=False):forfolderindirs:folder_path=os.path.join(root,f......
  • Microsoft SQL Server 2012 中常用的 Transact-SQL 命令示例,涵盖了数据库管理和查询操
    MicrosoftSQLServer2012中常用的Transact-SQL命令示例,涵盖了数据库管理和查询操作:创建数据库sqlCopyCodeCREATEDATABASEYourDatabaseName;删除数据库sqlCopyCodeDROPDATABASEYourDatabaseName;创建表sqlCopyCodeCREATETABLEEmployees(EmployeeIDIN......
  • 在 Microsoft SQL Server 2012 中,可以使用 sqlcmd 命令行工具来执行 Transact-SQL 脚
    sqlcmd实用工具-SQLServer|MicrosoftLearn在MicrosoftSQLServer2012中,可以使用sqlcmd命令行工具来执行Transact-SQL脚本和命令。这个工具提供了一种在命令行下管理和操作SQLServer的便捷方式。以下是一些sqlcmd命令的实例用法:连接到SQLServer实例bashC......
  • [题解]P1083 [NOIP2012 提高组] 借教室
    [题解]P1083[NOIP2012提高组]借教室解法\(1\):线段树-\(O((n+m)\logn)\)比较直观的一种做法,但是可能需要卡一下输入(这里没卡也过了,但要注意输入是\(10^6\)级的,为了保险一定要加)。#include<bits/stdc++.h>#definelc(x<<1)#definerc((x<<1)|1)#defineintlonglong......
  • 传奇发布网-www.sf1223.cn,海量优质私服发布平台12
    传奇新开私服发布网(sf1223.cn)作为一种非官方版本的传奇游戏,极大地丰富了游戏体验,并吸引了大批忠实的玩家。然而,众多新服平台的存在也给玩家们带来了选择困难。在海量优质好服发布平台中寻找适合自己的新服,成为玩家们最为关注的问题。首先,传奇新服的发布平台扮演着至关重要的角......
  • 传奇新开私服发布网(www.sf1223.cn)
    传奇新开私服发布网(sf1223.cn)作为一种非官方版本的传奇游戏,极大地丰富了游戏体验,并吸引了大批忠实的玩家。然而,众多新服平台的存在也给玩家们带来了选择困难。在海量优质好服发布平台中寻找适合自己的新服,成为玩家们最为关注的问题。首先,传奇新服的发布平台扮演着至关重要的角......
  • 【12321骚扰电话举报受理中心-短信验证安全分析报告】
    前言由于网站注册入口容易被黑客攻击,存在如下安全问题:暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞所以大部分网站及App都采取图形验证码或滑动验证码等交互解决方案,但在机器学习能力提......
  • osg使用整理(12):SSAO屏幕空间环境光遮蔽
    一、基础概念1、SSAO:通过将褶皱、孔洞和非常靠近墙面变暗的方法,近似模拟间接光照。SSAO称为屏幕空间环境光遮蔽,使用屏幕空间场景的深度而不是真实的几何体数据来确定遮蔽量,速度快效果好。2、实现原理:根据物体表面法线方向生成一个半球随机深度采样,主要看物体周围深度值大小,通......