Android Framework层线程设计

Android native/C++层Thread线程实现源码分析 在Android native(C++)层若想要创建一个线程则可以使用android平台native实现的Thread类来创建【当然你也可以直接使用C++标准库实现的std::thread,需引入头文件 #include<thread>,后续有时间再分析该标准库的实现】,而该类做了跨平台线程调用接口的处理和封装,具备了跨平台运行能力。 在native层使用该类必须引用android命名空间,因为该类是在android命名空间实现的,并引用该头文件【system/core/libutils/include/u 阅读详情

framework层的thread是c++实现的,定义在utils/threads.h,实现在Threads.cpp (system\core\libutils)。
</pre><pre name="code" class="cpp">首先看看定义:

</pre><pre name="code" class="cpp">class Thread : virtual public RefBase
{
public:
    // Create aThread object, but doesn't create or start the associated
    // thread.See the run() method.
                        Thread(bool canCallJava= true);
   virtual             ~Thread();
 
    // Startthe thread in threadLoop() which needs to be implemented.
    virtualstatus_t    run(    const char* name = 0,
                                int32_tpriority = PRIORITY_DEFAULT,
                                size_t stack =0);
   
    // Ask thisobject's thread to exit. This function is asynchronous, when the
    // functionreturns the thread might still be running. Of course, this
    // functioncan be called from a different thread.
    virtualvoid        requestExit();
 
    // Goodplace to do one-time initializations
    virtualstatus_t    readyToRun();
   
    // CallrequestExit() and wait until this object's thread exits.
    // BE VERYCAREFUL of deadlocks. In particular, it would be silly to call
    // thisfunction from this object's thread. Will return WOULD_BLOCK in
    // thatcase.
           status_t    requestExitAndWait();
 
    // Waituntil this object's thread exits. Returns immediately if not yet running.
    // Do notcall from this object's thread; will return WOULD_BLOCK in that case.
           status_t    join();
 
    //Indicates whether this thread is running or not.
           bool        isRunning() const;
 
#ifdef HAVE_ANDROID_OS
    // Returnthe thread's kernel ID, same as the thread itself calling gettid() or
    //androidGetTid(), or -1 if the thread is not running.
           pid_t       getTid() const;
#endif
 
protected:
    //exitPending() returns true if requestExit() has been called.
           bool        exitPending() const;
   
private:
    // Derivedclass must implement threadLoop(). The thread starts its life
    // here.There are two ways of using the Thread object:
    // 1) loop:if threadLoop() returns true, it will be called again if
    //          requestExit() wasn't called.
    // 2) once:if threadLoop() returns false, the thread will exit upon return.
    virtualbool        threadLoop() = 0;
 
private:
    Thread&operator=(const Thread&);
    static  int             _threadLoop(void* user);
    const   bool           mCanCallJava;
    // alwayshold mLock when reading or writing
           thread_id_t     mThread;
    mutableMutex           mLock;
           Condition      mThreadExitedCondition;
           status_t        mStatus;
    // notethat all accesses of mExitPending and mRunning need to hold mLock
    volatilebool           mExitPending;
    volatilebool           mRunning;
           sp<Thread>      mHoldSelf;
#ifdef HAVE_ANDROID_OS
    // legacyfor debugging, not used by getTid() as it is set by the child thread
    // and sois not initialized until the child reaches that point
           pid_t           mTid;
#endif
};

thread继承类RefBase,所以在onFirstRef中,调用了run函数

void AudioFlinger::PlaybackThread::onFirstRef()
{
    run(mName,ANDROID_PRIORITY_URGENT_AUDIO);
}
status_t Thread::run(const char* name, int32_tpriority, size_t stack)
{
 ...
    if(mCanCallJava) {
        res =createThreadEtc(_threadLoop,
               this, name, priority, stack, &mThread);
    } else {
        res =androidCreateRawThreadEtc(_threadLoop,
               this, name, priority, stack, &mThread);
    }
 ...   
}
int Thread::_threadLoop(void* user)
{
...
    do {
...
        result= self->threadLoop();
...
        if(result == false || self->mExitPending) {
        self->mThreadExitedCondition.broadcast();
           break;
        }
    }while(strong != 0);
    return 0;
}


threadLoop是个虚函数,继承Thread的类需要自己去实现这个函数,实现方式为

