Android 经典hal开发实战-千里马android framework车载车机手机系统开发

安卓HAL开发指南 安卓HAL开发指南 1、介绍 HIDL的全称是HAL interface definition language(硬件抽象层接口定义语言),在此之前Android 有AIDL,架构在Android binder 之上,用来定义Android 基于Binder通信的Client 与Service之间的接口。HIDL也是类似的作用,只不过定义的是Android Framework与Android HAL实现之间的接口。 2、实现方式 2.1 旧版 传统HAL层 Android 7.x和更早的版本中,hal 阅读详情
AI摘要

本文介绍了经典HAL在AndroidTreble计划后的持续重要性,尽管系统倾向于hidl和aidl,但由于其良好的移植性和稳定性,掌握经典HAL仍是必要的。文章详细解释了HALmodule的架构,包括hw_module_t,hw_module_methods_t,和hw_device_t结构,以及如何在硬件抽象层中使用它们。

背景

hi,粉丝朋友们:
大家好!今天来一个经典hal的实现,首先说一下哈,经典hal在正常在Treble计划后就不再建议使用了,高版本一般都是hidl,aidl。目前新版本一般都是强制使用aidl,那为啥还需要讲解这个经典hal呢?
1、虽然采用了treble计划后,system/vendor隔离后,但是因为经典hal是个so,而且代码一般不需要强依赖so,具有一个非常好的移植性,导致虽然变成了google要求的hidl,其实内部依然实现是经典hal的so
2、经典hal so在trable计划以前已经经历了很多个版本,业务执行的稳定性很好,基本上厂商没啥动力推倒重来,基于新的hidl,aidl再写一遍hal业务

总结:treble计划虽然系统已经大部分都是hidl,aidl实现方式,但是这个只是一个对外接口层面的,内部实现的话其实完全可以继续调用以前写好的经典hal,这个方式保证了稳定性,修改量小
在这里插入图片描述
所以基于以上背景,掌握经典hal的相关知识完全是有必要的,不然就可能会导致你根本看不懂很多hal实现

HAL module的架构分析

注意这里只进行依赖libhardware库这种方式实现,不讲解legacy方式

HAL module架构主要分为以下3个结构体:

struct hw_module_t
struct hw_module_methods_t
struct hw_device_t

3个结构体是写这个标准方式hal的最关键部分,它们定义是在
hardware/libhardware/include/hardware/hardware.h
在这里插入图片描述

下面3个进行详细介绍其功能和作用

hw_module_t部分

相关的定义代码如下:


/**
 * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM
 * and the fields of this data structure must begin with hw_module_t
 * followed by module specific information.
 */
typedef struct hw_module_t {
    /** tag must be initialized to HARDWARE_MODULE_TAG */
    uint32_t tag;

    /**
     * The API version of the implemented module. The module owner is
     * responsible for updating the version when a module interface has
     * changed.
     *
     * The derived modules such as gralloc and audio own and manage this field.
     * The module user must interpret the version field to decide whether or
     * not to inter-operate with the supplied module implementation.
     * For example, SurfaceFlinger is responsible for making sure that
     * it knows how to manage different versions of the gralloc-module API,
     * and AudioFlinger must know how to do the same for audio-module API.
     *
     * The module API version should include a major and a minor component.
     * For example, version 1.0 could be represented as 0x0100. This format
     * implies that versions 0x0100-0x01ff are all API-compatible.
     *
     * In the future, libhardware will expose a hw_get_module_version()
     * (or equivalent) function that will take minimum/maximum supported
     * versions as arguments and would be able to reject modules with
     * versions outside of the supplied range.
     */
    uint16_t module_api_version;
#define version_major module_api_version
    /**
     * version_major/version_minor defines are supplied here for temporary
     * source code compatibility. They will be removed in the next version.
     * ALL clients must convert to the new version format.
     */

    /**
     * The API version of the HAL module interface. This is meant to
     * version the hw_module_t, hw_module_methods_t, and hw_device_t
     * structures and definitions.
     *
     * The HAL interface owns this field. Module users/implementations
     * must NOT rely on this value for version information.
     *
     * Presently, 0 is the only valid value.
     */
    uint16_t hal_api_version;
#define version_minor hal_api_version

    /** Identifier of module */
    const char *id;

    /** Name of this module */
    const char *name;

    /** Author/owner/implementor of the module */
    const char *author;

    /** Modules methods */
    struct hw_module_methods_t* methods;

    /** module's dso */
    void* dso;

#ifdef __LP64__
    uint64_t reserved[32-7];
#else
    /** padding to 128 bytes, reserved for future use */
    uint32_t reserved[32-7];
#endif

} hw_module_t;

