滴滴 App 质量优化黑科技,都做了什么

Android-Booster-滴滴开源App的质量优化框架 Booster 是专门为移动应用而设计的简单易用、轻量级、功能强大且可扩展的质量优化工具包,其通过动态发现和加载机制提供可扩展的能力,换言之,Booster 也是一个移动应用质量优化框架。 立即下载

点击上方“开发者技术前线”,选择“星标”

每天 14.00 在看 | 真爱


作者: 承香墨影 | 来源:公众号 承香墨影


 


一. 序

当 App 达到一定体量的时候,肯定是要考虑质量优化。有些小问题,看似只有 0.01% 触发率,但是如果发生在 DAU 过千万的产品中,就不是小问题了。

滴滴这个独角兽的 DAU 早已过千万,自然有一些独到的优化方案。最近滴滴在 Github 上开源了一个 Android App 的质量优化工具 Booster,通过动态发现和加载机制,提供了可扩展的能力。等于是一款移动应用的质量优化框架。

说到优化好像也不知道具体能干什么。从特性上笼统来说,Booster 可以做到性能检测和优化、包体积瘦身、代码注入等。

稍微看了一下,暂时所支持的优化还比较有限,但是好在 Booster 提供了非常便捷的扩展能力,我们可以根据业务场景,进行针对性的优化。

虽然 Booster 现在的优化点还很少,但是在开源的同时,也给出了后续发展的 Roadmap,之后的功能应该是会越来越完善的。下面就来了解一下滴滴新开源的 Booster。

二. Booster

2.1 什么是 Booster

Booster 是专门为移动应用而设计的简单易用、轻量级、功能强大且可扩展的质量优化工具包,其通过动态发现和加载机制,提供了可扩展的能力。是一款移动应用的质量优化框架。

Booster 主要由 Transformer 和 Task 组成。

Transformer 用于对字节码进行扫描或修改(取决于 Transformer 的功能),而 Task 则用于处理构建中的资源。

为了满足不同业务场景下的优化需求,Booster 提供了 Transformer SPI 和 VariantProcessor SPI 接口,来允许开发者进行定制。

Booster 的整体框架如下:

640?wx_fmt=png

Booster 对 Gradle 还有一些小的版本要求:

2.2 Booster 到底能干什么?

读了一遍官方的介绍,好像还是不知道 Booster 的用处,这里就以 Booster 已经支持的一个 Transformer 为例子,来讲解它到底能干什么。

Toast 是我们在日常开发中经常会用到的一个提示信息的组件,而在 Android 7.0 的系统中,它有可能会触发 BadTokenException 的异常。这个问题,用 Booster 就可以解决。

Toast 抛 BadTokenException 看起来是在显示的时候,窗口的 Token 已经失效了,也有可能在显示 Toast 的时候,窗口已经被销毁了。

android.view.WindowManager$BadTokenException:     at android.view.ViewRootImpl.setView(ViewRootImpl.java)    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java)    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java4)    at android.widget.Toast$TN.handleShow(Toast.java)
    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java4)
    at android.widget.Toast$TN.handleShow(Toast.java)

这个问题只出现在 Android 7.0 中,在之后的版本中,Google 的工程师为了解决这个问题,是直接将其 Catch 住这个异常来解决问题的。下面是 Android 8.0 的相关代码。

try {    mWM.addView(mView, mParams);    trySendAccessibilityEvent();} catch (WindowManager.BadTokenException e) {    /* ignore */}
    mWM.addView(mView, mParams);
    trySendAccessibilityEvent();
} catch (WindowManager.BadTokenException e) {
    /* ignore */
}

这种问题,在我们自己的代码中,可以通过定义一个统一的 Toast 帮助类,将其 方法 catch 住。老项目我们就要全文遍历一遍 Toast 的调用并替换,并且这样的方案也有缺陷,无法避免来自第三方库中使用的 Toast 出现此问题。

虽然这个问题已经有解决方案,但是 Booster 给了我们另外一个选择。