void AudioFlinger::AsyncCallbackThread::onFirstRef()
{
   run("Offload Cbk", ANDROID_PRIORITY_URGENT_AUDIO);
}
 
bool AudioFlinger::AsyncCallbackThread::threadLoop()
{
    while(!exitPending()) {
       ...
    }
    returnfalse;
}


这里exitPending是这么定义的

bool Thread::exitPending() const
{
    returnmExitPending;
}


所以,你可以选择在threadLoop里循环,也可以选择在_threadLoop里循环。


线程终止于run函数运行退出,要想退出一个线程,可以使用下面的接口:

1. 要求线程退出的线程不被block

void Thread::requestExit()
{
   mExitPending = true;
}


2. 要求线程退出的线程被block,直到线程真正退出,注意self->mThreadExitedCondition.broadcast()出现在_threadLoop退出前夕

status_t Thread::requestExitAndWait()
{  
   mExitPending = true;
    while(mRunning == true) {
       mThreadExitedCondition.wait(mLock);
    }
   mExitPending = false;
 
    returnmStatus;
}


看看具体的例子,AudioFlinger中threadBase里的exit:

void AudioFlinger::ThreadBase::exit()
{
 
       AutoMutex lock(mLock);
        requestExit();
       mWaitWorkCV.broadcast();
   requestExitAndWait();
}


在AudioFlinger析构的时候

AudioFlinger::~AudioFlinger()
{
...
    while(!mPlaybackThreads.isEmpty()) {
        closeOutput_nonvirtual(mPlaybackThreads.keyAt(0));
    }
...
}


函数closeOutput_nonvirtual内部调了thread->exit();


下面看看join:

status_t Thread::join()
{
   Mutex::Autolock _l(mLock);
    if (mThread== getThreadId()) {
        returnWOULD_BLOCK;
    }
    while(mRunning == true) {
       mThreadExitedCondition.wait(mLock);
    }
    returnmStatus;
}


所以join是block调用join的线程,直到mThreadExitedCondition broadcast,也就是说,直到mThreadExitedCondition所属的线程退出。

比如T.join()意味着执行这句程序的线程被block,直到线程T推出

带时间参数的join表示最多只等待一段时间,过期不候。


【Android12】Android Framework探秘---tombstone墓碑守护进程tombstoned的职责与交互 本文深入解析Android 12 Framework中的tombstoned守护进程,详细阐述其作为墓碑生成机制核心的职责与交互流程。从进程启动时机、三层协作模型到socket通信协议,揭示tombstoned如何高效管理崩溃日志文件,包括LRU清理策略和文件描述符传递机制,为开发者提供崩溃分析和系统优化的关键见解。 阅读详情

相关推荐

深度解析:安卓开发工程师进阶之路——聚焦鸿蒙、KMP与架构优化

摘要:本文深入探讨了安卓开发工程师在当前技术变革下面临的核心挑战与关键技能。文章系统分析了鸿蒙系统迁移策略、Kotlin Multiplatform跨平台开发、直播视频技术栈、多线程优化、Framework层原理等核心技术点,并提供了详细的面试题库与解析。重点阐述了如何通过分层架构和KMP实现代码复用,优化直播应用的网络传输性能,以及使用协程和Flow进行现代并发编程。文章还强调了工程能力与软技能的重要性,为开发者应对安卓生态演进和鸿蒙崛起提供了全面指导。

郑伟强dev的专栏 222

android 线程Thread介绍

线程Thread介绍 以BootAnimation为例 当手机开机时,首先播放开机动画,线程Thread介绍 以BootAnimation为例,首先看下图: UML 图: Created with Raphaël 2.1.2Bootanimation_mainBootanimation_mainThreadThreadBootanimationBootanimationThread构造函数o...

qq_33670826的博客 1017

Android Framework 开发工程师

【摘要】本文详细介绍了Android Framework开发工程师的岗位职责和任职要求,重点解析了面试中可能涉及的10大技术领域。内容包括Android系统架构、核心服务(AMS/WMS/PMS/IMS)、JNI与Binder机制、系统关键应用、稳定性问题分析、性能优化、多线程开发等关键技术点。针对每个技术领域提供了典型面试题及详细参考答案,如系统启动流程、内存泄露分析、ANR问题排查等。同时涵盖了接口设计、技术文档编写等软技能要求,以及综合问题分析能力的考察。