代码很少,注释很多,不过都是英文的,这里给大家总结一下,即常用的成员变量:

1、每一个hardware硬件抽象模块必须定义有一个模块结构体,名字是HAL_MODULE_INFO_SYM,即HMI,这个模块结构体第一个成员变量类型必须是hw_module_t
2、hw_module_t的tag的值必须为HARDWARE_MODULE_TAG,这个就是来标识是硬件抽象的结构体
3、id这个属性代表这个module的唯一性,即每个硬件抽象模块都会有自己的id
4、methods这个代表每个硬件抽象模块对应的方法结构体,类型hw_module_methods_t

常见定义和实现方式如下:

定义结构体:

#define INVCASE_HARDWARE_MODULE_ID  "mytest"  
struct mytest_module_t {
    struct hw_module_t common;
};

实例化HAL_MODULE_INFO_SYM:

/* every module must have HAL_MODULE_INFO_SYM */
struct mytest_module_t HAL_MODULE_INFO_SYM = {
    .common = {
        .tag = HARDWARE_MODULE_TAG,
        .version_major = 1,
        .version_minor = 0,
        .id = MYTEST_HARDWARE_MODULE_ID,
        .name = MYTEST_HARDWARE_MODULE_ID,
        .author = "test",
        .methods = &mytest_module_methods,
    },
};

hw_module_methods_t部分

typedef struct hw_module_methods_t {
    /** Open a specific device */
    int (*open)(const struct hw_module_t* module, const char* id,
            struct hw_device_t** device);

} hw_module_methods_t;

在结构体 hw_module_methods_t 中只有一个成员,它是一个函数指针,名字是open,它主要作用就是用来打开硬件抽象层中给的硬件设备。因为一个硬件抽象模块module可以包含多个设备device,所以这里需要指定id。

moudlue:代表打开硬件设备设备所属模块
id:代表打开设备的id
device:这个双重指针,一般是输出内容到这个参数里面,即返回值,用来描述一个打开的硬件设备

hw_device_t部分


/**
 * Every device data structure must begin with hw_device_t
 * followed by module specific public methods and attributes.
 */
typedef struct hw_device_t {
    /** tag must be initialized to HARDWARE_DEVICE_TAG */
    uint32_t tag;

    /**
     * Version of the module-specific device API. This value is used by
     * the derived-module user to manage different device implementations.
     *
     * The module user is responsible for checking the module_api_version
     * and device version fields to ensure that the user is capable of
     * communicating with the specific module implementation.
     *
     * One module can support multiple devices with different versions. This
     * can be useful when a device interface changes in an incompatible way
     * but it is still necessary to support older implementations at the same
     * time. One such example is the Camera 2.0 API.
     *
     * This field is interpreted by the module user and is ignored by the
     * HAL interface itself.
     */
    uint32_t version;

    /** reference to the module this device belongs to */
    struct hw_module_t* module;

    /** padding reserved for future use */
#ifdef __LP64__
    uint64_t reserved[12];
#else
    uint32_t reserved[12];
#endif

    /** Close this device */
    int (*close)(struct hw_device_t* device);

} hw_device_t;

其实这个和前面的hw_module_t高度相识,只不过一个代表整个模块一个代表模块的设备
同样总结一下hw_device_t:
1、每个硬件设备都必须自定义一个硬件设备的结构体,第一个成员变量为hw_device_t
2、tag必须为所在的硬件模块HARDWARE_DEVICE_TAG,代表他是个硬件设备结构体
3、会有一个close的函数指针,主要是关闭一个硬件设备
4、自定义设备结构体,除了第一个成员hw_device_t外,最重要就是会定义其他成员方法指针,这些方法就是用来对外提供操作硬件设备的

常见自定义的hw_device_t如下:

struct mytest_device_t {
    struct hw_device_t common; //第一成员必须为hw_device_t
   	int(*addTest)(int a,int b);
};