在 Booster 中,已经内置了一些 Transformers,其中就有一个 booster-transform-bugfix-toast,是用于修复 Android 7.0 中,Toast 导致的系统错误。

ToastBugfixTransformer 的主要源码在此:

@AutoService(ClassTransformer::class)class ToastBugfixTransformer : ClassTransformer {    override fun transform(context: TransformContext, klass: ClassNode): ClassNode {        klass.methods.forEach { method ->            method.instructions?.iterator()?.asIterable()?.filterIsInstance(MethodInsnNode::class.java)?.filter {                it.owner == TOAST && it.name == "show" && it.desc == "()V"            }?.forEach {                it.owner = `TOAST'`                it.desc = "(L$TOAST;)V"                it.opcode = Opcodes.INVOKESTATIC            }        }        return klass    }}private const val TOAST = "android/widget/Toast"private const val `TOAST'` = "com/didiglobal/booster/$TOAST"
class ToastBugfixTransformer : ClassTransformer {

    override fun transform(context: TransformContext, klass: ClassNode): ClassNode {
        klass.methods.forEach { method ->
            method.instructions?.iterator()?.asIterable()?.filterIsInstance(MethodInsnNode::class.java)?.filter {
                it.owner == TOAST && it.name == "show" && it.desc == "()V"
            }?.forEach {
                it.owner = `TOAST'`
                it.desc = "(L$TOAST;)V"
                it.opcode = Opcodes.INVOKESTATIC
            }
        }
        return klass
    }
}
private const val TOAST = "android/widget/Toast"
private const val `TOAST'
` = "com/didiglobal/booster/$TOAST"

它是将系统的 Toast 传递到另外定制的一个 com.didiglobal.booster.android.widget 包下的 Toast 来解决。

public static void show(final android.widget.Toast toast) {    if (Build.VERSION.SDK_INT == 25) {        workaround(toast).show();    } else {        toast.show();    }}private static android.widget.Toast workaround(final android.widget.Toast toast) {    final Object tn = getFieldValue(toast, "mTN");    if (null == tn) {        Log.w(TAG, "Field mTN of " + toast + " is null");        return toast;    }    final Object handler = getFieldValue(tn, "mHandler");    if (handler instanceof Handler) {        if (setFieldValue(handler, "mCallback", new CaughtCallback((Handler) handler))) {            return toast;        }    }    final Object show = getFieldValue(tn, "mShow");    if (show instanceof Runnable) {        if (setFieldValue(tn, "mShow", new CaughtRunnable((Runnable) show))) {            return toast;        }    }    Log.w(TAG, "Neither field mHandler nor mShow of " + tn + " is accessible");    return toast;}
    if (Build.VERSION.SDK_INT == 25) {
        workaround(toast).show();
    } else {
        toast.show();
    }
}

private static android.widget.Toast workaround(final android.widget.Toast toast) {
    final Object tn = getFieldValue(toast, "mTN");
    if (null == tn) {
        Log.w(TAG, "Field mTN of " + toast + " is null");
        return toast;
    }

    final Object handler = getFieldValue(tn, "mHandler");
    if (handler instanceof Handler) {
        if (setFieldValue(handler, "mCallback", new CaughtCallback((Handler) handler))) {
            return toast;
        }
    }

    final Object show = getFieldValue(tn, "mShow");
    if (show instanceof Runnable) {
        if (setFieldValue(tn, "mShow", new CaughtRunnable((Runnable) show))) {
            return toast;
        }
    }

    Log.w(TAG, "Neither field mHandler nor mShow of " + tn + " is accessible");
    return toast;
}

当 API Level 不为 25 时,直接调用 Toast.show() 方法,为 25 时,通过反射来判断当前 Toast 的情况,进而返回一个有效的 Toast 对象,再调用 show() 。

到这里就将 Toast 在 7.0 上的问题修复了,我们正常开发过程中,完全不需要担心 Toast 的使用,质量保证和业务开发就可以安全区分开。

2.3 Booster 已经内置的功能

在 Booster 开源的时候,内部已经内置了一些 Transformer 和 Task,前面介绍的 booster-transform-bugfix-toast 就是其中之一。

