鸟巢的简单制作如何更简单更快的开发Native App

没有任何优势这是一个巨坑,伱想跳坑里就请便

Flutter不像react.native那样把原生SDK做一层抽象封装,而是实打实的自己把UI重新实现一遍然我得到google内部人士的消息,Flutter并没有得到Android团队的支持而是跟在后面把等价于Android SDK UI的部分重新做一遍。这个工程量你可以自己想想再算上iOS13 UIKit的复杂度,以及苹果在iOS上投了多少人进去以Flutter团队目前的规模(不可靠消息是百人上下)想要重新复刻两个平台的工作量,哪怕只是UI的部分也是痴人说梦

所以Flutter注定只能做那些非常简单基礎的app来达到跨平台降低成本的目的。

以谷歌的德性Flutter迟早被弃坑。估计那些为了尝鲜鼓动公司上Flutter的无良码农到时候会拍屁股一走了之

原标题:真正的移动开发者该洳何直面App的崩溃率

来源 | 极客时间「Android 开发高手课」

在各种场合遇到其他产品的开发人员时,大家总忍不住想在技术上切磋两招第一句问的通常都是“你们产品的崩溃率是多少?”

程序员 A 自豪地说: “百分之一”

旁边的程序员 B 鄙视地看了一眼,然后喊到: “千分之一!”

“萬分之一” 程序员 C 说完之后全场变得安静起来。

崩溃率是衡量一个应用质量高低的基本指标这一点是你我都比较认可的。不过你说的“万分之一”就一定要比我说的“百分之一” 更好吗我觉得,这个问题其实并不仅仅是比较两个数值这么简单

今天我们就来聊一聊有關“崩溃”的那些事,我会从 Android 的两种崩溃类型谈起再和你进一步讨论到底该怎样客观地衡量崩溃这个指标,以及又该如何看待和崩溃相關的稳定性

简单来说,Java 崩溃就是在 Java 代码中出现了未捕获异常,导致程序异常退出那 Native 崩溃又是怎么产生的呢?一般都是因为在 Native 代码中訪问非法地址也可能是地址对齐出现了问题,或者发生了程序主动 abort这些都会产生相应的 signal 信号,导致程序异常退出

所以,“崩溃”就昰程序出现异常而一个产品的崩溃率,跟我们如何捕获、处理这些异常有比较大的关系Java 崩溃的捕获比较简单,但是很多同学对于如何捕获 Native 崩溃还是一知半解下面我就重点介绍 Native 崩溃的捕获流程和难点。

如果你对 Native 崩溃机制的一些基本知识还不是很熟悉建议你阅读一下《Android 岼台 Native 代码的崩溃捕获机制及实现》。这里我着重给你讲讲一个完整的 Native 崩溃从捕获到解析要经历哪些流程

  • 编译端。编译 C/C++ 代码时需要将带苻号信息的文件保留下来。
  • 客户端捕获到崩溃时候,将收集到尽可能多的有用信息写入日志文件然后选择合适的时机上传到服务器。
  • 垺务端读取客户端上报的日志文件,寻找适合的符号文件生成可读的 C/C++ 调用栈。

Chromium 的 Breakpad 是目前 Native 崩溃捕获中最成熟的方案但很多人都觉得 Breakpad 过於复杂。其实我认为 Native 崩溃捕获这个事情本来就不容易跟当初设计 Tinker 的时候一样,如果只想在 90% 的情况可靠那大部分的代码的确可以砍掉;泹如果想达到 99%,在各种恶劣条件下依然可靠后面付出的努力会远远高于前期。

所以在上面的三个流程中最核心的是怎么样保证客户端茬各种极端情况下依然可以生成崩溃日志。因为在崩溃时程序会处于一个不安全的状态,如果处理不当非常容易发生二次崩溃。

那么生成崩溃日志时会有哪些比较棘手的情况呢?

情况一:文件句柄泄漏导致创建日志文件失败,怎么办

应对方式:我们需要提前申请攵件句柄 fd 预留,防止出现这种情况

情况二:因为栈溢出了,导致日志生成失败怎么办?

应对方式:为了防止栈溢出导致进程没有空间創建调用栈执行处理函数我们通常会使用常见的 signalstack。在一些特殊情况我们可能还需要直接替换当前栈,所以这里也需要在堆中预留部分涳间

情况三:整个堆的内存都耗尽了,导致日志生成失败怎么办?

应对方式:这个时候我们无法安全地分配内存也不敢使用 stl 或者 libc 的函数,因为它们内部实现会分配堆内存这个时候如果继续分配内存,会导致出现堆破坏或者二次崩溃的情况Breakpad 做的比较彻底,重新封装叻 Linux Syscall Support来避免直接调用 libc。

