Android(安卓),是一个以Linux为基础的开源移动设备操作系统,主要用于智能手机和平板电脑。Android系统最初由安迪·鲁宾(Andy Rubin)等人开发制作,最初开发这个系统的目的是创建一个数码相机的先进操作系统;但是后来发现市场需求不够大,加上智能手机市场快速成长,于是Android被改造为一款面向智能手机的操作系统。於2005年8月被美国科技企业Google收购。
给大家带来一些音视频的面试题,或者说是一些开发思路吧,不希望它成为以后你面试的八股文…这次主要是视频秒开方面。秒开是指用户点击播放到看到画面的时间非常短,在 1 秒之内。为什么需要秒开?目前主流的直播协议是 RTMP,HTTP-FLV 和 HLS,都是基于 TCP 的长连接。在播放的过程中,若播放端所处的网络环境在一个较佳的状态,此时播放会很流畅。若网络环境不是很稳定,经常会发生抖动,如果播放端没有特殊处理,可能会经常发生卡顿,严重的甚至会出现黑屏。而移动直播由于其便捷性,用户可以随时随地发起和
转载地址:https://mp.weixin.qq.com/s/jTEXk_58KxMUgOL33VOn4wJetpack Compose 1.0 正式版已经发布快一年的时间了,我们看到社区正以极大的热情采纳和使用 Compose: Kotlin 语法的简洁性以及使开发界面变得更快速、更简单的声明式开发方式得到了广大开发者们的赞赏。Compose 在社区中的反响我们看到许多公司已经在大规模采纳 Compose 为其应用开发最新、最具创造性的功能。例.
随着 App 的业务增加、版本迭代以及冗余的 “远古时期” 代码,App 代码变得臃肿增量叠加、开发者需要了解各个功能、单测功能编译时长、没有统一快速开发框架,代码复用性低,组件化开发就很有必要。组件化开发框架可以细化为不同的部分,包括 Android UI、网络请求、数据库持久化、图片处理、View、工具类、sdk、内部统一风格组件等;框架包括但不限于通用功能,如果是部门内部项目中通用的功能,也可以独立出来成为一个通用的库存在。① ARouter:基因中自带支持从webview中调用、不用互相注册(不用知
作者:me虽然现在已经有很多不错的换肤方案,但是这些方案或多或少都存在自己的问题。在这篇文章中,我将对 Android 现有的一些动态换肤方案进行梳理,对其底层实现原理进行分析,然后对开发一个新的换肤方案的可能性进行总结。1通过自定义 style 换肤1.1 方案的基本原理这种方案是我之前用得比较多的一种方案。我在使用的时候也做了很多的调整。开源版本可以参考 Colorful 这个库。https://github.com/garretyoder/Colorful它的实现方式是:用户提前自定.
1 Flutter 3.0给我们带来什么影响5月12日,Flutter 3.0 在 Google I/O 开发者大会正式亮相,随着 3.0 版本的发布,Flutter 开发框架终于可以支持六大平台,实现了其跨平台稳定运行的愿景。Flutter 3 现已来临如今,Flutter终于在开发方式上实现了大一统,所有的本地开发均可用Flutter完成,开发者可以通过一套代码库,来支持 iOS、Android、Web、Windows、macOS、Linux 六大平台软件的开发,真正做到一个代码,处处运行的愿
转载地址:https://www.jianshu.com/p/01658bbd7ffa最近在网上看许多面经的文章,有拿到Offer的,也有凉经,这些文章中都有一个共同的特点,就是单单的只有面试题目。而没有什么面试过程中需要注意的细节和面试心得。那些文章给自己做刷题参考还可以。正是这样导致有些人在面试前几天就狂刷那些题,没有去注重面试过程中需要那些细节,到了正式面试的时候就很紧张,怕面试官太严格问的问题打不上,怕与人沟通太紧张,怕自己技术不过关,没错, 这些问题都是我们比较害怕面试紧张的原因,我相信还有许
现在很多应用为了拉新,直接就获取你手机通讯录,查看当前联系人是否是我们的用户,如果不是我们的用户,就邀请他注册我们的应用。常规操作了,微信也这么干过。本文的重点是我们自己的应用如何获取联系人呢?这就涉及到跨进程交互。我们自己的App和系统的联系人App通信,读取联系人App的数据。AIDL! 哟,会抢答了。
1前言大约在去年11月份,Google将官方网站上推荐的MVVM架构悄悄替换成了MVI架构。参考了官方与许多前辈的分享,便有了此文。不过下面的再前言应当是每个读者心中所需要认定的。2再前言总览我所有的博客,我很少写关于架构模式相关的文章。因为我觉得不管是从刚开始所使用的MVP、MVVM再到现在Google官方所推荐的MVI架构,我希望各位读者千万不要将教条主义当真理。官方推荐了MVVM就马上去踩MVP,官方推荐了MVI就马上去踩MVVM,甚至使用MVVM的开发者会鄙视使用MVP的,使用MVI的开发
LiveData 相信大家都非常熟悉了,但是由于协程与 Flow 的不断发展,之前所使用的技术也正在不断被替代,而 LiveData 的功能与 StateFlow 很相似,所以,很多人都在考虑使用 StateFlow 去替代 LiveData。这里,我们就分析下,LiveData 与 StateFlow 的优缺点,以及我们该如何抉择。关于 LiveData 与 StateFlow,网上说的最多的区别,其实就是「官方指导文档」中所讲解的这两点,这里我直接搬运过来:关于第一点,对于 LiveData 与 Sta
转载地址:https://juejin.cn/post/7100121390090551332背景Invalidate() 是 Android 中 View 的方法,通常我们使用它来完成UI的刷新,作用如果这个 View 可见那么 onDraw() 方法将在未来某个时间点被调用。问题invalidate() 会触发那些 view 的重绘,invalidate() 绘制流程是如何实现的?我们带着问题来从源码开始分析:源码分析一、View 与 ViewGroup 的层级在 Android.
作者:郭霖转载地址:https://mp.weixin.qq.com/s/M8SAk_svSmAQ11nrnrcg1g掰手指数一数,我入职微软也已经有一年半的时间了。从入职以来,我一直在从事于开发Android版的Edge浏览器。这么长时间下来,我也慢慢从完全不知如何上手,提个PR都困难,到现在能够负责独立开发一个比较大的功能模块了。不得不说,Edge是我见过的最复杂的一个项目,我是真的很难想象一个浏览器工程可以庞大到如此地步。Chromium本身就已经是一个巨型工程了,而Edge又要在其基础之.
近两年,音视频技术展现了迅猛的发展势头,在短视频、直播、在线会议、教育等行业都有亮眼的应用案例,已经逐渐成为新时代互联网的基础设施之一,从而使得市场对于视频研发人才的需求越来越旺盛。最直观的感受就是直接通过各大招聘平台去了解相关的就业形势。就拿 Android 开发为例,现阶段做音视频开发的薪资水平,至少比同资历的 Android 开发高出 30% 左右。然而音视频技术上手门槛也很高,涉及的技术多,学起来并不容易:音视频的采集、编码、传输、解码、渲染…等等。而且Android 音视频开发这块目前的确没
在互联网行业工作多年,却不知从何时开始,行业内每年都会又一波裁员潮,往年一般都是在寒冬之季,如今已变成仿佛已变成了常态,没有了那个固定时期。大环境已成了这样的定局,那细分到某些领域的话就更加恶劣了。就拿 Android 开发来讲,从最开始某些行业开发都转向Android 开发的火热时代,在到现在每年一些平台上都会出现开发者唱衰Android ,这中间有经历了些什么?其实任何行业都会有从萌芽到爆发的红利阶段,然后在到平常和成熟的阶段。这个在互联网开发行业尤为突出,Android 开发就是典型的一个栗子
音视频开发是一门涉及到很多内容的领域,很多开发者都知道音视频开发这个概念,音视频开发不仅需要掌握图像、音频、视频的基础知识,并且还需要掌握如何对它们进行采集、渲染、处理、传输等一系列的开发和应用但既然我们前面已经提到了技术痛点这个关键词,那学习门槛还是有的。就比如:抖音和快手的短视频需要应用图像处理和视频编码技术,如何在保持高画质的情况下,尽量减少视频文件的大小,是很难也很重要的;连麦直播则需要懂 RTC 和直播技术,如何能够保证在各种网络状况下实现超低延时、降低卡顿率是一个非常难的问题;视频.
对于Android开发,在面试的时候,经常会被问到,说一说View的绘制流程?我也经常问面试者,View的绘制流程.对于3年以上的开发人员来说,就知道onMeasure/onLayout/onDraw基本,知道他们呢是干些什么的,这样就够了吗?如果你来我们公司,我是你的面试官,可能我会考察你这三年都干了什么,对于View你都知道些什么,会问一些更细节的问题,比如LinearLayout的onMeasure,onLayout过程?他们都是什么时候被发起的,执行顺序是什么?如果以上问题你都知道,可能你进来我们公
作者:newki转载地址:https://juejin.cn/post/7099757089081262117有人看了我的框架有疑问了,怎么依赖注入都是用的Hilt啊,都看不懂懂啦,那么复杂。你看Koin框架的依赖注入更简单的啦。由此展开Hilt与Koin的对比。看看性能,代码各方面有没有谁比谁差。一. Hilt的简单使用了解Hilt得先了解它的前身Dagger2。这玩意太复杂了,学习成本陡峭,在MVP框架的时代(2017年左右)还能勉强应付,对应MVVM框架中ViewModel完全的水土不服.
想要更系统、真切的提升自己的能力,阅读源码是一个非常好的方式:不仅限于阅读各大系统源码,还包括各种优秀的开源库。通过阅读源码,除了学习优秀的代码风格和设计思想,还能真正做到“知其然,并知其所以然”,从而使自己开发的过程中更加得心应手,更加快速地找到系统bug的根源。要想成为一名资深的Android开发工程师,你必须要去研究源码的。学习其中的设计模式、思想、架构,让你的代码变得优雅起来。源码也是目前大厂面试比较喜欢问的,研究过源码要从广度和深度去挖掘。为什么要进行源码分析。其中包括下面一些好处:为了帮助大家能
许多Android开发者做了几年的开发,还不知道自己处于那个等级,对未来比较迷茫,不知道自己技能该怎么提升,并且对于初级中级高级需要怎么进行学习,很多人都比较迷惑。为了方便大家成才,我把初级、中级、高级和资深四个常见的岗位需要掌握的一些知识进行如下整理。初级Android开发工程师的定义是掌握基础的Android知识,能够独立完成一个功能,工作年限大概在1-2年,这个层级大部分人通过看一些资料书籍再经过项目练习很快可以达到。这个级别的人往往需要掌握如下一些技能:我对中级Android开发工程师的定义是能够熟
作为一个开发,每天都会有相当一部分的时间花在编译打包上,如果项目比较大的话编译一次可能就要十几分钟。那么在编译打包的过程中到底做了什么?为什么编译那么耗时,又该怎么优化?要解决这些问题,首先就需要我们对编译打包的流程有个总体的了解本文主要包括以下内容首先看下官网给出的编译打包总体流程典型 应用的构建流程如图所示,主要分为以下几步:关于编译打包还有一张更加复杂的图这个看起来是相当复杂的,但其实我们也可以把这些步骤做一个分类,跟总体流程的四个步骤做一个对应资源包含:的资源编译是编译过程中的一项主要工作,之后默
用户新安装一个app,第一印象很重要,那首先给用户感受的就是启动时间,如果用户等待时间过长,就体验很差,如果我们能在满足功能的基础上,把启动时间提升一个等级,无疑给我们的产品赢得更多的用户量打下来基础。三、启动优化工具—traceview通过优化工具可以帮助我们快速定位造成app卡顿的原因,优化工具可以选择traceview,使用方式可以参考: blog.csdn.net/m0_64319298… 另外也可以使用另外一个工具android studio自带的cpu profile,这两个工具使用比较相似
各位小伙伴有没有在工作中遇到过这样的场景:这个需求简单…产品:马哥,我看京东搜索栏的这个搜索历史布局挺好看的,咱那个搜索历史好像比较简陋啊,能不能也搞一个?**马哥:**哦,可以啊,就是这个需求有点麻烦,得加半个月班呢(网上仿京东流式布局的代码多得是,直接抄一个过来,两天搞定)功能上线后…测试:马哥啊,最近好多用户反映你这个页面卡的不行,APP日活用户下滑的非常厉害,咋回事啊!马哥:这个功能也是新上线,出Bug也是难免的,已经在改了!(赶紧百度)手忙脚乱两三天,代码东平西凑,终于把Bug改的差不多了,卡顿问
谈到到Binder相对于其他传统进程间通信方式的优点的时候,我们总会说Binder只需要做“一次拷贝”就行了,而其他传统方式需要“两次拷贝”。这确实是Binder的优点,但再进一步思考就会碰到两个问题:这所谓的“一次拷贝”到底是发生在什么地方?拷贝的到底是什么东西?而很多介绍Binder的文章会列出“一次拷贝”是其优点,但对上面的两个问题要么一笔带过,要么就是回答的并不完全正确,造成一些理解上的混乱。本篇文章意在探索这两个问题的正确答案,所以需要读者对Binder驱动的工作过程和Binder驱动源码有一个
网络框架
在移动应用开发中,列表组件是一个非常常见的 UI 组件,绝大多数应用开发中都会使用到列表组件进行界面的开发,在 Android 开发中列表组件一般使用官方提供的 RecyclerView ,而 RecyclerView 的常规开发需要手动创建对应的 Adapter、ViewHolder 代码,且每个 RecyclerView 的使用都需要编写这种的样板代码,存在重复代码,降低了开发效率,于是为了提高列表的开发效率(偷懒)就有了各种对 RecyclerView 封装的框架来简化其开发流程,本篇就是其中一种框架
最近帮测试做了一点关于签名的需求,今天就和各位同学简单聊一聊关于签名的那些事儿。如果问到 Android 为什么需要签名?大家都可能想到官网的解释:这是一个比较模糊的解释,简单来说,有了签名,就可以让 App 和开发者绑定。毕竟,应用那么多,别的开发者也有可能盗用你的代码,这个时候,包名和你相同,代码和你相同,怎么区分你的 App 和这些人的 App 不是同一个呢?这个时候数字签名就派上用场了。想要彻底了解签名知识,我们得了解以下知识:这一系列的知识各位可能在学习网络的时候或多或少的接触过。我们简单的学习一
PMS的创建过程分为两个部分进行讲解,分别是SyetemServer处理部分和PMS构造方法。其中SyetemServer处理部分和AMS和WMS的创建过程是类似的,可以将它们进行对比,这样可以更好的理解和记忆这一知识点。PMS是在SyetemServer进程中被创建的,SyetemServer进程用来创建系统服务,不了解它的可以查看Android系统启动流程(三)解析SyetemServer进程启动过程这篇文章。从SyetemServer的入口方法main方法开始讲起,如下所示。frameworks/
不过羡慕归羡慕,不过这又为我码字提供了素材(哈哈哈),咱今天就大致分享一下学妹的这美团 Android 4面面经,看看人家大厂面试都问了些啥?学妹自述:晚7点,因为想到下周一才面试,我刚准备出去打个羽毛球,北京的电话就来了。面试官各种抱歉,说开会拖延了。。谈到怎么准备面试,我想说,若你还同无头苍蝇一般不知如何下手,那么第一件事你要做的就是梳理自身的知识脉络。毕竟,想要进大厂,就需要具备更多的知识树,需要掌握更全面的知识体系,所以就需要对知识进行一个系统的梳理了。如果觉得自己手绘Android知识脉络图比较麻
迎面走来的一位中年男子,他一手拿着保温杯,一手抱着笔记本电脑,顶着惺忪的睡眼,不紧不慢地走着,不多的几根头发在他头顶自由飞翔。过了一会,他面对着我坐下,放下电脑和保温杯,边揉眉头边对我说View 的绘制流程应该是每个初高级 Android 攻城狮必知必会的东西,也是面试必考的内容,每个人都有不同的回答方式。简单点譬如 measure,layout,draw 分别对应测量,布局,绘制三个过程,高明一点的会引申出 Handler,同步屏障,View 的事件传递,甚至 activity 的启动过程。掌握哪些东西,
最近有朋友反馈说因为源码是Kotlin,所以看不懂。其实,很多时候看不懂Kotlin的源码很有可能是因为你不知道某些特定语法。正如你看不懂源码其实是因为不了解设计模式一样~以Kotlin中常用的isNullOrEmpty方法为例,源码如下所示:咦?代码很简单,不过怎么看不懂呢?contract是什么鬼,implies 又是什么鬼? 其实当你了解contract函数的使用方法之后,类似的源码你就都能看懂了。Contracts是合同、契约的意思。从Kotlin1.3版本的时候就被引入了,简单的来说Contra
在Android中,负责孵化新进程的这个进程叫做Zygote,安卓上其他的应用进程都是由它孵化的。众所周知,安卓是Linux内核,安卓系统上运行的一切程序都是放在Dalvik虚拟机上的,Zygote也不例外,事实上,它是安卓运行的第一个Dalvik虚拟机进程。既然Zygote负责孵化其他的安卓进程,那么它自己是由谁孵化的呢?既然Android是基于Linux内核,那么Zygote当然就是Linux内核启动的用户级进程Init创建的了。对于Zygote的作用实际上可以概括为以下两点:Zygote进程在Init