郑伟强dev的专栏 332

android8.1环境下 android Threads线程实现

Android native的Thread类是Android提供的一个基础类,源码路径: system\core\libutils\include\utils\Thread.h system\core\libutils\Threads.cpp 该类提供的基础功能涵盖了线程的生命周期:创建、运行、销毁。主要成员函数如下: 0、本身继承于RefBase,所以具有相应的一些特性 // Invoked after creation of initial strong pointer/reference. ..

we1less的博客 840

【Android Framework 实战】记一次 SurfaceFlinger 黑屏死机惨案:一个 static 解决的性能血案

摘要:本文记录了在Android Framework开发中遇到的一个因系统属性读取导致SurfaceFlinger渲染线程阻塞的黑屏死机问题。作者在修复横屏设备开机动画裁剪问题时,发现高频调用的属性读取方法GetBoolProperty成为了性能瓶颈,导致主线程严重超时。通过使用C++的static const关键字缓存属性值,实现了"一次读取,多次复用"的优化,成功解决了黑屏问题。文章强调了在Android系统高频路径中避免耗时操作的重要性,并提供了性能优化的实践指导。

习惯就好zz的专栏 120

MATLAB实战:5步搞定GNSS单点定位解算(附完整代码)

本文提供了一份基于MATLAB的GNSS单点定位实战指南。通过5个核心步骤,详细讲解了如何从卫星坐标和伪距观测值出发,利用最小二乘迭代算法,构建并实现一个完整的单点定位解算器。文章附有完整代码,并涵盖精度评估与结果分析,适合GNSS初学者和MATLAB用户快速上手实践。

a2b3c4d5e的博客 250

AudioFlinger::MixerThread::threadLoop