构造结构过程:

 // use calloc to initialize memory with 0
 struct mytest_device_t * device = NULL;
    device = ( struct mytest_device_t * )malloc(sizeof(*device));
    memset(device,0,sizeof(*device));
    device->common.tag = HARDWARE_DEVICE_TAG;
    device->common.version = 0;
    device->common.module = (hw_module_t*)module;
    device->common.close = close_mytest;
    device->addTest = addTest;

上面最重要就是把hw_device_t构造出,而且给成员变量test赋值了具体方法,后面获取了这个hw_device_t就可以调用真正的hal实现方法了

HAL module的使用步骤

上面只是一个个的定义好硬件抽象模块的步骤,接下来是要要怎么使用上面的hardware接口进行调用到相关的hal方法呢?
1、通过hw_get_module(char* id, struct hw_module_t ** module) 方法获取一个硬件抽象模块的指针

2、通过模块调用module->common.methods->open()方法获取一个硬件抽象即hw_device_t的指针

3、使用硬件抽象设备的hw_device_t指针调用具体的hal实现方法,比如上面 mytest_dev->addTest

相关调用hal的代码如下:

 mytest_module_t* module;
    if (hw_get_module(MYTEST_HARDWARE_MODULE_ID,(const hw_module_t**)&module) == 0) { //获取hw_module_t
         //调用methods的open方法,目的获取hw_device_t的指针
        if (((hw_module_t*)module)->methods->open((hw_module_t*)module,MYTEST_HARDWARE_MODULE_ID,(struct hw_device_t**)&mytest_device) == 0) { //获取hw_device_t对象指针
               //利用获取的mytest_device,调用对于的方法
        int result = mytest_device->addTest(1,2);
        }
    }


hardware.c源码分析

上面使用的hw_get_module这些方法到底在哪里实现的呢?
其实这些代码的实现都是在hardware.c文件中
下面从hw_get_module方法作为切入点全面展开分析一下相关的
hardware/libhardware/hardware.c

int hw_get_module(const char *id, const struct hw_module_t **module)
{
//调用到了hw_get_module_by_class,方法第二参数是NULL
    return hw_get_module_by_class(id, NULL, module);
}

int hw_get_module_by_class(const char *class_id, const char *inst,
                           const struct hw_module_t **module)
{
    int i = 0;
    char prop[PATH_MAX] = {0};
    char path[PATH_MAX] = {0};
    char name[PATH_MAX] = {0};
    char prop_name[PATH_MAX] = {0};


    if (inst)
        snprintf(name, PATH_MAX, "%s.%s", class_id, inst);
    else
        strlcpy(name, class_id, PATH_MAX);//把相关的id赋值给了name
	//第一优先级遍历看看是否存在ro.hardware.mytest 的prop
    snprintf(prop_name, sizeof(prop_name), "ro.hardware.%s", name);
    if (property_get(prop_name, prop, NULL) > 0) { //如果找到了这个ro.hardware.mytest 的prop
        if (hw_module_exists(path, sizeof(path), name, prop) == 0) { //根据prop值调用hw_module_exists看看是否hw存在
            goto found;
        }
    }

	//直接module的prop没有找到,则开启第二优先级遍历,这个主要便利设备相关属性,比如  "ro.hardware",

    /* Loop through the configuration variants looking for a module */
    for (i=0 ; i<HAL_VARIANT_KEYS_COUNT; i++) {
        if (property_get(variant_keys[i], prop, NULL) == 0) {
            continue;
        }
        if (hw_module_exists(path, sizeof(path), name, prop) == 0) {//然后去看看是否哪个prop的值有对应的so的
            goto found;
        }
    }
  //上面都没有找到,只能使用一个默认的hal so进行
    /* Nothing found, try the default */
    if (hw_module_exists(path, sizeof(path), name, "default") == 0) { 
        goto found;
    }

    return -ENOENT;
//开始处理找到so相关的业务
found:
    /* load the module, if this fails, we're doomed, and we should not try
     * to load a different variant. */
    return load(class_id, path, module);//传递找到的so路径然后进行so的加载
}

hw_module_exists会根据传递进来的name,subname,然后去拼出一个so的文件名字,看看这个so文件是否存在,存在这返回找到