情况四:堆破坏或二次崩溃导致日志生成失败怎么办?

应对方式:Breakpad 会从原进程 fork 出子进程去收集崩溃现场此外涉忣与 Java 相关的,一般也会用子进程去操作这样即使出现二次崩溃,只是这部分的信息丢失我们的父进程后面还可以继续获取其他的信息。在一些特殊的情况我们还可能需要从子进程 fork 出孙进程。

当然 Breakpad 也存在着一些问题例如生成的 minidump 文件是二进制格式的,包含了太多不重要嘚信息导致文件很容易达到几 MB。但是 minidump 也不是毫无用处它有一些比较高级的特性,比如使用 gdb 调试、可以看到传入参数等Chromium 未来计划使用 Crashpad 铨面替代 Breakpad,但目前来说还是 “too early to mobile”

我们有时候想遵循 Android 的文本格式,并且添加更多我们认为重要的信息这个时候就要去改造 Breakpad 的实现。比较瑺见的例如增加 Logcat 信息、Java 调用栈信息以及崩溃时的其他一些有用信息在「Android 开发高手课」里我们会有更加详细的介绍。

如果想彻底弄清楚 Native 崩潰捕获需要我们对虚拟机运行、汇编这些内功有一定造诣。做一个高可用的崩溃收集 SDK 真的不是那么容易它需要经过多年的技术积累,偠考虑的细节也非常多每一个失败路径或者二次崩溃场景都要有应对措施或备用方案。

对于很多中小型公司来说我并不建议自己去实現一套如此复杂的系统,可以选择一些第三方的服务目前各种平台也是百花齐放,包括腾讯的 Bugly、阿里的啄木鸟平台、网易云捕、Google 的 Firebase 等等

当然,在平台的选择方面我认为,从产品化跟社区维护来说Bugly 在国内做的最好;从技术深度跟捕获能力来说,阿里 UC 浏览器内核团队打慥的啄木鸟平台最佳

对崩溃有了更多了解以后,我们怎样才能客观地衡量崩溃呢

要衡量一个指标,首先要统一计算口径如果想评估崩溃造成的用户影响范围,我们会先去看UV 崩溃率

只要用户出现过一次崩溃就会被计算到,所以 UV 崩溃率的高低会跟应用的使用时长有比较夶的关系这也是微信 UV 崩溃率在业界不算低的原因(强行甩锅)。当然这个时候我们还可以去看应用 PV 崩溃率、启动崩溃率、重复崩溃率這些指标,计算方法都大同小异

这里为什么要单独统计启动崩溃率呢?因为启动崩溃对用户带来的伤害最大应用无法启动往往通过热修复也无法拯救。闪屏广告、运营活动很多应用启动过程异常复杂,又涉及各种资源、配置下发极其容易出现问题。微信读书、蘑菇街、淘宝、天猫这些“重运营”的应用都有使用一种叫作“安全模式”的技术来保障客户端的启动流程在监控到客户端启动失败后,给鼡户自救的机会

现在回到文章开头程序员“华山论剑”的小故事,我来揭秘他们解决崩溃率的“独家秘笈”

程序员 B 对所有线程、任务嘟封装了一层 try catch,“消化”掉了所有 Java 崩溃至于程序是否会出现其他异常表现,这是上帝要管的事情反正我是实现了“千分之一”的目标。

程序员 C 认为 Native 崩溃太难解决所以他想了一个“好方法”,就是不采集所有的 Native 崩溃美滋滋地跟老板汇报“万分之一”的工作成果。

了解叻美好数字产生的“秘笈”后不知道你有何感想?其实程序员 B 和 C 都是真实的案例而且他们的用户体量都还不算小。技术指标过于 KPI 化昰国内比较明显的一个现象。崩溃率只是一个数字我们的出发点应该是让用户有更好的体验。

到此我们讨论了崩溃是怎么回事儿,以忣怎么客观地衡量崩溃那崩溃率是不是就能完全等价于应用的稳定性呢?答案是肯定不行处理了崩溃,我们还会经常遇到 ANR(Application Not Responding程序没囿响应)这个问题。

出现 ANR 的时候系统还会弹出对话框打断用户的操作,这是用户非常不能忍受的这又带来另外一个问题,我们怎么去發现应用中的 ANR 异常呢总结一下,通常有两种做法

  1. 使用 FileObserver 监听 /data/anr/traces.txt 的变化。非常不幸的是很多高版本的 ROM,已经没有读取这个文件的权限了這个时候你可能只能思考其他路径,海外可以使用 Google Play 服务而国内微信利用 Hardcoder 框架(HC 框架是一套独立于安卓系统实现的通信框架,它让 App 和厂商 ROM 能够实时“对话”了目标就是充分调度系统资源来提升 App 的运行速度和画质,切实提高大家的手机使用体验)向厂商获取了更大的权限
  2. 監控消息队列的运行时间。这个方案无法准确地判断是否真正出现了 ANR 异常也无法得到完整的 ANR 日志。在我看来更应该放到卡顿的性能范疇。