内置 Transformers

内置 Tasks

这些 Booster 提供的 Transformer 和 Task,功能还有限,它们更多的是提供一些指导意义,可以让我们通过源码了解到 Booster 是如何使用和工作的。

有更多想法和需要,可以自己去定制实现 Transformer 和 Task。

三. 小结时刻

虽然现在 Booster 的优化功能还有限,但是看其发布的 Roadmap 中,已经提出接下来几个版本的迭代计划,例如会专注:性能优化、Lint、资源压缩、用户体验等等。在性能优化上,会对多线程的使用、SP 的使用、WebView 的预加载进行针对性的优化。

整体来看,Booster 是一个非常好的性能优化框架,它使用的都是成熟的技术,将其包装而成,降低了我们使用的难度。并没有什么太大的深坑,有需要可以进行尝试。

更多内容可以去 Github 上阅读 Wiki 和源码,有兴趣别忘点个 star。

Github:https://github.com/didi/boosterEND

开发者技术前线 ,汇集技术前线快讯和关注行业趋势,大厂干货,是开发者经历和成长的优秀指南。

历史推荐


字节跳动是个疯子!

从简历被刷到拿字节跳动 offer,我花了一年时间

卧槽 ,你居然在代码里下了毒!

640? 640?wx_fmt=gif 640?wx_fmt=png 不错就点个在看吧!


究竟什么是虚拟同步机???虚拟同步机巨简单理解 同步发电机定子铁芯的内圆均匀分布着定子槽,槽内按一定规律嵌放着对称的三相绕组U1-U2、V1-V2、W1-W2,如图1所示。工作原理转子铁芯上装有制成一定形状的成对磁极,磁极上绕有励磁绕组。励磁绕组上通直流电时,会在电机的气隙中形成极性相间的分布磁场,称为励磁磁场。当原动机拖动转子以恒定速度旋转时,励磁磁场随转轴一起旋转并顺次切割定子各相绕组。定子电枢绕组中将会感应出大小和方向周期性变化的三相对称正弦感应电动势。各相电动势大小相等,相位各差120°。 阅读详情

相关推荐

TouchGFX在STM32上的移植全过程:超详细版指南

深入讲解将TouchGFX集成到STM32开发环境的每一步,涵盖配置、驱动适配与UI调试。无论是初学者还是进阶开发者,都能快速掌握TouchGFX在嵌入式平台的应用技巧。

weixin_42443533的博客 600

滴滴 App 的质量优化框架 Booster,开源了!

android.view.WindowManagerBadTokenException: at android.view.ViewRootImpl.setView(ViewRootImpl.java)at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java)at android.view.WindowManagerImpl.addView(WindowManagerImpl.java4)at android.widget.Toa

xcbyaya的博客 1080

告别安装报错!保姆级教程:用阿狸狗破戒大师V3.2.6搞定Cadence 17.4完整安装与补丁

本文提供Cadence 17.4的完整安装与破解教程,特别针对国内用户常见问题优化。从前期准备、镜像处理到阿狸狗破戒大师V3.2.6的智能破解,再到补丁管理与性能调优,详细指导每一步操作,确保一次性安装成功并提升设计效率。

weixin_30632089的博客 833

滴滴开源 Booster:移动 APP 质量优化框架

桔妹导读:近期,滴滴在 GItHub 发布了第 18 个开源项目 Booster:一款专门为移动应用设计的易用、轻量级且可扩展的质量优化框架。一起来了解详情吧。——▍简介...

DiDi_Tech的博客 914

用V E S C 6-M K V I 第六代调速控制器给VESC电调刷固件

文章摘要:本文介绍了一款先进的电机控制器,具备多项创新技术。核心亮点包括三相电流/电压检测、四象限无缝运行、多模式兼容等先进电机控制技术,以及智能感知与安全保护、高效能电源管理、多样化连接与扩展功能。此外,该控制器支持实时数据监测与用户交互,具备开源生态和工业级可靠性,适用于电动载具、机器人及工业领域。用户需注意散热要求和兼容性提示,可通过VESC-Tool软件进行灵活配置。产品可在常竹科技淘宝店购买,并加入技术交流群获取支持。