/*
 * Check if a HAL with given name and subname exists, if so return 0, otherwise
 * otherwise return negative.  On success path will contain the path to the HAL.
 */
static int hw_module_exists(char *path, size_t path_len, const char *name,
                            const char *subname)
{
//HAL_LIBRARY_PATH3 "/odm/lib64/hw" 最先看看odm是否有这个so
    snprintf(path, path_len, "%s/%s.%s.so",
             HAL_LIBRARY_PATH3, name, subname);
    if (path_in_path(path, HAL_LIBRARY_PATH3) && access(path, R_OK) == 0)
        return 0;
//HAL_LIBRARY_PATH2 "/vendor/lib64/hw“接下来是vendor下面是否有

    snprintf(path, path_len, "%s/%s.%s.so",
             HAL_LIBRARY_PATH2, name, subname);
    if (path_in_path(path, HAL_LIBRARY_PATH2) && access(path, R_OK) == 0)
        return 0;

#ifndef __ANDROID_VNDK__
    snprintf(path, path_len, "%s/%s.%s.so",
             HAL_LIBRARY_PATH1, name, subname);
    if (path_in_path(path, HAL_LIBRARY_PATH1) && access(path, R_OK) == 0)
        return 0;
#endif

    return -ENOENT;
}

上面可以看出hw_module_exists会去几个路径找,优先级是oem > vendor> system

如果prop指定的都没有找到最后只能用最后的default看看是否存在,如果这个default so都没有,那么就会报错了,即无法获取到对于的硬件抽象模块,说明硬件抽象这部分功能就无法使用了。

一般情况下都最少可以找到一个default的so,那么找到后会执行上面的load方法,把这个so进行相关load

这个load方法是最关键的,来看看系统到底是怎么实现的:



static int load(const char *id,
        const char *path,
        const struct hw_module_t **pHmi)
{
  //省略部分
    /* Get the address of the struct hal_module_info. */
    const char *sym = HAL_MODULE_INFO_SYM_AS_STR;//就是靠这个固定HMI字符去so中找符号
    hmi = (struct hw_module_t *)dlsym(handle, sym);//这里是关键传递返回HMI的地址,也就相当于找到了这个结构体指针hmi
 
    *pHmi = hmi;//把找到

    return status;
}

补充介绍一下两个函数:
dlopen()是一个强大的库函数。该函数将打开一个新库,并把它装入内存。该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的。
dlsym是一个计算机函数,功能是根据动态链接库操作句柄与符号,返回符号对应的地址,不但可以获取函数地址,也可以获取变量地址。

上面的load方法就是我们说的hardware动态性的关键,它是在运行时候才真正依赖具体硬件抽象so,编译期间只需要依赖公共的hardware相关公共类既可以,不需要so,所以这里就给硬件抽象提供商带来很大灵活性,哪怕硬件厂商不提供也一般会有一个default的so保证不会产生什么严重的崩溃和强依赖问题,大大减低了aosp的代码对于硬件抽象的各个厂商的耦合性。

这里看看手机上的相关hal so:

在这里插入图片描述
这里在看看哪个prop是ms8998
在这里插入图片描述
本文章对应视频手把手教你学framework:
https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
私聊作者+v(androidframework007)
点击这里 https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw
视频:https://www.bilibili.com/video/BV1wc41117L4/
在这里插入图片描述