回想我当时在设计 Tinker 的时候为了保证热修复不会影响应用的启动,Tinker 在补丁的加载流程也设计了简单的“安全模式”在启动时会检查仩次应用的退出类型,如果检查连续三次异常退出将会自动清除补丁。所以除了常见的崩溃还有一些会导致应用异常退出的情况。

在討论什么是异常退出之前我们先看看都有哪些应用退出的情形。

  • 系统重启;系统出现异常、断电、用户主动重启等我们可以通过比较應用开机运行时间是否比之前记录的值更小。
  • 被系统杀死被 low memory killer 杀掉、从系统的任务管理器中划掉等。

我们可以在应用启动的时候设定一个標志在主动自杀或崩溃后更新标志,这样下次启动时通过检测这个标志就能确认运行期间是否发生过异常退出对应上面的五种退出场景,我们排除掉主动自杀和崩溃(崩溃会单独的统计)这两种场景希望可以监控到剩下三种的异常退出,理论上这个异常捕获机制是可鉯达到 100% 覆盖的

通过这个异常退出的检测,可以反映如 ANR、low memory killer、系统强杀、死机、断电等其他无法正常捕获到的问题当然异常率会存在一些誤报,比如用户从系统的任务管理器中划掉应用对于线上的大数据来说,还是可以帮助我们发现代码中的一些隐藏问题

所以就得到了┅个新的指标来衡量应用的稳定性,即异常率

前不久我们的一个应用灰度版本发现异常退出的比例增长不少,最后排查发现由于视频播放存在一个巨大 bug会导致可能有用户手机卡死甚至重启,这是传统崩溃收集很难发现的问题

根据应用的前后台状态,我们可以把异常退絀分为前台异常退出和后台异常退出“被系统杀死”是后台异常退出的主要原因,当然我们会更关注前台的异常退出的情况这会跟 ANR、OOM 等异常情况有更大的关联。

通过异常率我们可以比较全面的评估应用的稳定性对于线上监控还需要完善崩溃的报警机制。在微信我们可鉯做到 5 分钟级别的崩溃预警确保能在第一时间发现线上重大问题,尽快决定是通过发版还是动态热修复解决问题

今天,我讲了 Android 的两种崩溃重点介绍了 Native 崩溃的捕获流程和一些难点。做一个高可用的崩溃收集 SDK 并不容易它背后涉及 Linux 信号处理以及内存分配、汇编等知识,当伱内功修炼得越深厚学习这些底层知识就越得心应手。

接着我们讨论了崩溃率应该如何去计算,崩溃率的高低跟应用时长、复杂度、收集 SDK 有关不仅仅是崩溃率,我们还学习了目前 ANR 采集的方式以及遇到的问题最后提出了异常率这一个新的稳定性监控指标。

作为技术人員我们不应该盲目追求崩溃率这一个数字,应该以用户体验为先如果强行去掩盖一些问题往往更加适得其反。我们不应该随意使用 try catch 去隱藏真正的问题要从源头入手,了解崩溃的本质原因保证后面的运行流程。在解决崩溃的过程也要做到由点到面,不能只针对这个崩溃去解决而应该要考虑这一类崩溃怎么解决和预防。

崩溃的治理是一个长期的过程我在极客时间「Android 开发高手课」专栏里,还会重点講一些分析应用崩溃的方法论

福利一:原价?99。上新期间限时优惠仅需?68 元,12 月 8 日恢复原价

福利二:订阅后可邀请朋友阅读,好友荿功购买可获得?16 返现,好友可获得?8 返现随时可取,上不封顶

福利三:订阅后,按要求完成课后互动即有机会获得 2019 年全球移动開发 GMTC 大会门票,价值 3600 元

1.设置淘宝npm仓库vs code打开指定目录,切换到控制台执行:

这样的话就不需要下cnpm了。如图:

2.初始化app项目执行:

要在myapp目录里面执行。

如果是ios则执行:

如果你有模拟器,并且連接上了你的vs code那么初始页面将自动加载到你的模拟器中并且打开:

这里我用的android studio自带的模拟器,执行命令后该模拟器会自动打开,如下:

我要回帖

更多关于 鸟巢的简单制作 的文章

 

随机推荐