1、进程的创建 int AudioFlinger::openOutput(uint32_t *pDevices, uint32_t *pSamplingRate,

J.A.Y的专栏 7843

AutoCAD 2025在Win10/Win11上的官方安装、配置与问题排查全指南

对于需要在 Windows 11 或 Windows 10 系统上部署 AutoCAD 2025 的设计师、工程师和 IT 支持人员来说,一个稳定、合规的安装流程是高效工作的基石。网络上充斥着各种所谓的“免费下载”和“一键安装”教程,但这些资源往往来源不明,可能捆绑恶意软件、导致软件崩溃,甚至引发严重的许可合规风险。本文旨在提供一个清晰、安全、基于官方最佳实践的 AutoCAD 2025 安装与配置指南,重点解决在 Windows 11 和 Windows 10 系统上部署时可能遇到的兼容性问题、安装失败以

weixin_34396103的博客 449

activity启动流程之--开机动画停止逻辑

文章初始给大家推荐一篇文章https://blog.youkuaiyun.com/xlnaan/article/details/80904309#commentBox 上篇文章已经分析到开机动画的两种播放形式了https://blog.youkuaiyun.com/we1less/article/details/116464874 首先以android()方式播放 android() AOSP/frameworks/base/cmds/bootanimation/BootAnimation.cpp bool BootAnimat

L779442863的博客 597

【微服务】SpringBoot 整合Kafka 项目实战操作详解

SpringBoot 整合Kafka 实战操作详解

congge 5570

基于工作流的低代码AI应用开发:Flock平台核心架构与实战指南

在AI应用开发领域,工作流编排正成为连接大语言模型(LLM)能力与复杂业务逻辑的关键技术。其核心原理是将任务分解为模块化节点,通过可视化方式定义执行顺序与数据流向,从而实现灵活可控的自动化流程。这种范式极大地提升了开发效率,降低了技术门槛,使得开发者能够聚焦于业务设计而非底层代码。在技术价值层面,工作流编排支持检索增强生成(RAG)、多智能体协作等高级模式,并能通过人工干预节点确保关键流程的可靠性与合规性。其典型应用场景包括智能客服、自动化办公、数据分析助手等。本文以Flock平台为例,深入解析了如何利用其

weixin_26848497的博客 381

Android framework

优势:一次拷贝,安全可靠。原理:mmap 内存映射,内核中转。限制:1MB 缓冲区,不能传大数据。架构:C/S 模型,SM 是 DNS,驱动是路由器。实战:AIDL 生成 Stub/Proxy,oneway 异步,FD 传大文件。Input Dispatching Timeout (按键/触摸事件)5秒。用户点击屏幕,如果主线程卡死 5秒没反应,触发。这是最常见的 ANR。Broadcast Timeout (广播)10秒。60秒。Service Timeout (服务)20秒。

weixin_45754428的博客 605

MicroCap声学仿真介绍(二)-创建声学仿真元件

声学库里包含孔、管、障板辐射器等器件,我们只需要按照仿真的需求,将声学库里的器件排列好,输入参数,用线连接起来即可。这里我们用D指代孔的直径,L指代孔的长度,N代表孔的数量。26.在弹出的界面中做如下设置:需要先在右面的选框里找到对应的项,然后右键Add Part,再之后就如下设置。3.在弹出的界面中,选择“Macro file(.mac)”,并点击右上角的“OK”下面就以声学仿真中常见的“孔”来做示例,跟大家一块演示一下宏程序的新建。10.在上图中“Value”中填入“R”,然后点击左边的“OK”按钮;

山无忧的博客 2199

android JNI基础:java framework,application三层的练习

练习:从jni层获得一个字符串,在屏幕上显示,当然是手机屏幕 要求: 1.需要包含三层结构:JNI, java framework, java application 2.字符串的内容为“Hello from JNI !”,必须在JNI层定义 这个练习是在Android的源码工程下做的,我的Android源代码路径为/Android/android-1.6_r2

320

开源Harness项目DeerFlow 2.0,让智能体几乎能完成任何复杂任务

从提示工程到上下文工程,再到如今的 Harness,这条演进路径的本质是从“教模型如何理解人类”迈向“为模型构建一个可执行、可信赖、可长期运转的数字世界”。 当越来越多像 DeerFlow 2.0 这样的 Super Agent Harness 走向普及,AI 将真正进化为能理解、会规划、可执行、敢交付、长期负责的成熟生产力形态。

技术引领业务创新 519

Pyhon在振动信号处理中的高级应用(一):振动信号特征(时域、频域)提取

文章目录一、概述二、算法原理2.1 时域统计特征三、python代码实现 一、概述 二、算法原理   这里我们借鉴西安交通大学机械学院雷教授的论文《Fault diagnosis of rotating machinery based on multiple ANFIS combination with GAs》相关研究成果。雷教授在论文中共列举了4类共24种振动信号的时域和频域特征。 2.1 时域统计特征 p1=∑n=1Nx(n)NP2=∑n=1N(x(n)−p1)2N−1p3=(∑n=1N∣x(n)∣N

白银时代的博客 1万+

framework知识点

1:你是如何理解Android操作系统的。   2:是否熟悉framework层,如果熟悉,那就对framework做个简介。   3:是否熟悉多线程,如果熟悉,介绍下线程。   4:对象锁和类锁是否会互相影响,会举例子让你判断锁的使用是否恰当,并说出原因。   5:是否熟悉Lopper架构,如果熟悉说下其原理,如果你自己实现,你会怎么实现。这里主要考察阻塞消息队列原理,和其变形。  

hqiangtai的博客 969

4、基于球面波展开的近场/远场变换技术解析

本文深入解析了基于球面波展开的近场/远场变换技术,涵盖坐标系统选择、截断测量处理、高级SWE方法及实际应用场景。重点介绍了广义SWE、全探头补偿、平移SNF测量(TSWE)等关键技术,结合吸收材料与导电地板系统的误差处理方案,系统总结了各类方法的优缺点与适用场景,并通过流程图和案例分析展示了技术应用路径。该技术在汽车、通信和航空航天领域的天线测量中具有重要价值,可显著提升测量效率与精度。

dell8的博客 255

Android Framework面试核心:Binder与Handler机制深度解析

Binder机制作为Android跨进程通信的核心技术,其线程池管理与内存引用机制直接影响系统稳定性。通过分析Binder线程池的同步阻塞特性与RemoteCallbackList的自动清理机制,可以解决跨进程回调中的内存泄漏问题。Handler消息队列模型则涉及ThreadLocal存储原理,合理使用HandlerThread与LifecycleObserver能有效避免内存泄漏。这些Framework层核心技术在大厂面试中常以实际架构问题形式考察,如设计跨进程通知系统或分析Native内存泄漏。掌握Bi

weixin_30412167的博客 443

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...

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Android Framework实战:如何高效dump PCM音频数据及避坑指南

基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。架构理解:掌握实时语音应用的完整技术链路(ASR→LLM→TTS)技能提升:学会申请、配置与调用火山引擎AI服务定制能力:通过代码修改自定义角色性格与音色,实现“从使用到创造”从0到1构建生产级别应用,脱离Demo,点击打开。

2600_94960035的博客 1028

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

高级Android开发工程师核心能力与面试指南

Android开发作为移动端核心技术领域,其技术栈从基础UI开发演进到复杂系统架构设计。现代Android开发需要掌握Kotlin/Java双语言体系,深入理解Android SDK组件和Jetpack架构组件,同时具备多线程编程和性能优化能力。在工程实践层面,CI/CD流程搭建和自动化测试体系成为标配。随着技术发展,具备Flutter/Compose跨平台能力和系统层开发经验的工程师更具竞争力。本文解析高级Android工程师必备的架构设计能力和工程化思维,并分享大厂面试中的Framework层原理考察要

weixin_30247781的博客 351

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Android开发从入门到精通:核心技术栈与实战指南

Android开发作为移动开发的核心领域,涵盖了从应用层UI设计到系统底层机制的完整技术栈。其核心原理基于Linux内核和Java/Kotlin语言体系,通过Binder IPC实现跨进程通信,借助ART虚拟机优化应用性能。在技术价值层面,Android开发不仅支撑了全球71.8%的移动设备(StatCounter数据),更延伸到智能汽车、物联网等新兴领域。典型应用场景包括高性能UI渲染、后台任务调度、跨进程通信等。本文重点解析Android Studio环境配置、ADB高阶调试技巧,以及Jetpack C

weixin_33766168的博客 542

Android 11 Wifi开关背后的状态机:从点击到广播,一次完整的源码追踪之旅

本文深入解析Android 11 WiFi状态机架构,从用户点击到系统响应的完整流程。通过源码分析,揭示Wifi框架中的状态机设计哲学,包括开启流程、关闭流程以及多级状态机协作机制,帮助开发者理解安卓Framework中的复杂系统行为管理。

weixin_33743661的博客 300

Android C++开发实战:NDK与系统级编程

在Android系统中,虽然应用层主要使用Java/Kotlin开发,但底层核心功能(如硬件抽象层、原生库、驱动交互等)高度依赖C/C++实现。掌握基于Android Framework的C/C++开发能力,可显著提升性能优化、系统定制和底层扩展的效率。Android Native Development Kit(NDK)是开发C/C++代码的核心工具链,提供交叉编译、调试和性能分析支持。通过NDK可将C/C++代码编译为.so动态库,供Java层通过JNI调用。典型开发环境配置: JNI接口开发实践

xyvzfxwm的博客 333

Loxodon Framework跨平台开发:PC、移动、WebGL全平台适配指南

Loxodon Framework是一个专为Unity3D游戏开发设计的轻量级MVVM框架,支持C#和Lua双语言开发,提供数据绑定、本地化、服务容器等核心功能,帮助开发者高效构建跨平台游戏应用。本文将详细介绍如何利用Loxodon Framework实现PC、移动设备及WebGL平台的无缝适配,让你的游戏轻松覆盖全平台用户。 ## 全平台架构设计:一次开发,多端部署 🚀 Loxodon F

gitblog_00571的博客 827

Under the hood: Android 17’s lock-free MessageQueue(google官方原文)

谷歌在Android 17系统中引入无锁消息队列DeliQueue,显著提升手机流畅度。新系统通过消除MessageQueue的内存锁定机制,解决了锁竞争和优先级反转导致的UI卡顿问题。Perfetto工具分析显示,传统锁机制会导致高优先级UI线程被低优先级线程阻塞。案例研究表明,相机应用后台线程持有锁会间接阻碍启动器主线程运行,造成丢帧。开发者可通过PerfettoSQL查询特定锁竞争模式,优化应用性能。这一架构改进使目标SDK 37及以上的应用获得更流畅的用户体验。

liaosongmao1的专栏 100
上一篇: Android音量设置流程干货版
下一篇: Leetcode---Recover Binary Search Tree
我把葡萄酿成酒
博客等级 码龄12年 275粉丝 198原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值