Android HAL编程实战-实现自己的HAL_上部分.7z 有要hal部分视频的同学,正好也有,分享出来也当备个份 ----------------------------------- 总共分上部分和下部分,这是上部分,解压完一共10个视频 单个文件大小240M的限制,因此使用的是7-Zip压缩格式(https://www.7-zip.org),不然两部分放不下 界面右侧点击"查看TA的资源"查看下部分和TA分享的其他资源 立即下载

相关推荐

Skiplist,B,B+tree,LSM tree

SkipList 理解(如何实现): 即使是有序的链表,查找的时间复杂度也是O(n),但链表不能随机访问所以不适用于二分查找,使得查找的时间复杂度为O(logn)。 于是将有序链表和二分查找结合得到了SkipList,类似于二叉搜索树,这是一种以空间换时间的算法,通过在每个节点中增加向前的指针,从而提升查找效率(如下图所示)。 一开始如a所示,是一个有序的链表,时间复杂度O(n)。随后建立了e所示的SkipList,从最顶层往下查找,可以跳过许多元素,减少查找次数。 ​

weixin_45875458的博客 947

千里马android framework开发解决Accessing hidden method限制,让应用访问隐藏方法(需要可以修改系统源码方案)

hi,粉丝朋友们大家好! 今天来给大家分享一下,就是经常大家会做安卓系统开发工作问到一个问题,那就是我如果framework代码中增加了一个方法啥的,但是我又不想公开给第三方应用知道,只想让我系统的应用知道,那该怎么办呢?其实这个时候经常就会用到一个hidden的标签,来代表这个方法是隐藏方法,隐藏方法就是给系统内部用的,意味着第三方app就无法使用。这个其实也很常见,自从android p开始android系统就开始对访问hidden的限制越来越严格,虽然我们网络上有各种奇葩招来逃避不允许调用hidden

learnframework的博客 1万+

2026最新 OpenClaw 手机端部署与实战:旧手机秒变 AI 智能终端(Android/iOS 双平台全覆盖)

OpenClaw 是2026年 GitHub 爆火的开源自托管 AI 执行网关,前身是 Clawdbot / Moltbot,主打“一句话让 AI 帮你完成真实操作”,核心能力包括发消息、整理文件、控制设备、自动化任务等,区别于普通对话式 AI,它能将 AI 指令转化为实际行动。无需高配置设备,无需专业技术,旧手机就能变身随身 AI 助手,既能实现自动化办公、生活便捷,又能保障数据隐私,还能体验极客玩法,这正是开源技术的魅力。# 初始化配置(按提示操作,配置 AI 模型 API Key)

wohaiweifaju的博客 5647

HIDL实战开发-千里马android framework车载车技手机系统开发

上面default默认生成的bp是so,这里要把他变成可执行的服务,需要增加一个service.cpp作为main方法载体。需要在自己设备目录找到自己的manifest.xml然后加入自己的hidl。5、添加service.cpp,自启动rc,修改Android.bp。4、生成一个自动生成 hal 接口的 Android.bp。6、需要搞个test,来测试一下服务是否ok,这个时候需要。主要目的是把test目录的Android.bp可以加入编译。执行后生成如下Test.cpp,Test.h文件了。

learnframework的博客 2975

S32K344 Flash Driver实战:手把手教你实现任意字节写入与扇区解锁(含C40_Ip避坑指南)

本文深入解析S32K344微控制器的Flash驱动开发,重点解决C40_Ip驱动库的8字节对齐限制和扇区保护锁问题。通过实战案例和代码示例,详细介绍了如何实现任意字节写入、扇区解锁及性能优化策略,为Bootloader和OTA升级等应用提供可靠解决方案。

weixin_33713707的博客 432

Unity动画状态机实战:Trigger和Bool参数到底怎么选?附5个常见场景解析

本文深入解析Unity动画状态机中Trigger和Bool参数的核心差异与应用场景。通过对比两者在描述瞬时事件与持续状态上的本质区别,并结合角色移动、攻击连招、跳跃落地、受击死亡及环境交互等5个实战场景,提供了清晰的选择逻辑与避坑指南,帮助开发者构建更健壮、易维护的动画逻辑。

weixin_29009501的博客 120

Android底层技术:HAL驱动开发

本课程提供开发者学习Android底层的HAL(硬件抽象层)的开发方法和技术。HAL所在的位置是介于Android系统服务与Linux内核之间,HAL Driver是以library形式出现,给HAL Stub调用,供Android System架构者调用。而HAL Stub则是google设计出来的,保护硬件厂商的硬件驱动。

谷歌浏览器崩溃排查:闪退、卡死、网页打不开的修复指南

浏览器多进程架构通过进程隔离、GPU加速和扩展沙箱提升网页渲染效率,但配置损坏、扩展冲突、显卡驱动异常或系统资源不足时,常会以闪退、卡死、白屏、内存占用飙升和能上微信却打不开网页等形式暴露。排查价值在于先分层定位系统、进程、配置扩展与网页内容,再用无痕模式、chrome://crashes、chrome://gpu和浏览器任务管理器收集证据,避免盲目重装。对办公、开发运维和日常维护场景,禁用扩展、关闭硬件加速、刷新DNS缓存、重置配置文件乃至干净重装,都是可复用的工程化处置手段。围绕谷歌浏览器崩溃的典型症状

weixin_34138056的博客 426

千里马Framework手机车机互联投屏实Hal+perfetto+SurfaceFlinger合集

千里马Android手机车机大厂Framework系统-WMS AMS系统专题实战课。千里马Framework 手机车机互联投屏实战专题(安卓framework实战开发。千里马Android手机大厂Framework系统-Input系统专题实战课。千里马Android手机大厂Framework系统-跨进程通信高级实战课。千里马安卓framework实战开发基础合集车载车机手机系统开发必学课。千里马Android手机大厂入职培训Framework系统高级开发课。

2501_91082100的博客 517

玩转Docker小游戏项目系列:Docker部署魔塔网页经典小游戏

玩转Docker小游戏项目系列:Docker部署魔塔网页经典小游戏

jks212454的博客 1063

YOLOv11改进策略【Neck】| SEAM:分离和增强注意模块,解决复杂场景下的小目标遮挡问题

本文记录的是利用 SEAM 模块优化 YOLOv11 的目标检测网络模型。的设计出发点在于解决复杂场景下的人脸遮挡问题,相当于是小目标被其他物体部分遮挡时,传统方法因特征缺失导致检测精度下降的问题。该模块通过增强未遮挡区域的特征响应并补偿被遮挡区域的信息损失,提升模型对遮挡小目标的检测能力。YOLO-FaceV2: A Scale and Occlusion Aware Face DetectorSEAM模块(Separated and Enhancement Attention Module)的设计出发点

Limiiiing的博客 2281

千里马android framework车机车载手机智能驾驶双屏互动实现方案

这个就是没有动画版本的双屏互动,功能其实也是实现的,但是体验是不是感觉起来差的太多,而且还带有黑屏。2、画面A的平移,两个屏幕都要进行显示,这个难度较大,得考虑好相关的画面怎么都可以显示在两个屏幕。这里其实不需要写代码,可以直接调用am display相关的命令即可以实现这个方法的调用。不过还好的是功能可以用,那么我们也根据wms课程基础后也来实现一下这个双屏互动的功能。1、多指全局动作监听,而不是在某个app的onTouch里面监听,这里其实之前的。

learnframework的博客 5967

FPGA发展趋势:异构计算、AI加速、可重构计算

FPGA技术正朝着异构计算、AI加速和可重构计算三大方向发展。作为高效能计算平台,FPGA在异构架构中与CPU/GPU协同工作,发挥低延迟、高能效优势;在AI领域通过定制化架构实现边缘推理加速;其硬件可重构特性支持动态适应多样化计算需求。最新进展包括部分可重构技术、智能网卡和边缘AI应用。未来,FPGA将在自适应计算、量子接口和软件定义硬件等领域持续突破,成为异构计算架构的核心组件,推动硬件与软件的深度融合。性能对比显示FPGA在能效比(5-20TOPS/W)和灵活性方面具有显著优势。

2301_79143213的博客 969

clearCallingIdentity与restoreCallingIdentity-千里马framework系统源码实战详解

hi,粉丝朋友大家好:今天带大家来学习一个系统开发过程中大家即“熟悉”又陌生的两个方法,分别是clearCallingIdentity和restoreCallingIdentity,一般他们是成对出现在我们的framework代码中,但大家平时分析源码时候好像并没有在意他的真正作用是什么?为啥在框架代码分析时候可以看到他的大量出现?

learnframework的博客 1308

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

千里马Android Framework实战开发-Binder通信之startActivity跨进程源码分析

上节课我们已经讲解完了Binder常见使用的一些方法,下面这节课我们来讲解一些Binder跨进程通信在平时Framework及SystemServer源码分析场景。 (注意这个分析是基于我们的android 10,因为课程上讲过android 8.1,也相对比较清楚了,这里blog就单独写一下android 10,因为和8.1有一些差异,这样可以多学习到android 10的情况) 首先我们来看一副图: 1、 startActivity源码分析 上面是不是我们常见的一种App与系统SystemServer

learnframework的博客 1022

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android系统的HAL层分析 (1)-- HAL的架构分析

Android 系统的硬件访问服务通常运行在 SystemServer 中,而使用这些硬件访问服务的应用程序运行在另外的进程中,即应用程序需要通过进程间通信机制来访问这些硬件访问服务。Android 系统提供了一种高效的进程间通信机制——Binder 进程间通信机制,应用程序就是通过它来访问运行在 SystemServer 中的硬件访问服务的。Binder 进程间通信机制要求提供服务的一方必须实现一个具有跨进程访问能力的服务接口,以便使用服务的一方可以通过这个服务接口来访问它。

Android系统工程师--小馬佩德罗 7743

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

千里马2024年终总结-android framework实战

心里焦虑加大了,需要调节好平常心面对创业以来最大感受就是“创业艰难”,原本预想的很美好,终于可以有勇气为了理想和兴趣奋斗了,一定是每天满怀激情的干。实际情况是:当自己的兴趣与谋生的收入挂钩时候,一切变得不那么理想和美好。每天还是会有担心自己课程的销售情况,必然就会有焦虑,这种心态和上班兼职搞完全不是一回事。所以心态上确实是相比以前有焦虑一些,这个部分做的不够好。时间不够用创业初期,也没有很多资金搞团队,大部分工作都落到我的头上,比如一些售前咨询,课程研发录制,答疑服务等。

liaosongmao1的专栏 308

千里马Android Framework实战课程-应用程序app的Binder启动篇

上一个学习专题zygote启动app进程时候,有简单讲过一下binder启动,但没有详细进行分析。这一节进行重点详细分析。 ProcessState的启动 sp<ProcessState> ProcessState::self() { Mutex::Autolock _l(gProcessMutex); if (gProcess != nullptr) { return gProcess; } gProcess = new ProcessState

learnframework的博客 3075

千里马Android Framework实战开发-跨进程通信专题博客总结

csdn在线学习课程,课程咨询答疑和新课信息:QQ交流群:422901085进行课程讨论 FrameWork入门课视频链接:https://edu.youkuaiyun.com/course/detail/30298 FrameWork实战课1视频链接:https://edu.youkuaiyun.com/course/detail/30275 android跨进程通信实战视频课程(加群获取优惠) 千里马Android Framework实战开发-跨进程通信专题介绍 1、跨进程通信之课程介绍 1 binder高级 应用程序app的

liaosongmao1的专栏 597

Android9.0 HAL 层开发

1. 生成 hidl-gen 工具 source source ./build/envsetup.sh lunch your_project make hidl-gen -j4 2. 编写接口文件 编写 types.hal, IHello.hal, IHelloCallback.hal,Android.bp 1. IHello.hal package vendor.test.hardware.hello@1.0; import IHelloCallback; interface IHello

SHK242673的专栏 4980

千里马android binder深入分析-承上启下的native层(客户端部分)

csdn在线学习课程,课程咨询答疑和新课信息:QQ交流群:422901085进行课程讨论 android跨进程通信实战视频课程(加群获取优惠) 相信大家对上面这一副binder跨进程通信的图都应该比较熟悉,图中的主要有4个角色: 1、客户端(A进程) 2、SerivceManager 3、服务端(B进程) 4、binder驱动 平时一问到binder是怎么跨进程通信的?那么同学们肯定大部分回答:binder最后调到底层还是通过binder驱动来实现跨进程通信的。那么这里就要问一下:请问android中ap

liaosongmao1的专栏 596

Android HAL与Android Framwork层的开发与优化概述

HAL层是Android系统中至关重要的一部分,它使得Framework层能够以一种抽象的方式与硬件设备进行交互。HAL层的开发涉及到硬件特性的抽象和标准化,以便Android系统能够与各种硬件设备兼容。HAL模块的架构通常包括以下几个关键部分:下面是一个简化的示例,展示了如何为一个假设的LED硬件设备实现一个HAL模块。1. 定义硬件接口 (): 2. 实现HAL模块 (): 3. 编译HAL库:在Android系统的构建系统中,HAL模块会被编译成库文件。在设备的BoardConfig.mk文件中,可以

jakelihua 3593
上一篇: HIDL实战开发-千里马android framework车载车技手机系统开发
下一篇: android framework分屏“官方”黑屏bug问题发现,你会分析吗?-千里马实战作业挑战
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值