2403_89422757的博客 1364

MAX96712在车载摄像头系统中的带宽分配与传输能力计算解析

在计算摄像头带宽与传输接口的关系时,需要考虑视频流的像素分辨率、帧率、颜色深度等因素。以 MAX96712 这种 GMSL2 产品为例,它支持每个链路在正向方向以 3Gbps 或 6Gbps 的固定速率工作。

weixin_43199439的博客 3324

滴滴 App 质量优化黑科技,为了稳定都做了什么?

一. 序 当 App 达到一定体量的时候,肯定是要考虑质量优化。有些小问题,看似只有 0.01% 触发率,但是如果发生在 DAU 过千万的产品中,就不是小问题了。 滴滴这个独角兽的 DAU 早已过千万,自然有一些独到的优化方案。最近滴滴在 Github 上开源了一个 Android App 的质量优化工具Booster,通过动态发现和加载机制,提供了可扩展的能力。等于是一款移动应用的质量优化框架...

Android 开发架构 1044

【Docker】从零构建达梦DM8轻量级服务镜像:实战与优化

本文详细介绍了从零开始构建达梦DM8轻量级Docker镜像的完整实战流程。通过分析传统安装方式的痛点,阐述了使用Docker封装数据库的优势,并重点讲解了如何利用静默安装、精简组件、多阶段构建等优化技巧,打造一个体积小巧、启动迅速、配置灵活的DM8服务镜像,助力实现开发、测试与部署的环境一致性与高效性。

ooo22的博客 519

App包体积全面瘦身

汇总:Android小白成长之路_知识体系汇总【持续更新中…】 目录为什么要进行包体积优化?Apk的组成优化方案dex大小优化删除无效代码D8编译Proguard混淆R8优化资源优化删除无用资源使用shrinkResources压缩资源png转webpTinyPng压缩pngSo优化及时移除无用so精简so库过滤so库综合优化boosterAndroid App Bundle极限优化使用 XZ Utils 进行 Dex 压缩避免产生 Java access 方法AndResGuardAabResGuardB

Nbin_Newby的博客 1682

在Simulink中进行基于强化学习控制策略的三相逆变器仿真

本文详细介绍了在Simulink中实现基于强化学习控制策略的三相逆变器仿真的完整流程。主要内容包括:1)准备工作,确保MATLAB/Simulink及相关工具箱安装;2)构建三相逆变器基础模型,包含电源、全桥电路、LC滤波器和负载;3)重点阐述强化学习控制器设计,涉及状态空间、动作空间定义,奖励函数设计和算法选择;4)实现控制逻辑,包括环境创建、代理配置和训练过程;5)仿真设置与结果分析。文章强调了模型调试优化的重要性,并建议结合文献研究提升控制效果。该方案为开发自适应电力电子控制系统提供了实用指南。

amy_mhd的博客 270

导数与微分在 FPS 射击游戏中的实际应用:把“手感”算出来

摘要:射击游戏开发中,单线程适用于简单小游戏(如单机打靶),所有任务由主线程顺序处理,代码简单但效率较低;多线程则适合复杂场景(如多人在线3D大作),通过渲染、逻辑、网络、音效等线程分工协作,确保画面流畅、响应迅速和实时同步。选择依据取决于游戏复杂度、联网需求和性能要求,小型游戏用单线程,大型高要求项目必须采用多线程架构。(149字)

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 3278

滴滴开源 Booster:移动APP质量优化框架

本文作者:李景森,来自滴滴终端技术团队,专家工程师,主导设计了滴滴司乘两端APP整体架构及一系列基础核心组件,目前主要负责移动端技术架构及性能优化。Booster Log...

singwhatiwanna 6291

解锁激光加工密码:功率、频率、脉宽、占空比全解析

激光加工利用高能量激光束实现材料加工,具有无接触、高效率等特点。其核心参数包括功率(决定能量输出)、频率(控制脉冲重复)、脉宽(调节能量作用时间)和占空比(调控工作周期),这些参数相互协同影响加工效果。针对不同材料需采用差异化参数组合:金属材料需较高功率,塑料需低功率防过热,陶瓷需高频短脉宽减少热应力。实际操作中应通过小范围测试逐步优化参数,并注意解决烧损、切割不平整等常见问题。合理调节这些参数可实现高质量、高效率的激光加工。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 614

滴滴出行生态构建:从超级App到出行圈的网络效应与数据驱动

在互联网产品架构中,超级App通过聚合多场景服务实现用户体验的统一,其背后依赖强大的业务中台与技术中台支撑。这种架构的核心价值在于构建双边市场网络效应,即连接供给侧与需求侧并形成相互强化的正向循环。从技术原理看,数据与算法是驱动平台效率的关键,例如通过动态定价模型和智能派单系统优化实时供需匹配。在工程实践中,滴滴将地图调度、支付风控、安全客服等底层能力中台化,支撑了从快车、代驾到货运、租车等十余个业务线的稳定运行。其生态逻辑进一步延伸出跨边网络效应,例如网约车司机可灵活承接货运订单,提升了整体运力利用率。这

weixin_30458043的博客 342

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

滴滴新动作!为什么说滴滴不再是一家简单的出行公司?

AI(人工智能)自1956年被提出后,几经沉浮,直至最近几年才成为全球瞩目的科技焦点,全球对于人工智能的发展兴奋与担忧交织难分。毫无疑问,人工智能行业将会在未来得到爆发,它在某种程度上代表着第四次科技革命的到来。8月16日,滴滴技术开放日在北京举行。交流活动现场,滴滴宣布成立了AI for Social Good共创平台,主要关注环境、安全与健康、科技无障碍三大领域方向。中国科学院计算所泛在计算系...

weixin_34395205的博客 438

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Android黑科技保活实现原理揭秘,使用指南

前言 这篇文章主要是分享今年面试心得,现已就职于某大厂有三个月了,近期有很多公司均已启动秋招,也祝大家面试顺利,获得理想的offer! 之前找工作的那段时间感想颇多,总结一点面试经验和人生思考分享给大家。 谈起性能优化,我想问, 什么是性能优化?你的理解呢? **首先什么是性能:**在同一个手机里面,同样功能的app,哪个跑的快,哪个不卡,哪个就性能高。我们这篇文章就是解决那些性能慢的问题: 1)我们要找到性能低的地方,并且把这些地方解决掉,这个就是性能优化; 2)我们要让自己具备一开始写的代码,它运行起来

m0_56228922的博客 190

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

外媒:滴滴大数据惠利城市智慧交通

CNET科技资讯网 5月4日 北京消息:导语:近日滴滴智慧交通负责人章文嵩接受媒体采访,详细介绍了滴滴在大数据领域和智慧交通体系方面的深入探索,以下为外媒报道全文: “滴滴交通信息平台”北京道路交通热力图 滴滴的门禁非常严格,记者发现每位访问者都要在前台详细登记,并且需要公司内部人员全程陪同。访问者进出公司大楼,保安人员都会确认其是否持有访客证。滴滴...

weixin_34174132的博客 368

别再死记硬背了!用高德地图APP的例子,5分钟搞懂ISO9126软件质量模型

本文通过高德地图APP的实例,生动解析ISO9126软件质量模型的六大特性。从功能性、可靠性到可移植性,揭示导航工具背后的国际质量标准如何提升用户体验,帮助开发者理解并应用这一软件质量评估框架。

cigang4063的博客 569

滴滴美团生态战争:投资人不安背后的平台经济估值逻辑重估

平台经济通过构建双边或多边市场,利用网络效应实现用户与服务的连接,其核心原理在于规模效应带来的边际成本递减与价值递增。这一模式的技术价值在于通过算法优化资源配置效率,提升交易匹配度,从而创造巨大的商业价值。在应用场景上,平台经济已深入出行、本地生活、电商等多个领域,成为现代数字经济的基础设施。当前,行业正面临从增量扩张向存量深耕的转型,市场竞争焦点从用户增长转向生态协同与盈利质量。在这一背景下,平台巨头间的生态竞争日益激烈,涉及网约车、外卖、即时零售等多个战场,引发了市场对战略资源分配与估值逻辑的重新审视。

weixin_34275734的博客 525

互联网日报 | 瑞幸咖啡同意支付1.8亿美元达成和解;国产游戏海外收入首破千亿;滴滴试水信用支付...

今日看点✦瑞幸咖啡同意支付1.8亿美元罚款,与美SEC达成会计欺诈指控和解✦ 百度智能云推出“云智生态计划”,并设立30亿基金✦ 滴滴试水信用支付:推出“滴滴月付”产品,目前处于灰度测...

liudada8265的博客 1250

招聘|滴滴、乒乓智能、小米等公司诚聘测试开发工程师(含高级)、Java开发工程师

任职要求: 1、计算机相关本科及以上学历; 2、熟悉测试理论和流程,有良好的测试思路及 case 设计能力; 3、良好的代码基础,至少熟练掌握 Java/Go/Python 其中一种;

software_test010的博客 1059

大众与滴滴战略合作:从智能网联汽车到自动驾驶的商业化路径

智能网联汽车和自动驾驶是当前汽车产业转型的核心技术方向。智能网联汽车通过车联网技术实现车辆与云端、其他车辆及基础设施的数据交互,其原理在于利用传感器、通信模块和计算平台构建实时数据网络。自动驾驶则依赖感知、决策、控制系统的协同,通过机器学习处理复杂交通场景。这些技术的价值在于提升出行安全、效率和用户体验,推动汽车从交通工具向智能移动空间演进。在应用场景上,智能网联汽车支持车队管理、远程诊断和个性化服务,而自动驾驶在RoboTaxi、物流配送等领域具有广阔前景。大众与滴滴的合作正是基于这些技术趋势,通过定制化

301

【招聘专场】京东/滴滴/阿里等你来!覆盖电商、金融、IoT前沿业务!

本文汇总了多个互联网大厂测试开发工程师岗位招聘信息,涵盖移动端、服务端、电商、营销等方向。岗位职责主要包括测试需求分析、用例设计、自动化脚本开发、缺陷跟踪及测试流程优化等。要求3-5年相关经验,熟悉主流测试工具和编程语言(如Python/Java),具备良好的沟通能力和问题分析能力。薪资范围15-20k(深圳)起,部分岗位要求AI测试或稳定性架构经验。提供简历评估、内推及面试经验分享服务,适合计算机相关专业、具备测试开发经验的技术人员应聘。

霍格沃兹测试学院的博客 754

看不懂,为什么跑出租车的大战送外卖的,没关系,主要是你不理解大数据

郭德纲老师有一个段子:内行要是和外行去辩论那就是外行。比如我和火箭科学家说,你那火箭不行,燃料不好,我认为得烧柴,最好是煤,煤还得选精煤,水洗煤不好。如果那科学家要是拿正...

weixin_39640818的博客 363

2019 大前端是什么,我们该学什么?

什么是大前端: 大前端是当下技术市场进化出的的一种新的自然选择物种。“单腿”的初、中级客户端工程师,已越来越不适应移动互联网对当下技术的高标准诉求了(特别牛逼的客户端技术专家除外)。 包含了android iOS ,前端和小程序的合集,和用户直接交际的,看得见的我们可以成为大前端! 这是一种更新型的复合型人才物种-大前端。 链接: https://mp.weixin.qq.com/s/o_SKA...

Tamic (大白) 3291

带你彻底弄明白!Android黑科技保活实现原理揭秘,送大厂面经一份!

开头 最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自己都已经跑路了。**最近他表示很苦恼,换工作看机会,几乎没几个公司给面试机会。很多HR问的他最多就是咋从大

276
上一篇: 5G 时代终于来了,华为获首张中国 5G 许可证
下一篇: 字节跳动喜欢招怎样的技术人?
DevolperFront
博客等级 码龄8年 464粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值