新技术又又又又叒叒来了?

294 篇文章 4 订阅
268 篇文章 8 订阅

此“新技术”主要指大厂近期对外的分享,「大厂的对外分享系列」更新一篇, 目前第 20 期,如果你对新技术都比较感兴趣,欢迎持续关注。

标题中的“又”的个数+10就是当前期数了。

上一期链接:

新技术又又又又又又叒来了?

距离上一期两个月啦,看看这两个月大厂都更新了什么吧。

1. Google官方一些新技术更新

这两个月没有太多的大版本更新。

Android 12 Beta 4发布

简单来说,就是 Android 12快来了:

Beta 4已经达到了平台稳定性里程碑,也就是说平台不会再变更了。

各个厂商基于 Beta 4版本的更新大家可以大胆适配了,按照目前厂商的跟进速度,应该很多头部 App 会收到兼容 Android 12的消息。

注意,这里指的是兼容Android 12,即App在 Android 12上可以稳定的运行即可,适配更多指的是将 targetVersion 提升到31,工作量不是一个量级的。

详细可以阅读:

平台稳定性里程碑 | Android 12 Beta 4 现已发布

2. 大厂对外文章分享

这两个月大厂对外分享文章非常多...开始吧。

微信移动客户端开发团队 WeMobileDev

微信Android客户端的卡顿监控方案

一般提到卡顿监控,能够想到的就是通过设置Looper#print + Chorographer 相关代码,监听每个消息的耗时,以及当前应用的帧率。

该文首先分析了常见方案的不足,指出Looper#print无法监控 IdelHandler 以及 TouchEvent 的卡顿,并给出解决方案。

另外随着黑科技的增多,项目中很可能出现「同步屏障」被漏移除的问题,一旦被遗漏,那么会导致同步消息一直无法被处理,针对这种情况也给出了一种检测和兜底方案,非常值得学习。

微信Android客户端的ANR监控方案

如果聊ANR 的原理,大多数同学应该比较熟悉,基本可以说出有哪些情况,并且这些情况多数的原理都是基于”timeout“机制;

聊ANR 的排查,大家可以说出通过 trace.txt排查。

但是如果聊 ANR 的监控,应该还是比较迷茫的,因为官方并没有像 Java Crash Handler 那样,给出一个明确方式用来监控 ANR,而且目前很多设备对于 trace.txt 也不让 App 读取了。

当然了,如果要搞清楚如何监控,那么 ANR 发生时,系统会做哪些事情,整个的流程是要搞清楚的;

然后基于流程,看看我们能在哪些环节做一些事情,详细的可以阅读本文,看看微信的 ANR 监控方案,而且该方案已经开源在 matrix 中了。

快速缓解 32 位 Android 环境下虚拟内存地址空间不足的“黑科技”

以前聊到内存,大家掌握最多的应该就是 Java的堆内存,可以通过设置 largeHeap让应用内存大一些。

现在聊内存,更多的会聊 native 内存以及虚拟内存。

看这篇文章的标题,缓解 32 位缓解下,虚拟内存地址空间不足,那么我们可以会问,这个 32 位和 64 位下虚拟内存的地址空间有所不同吗?

是的:

  1. 32 位设备+32 位 app:一般虚拟内存最大可用接近3G;

  2. 64 位设备+ 32 位 app:一般虚拟内存最大可用接近4G;

  3. 64 位设备+64 位 app:  基本不用考虑虚拟内存不足的问题了。

如果你当前 App 发现因为虚拟内存造成的 OOM 问题比较多,那么微信分享的黑科技:

  1.  线程默认栈空间减半;

  2. 释放 WebView 预分配内存;

  3. 虚拟机空间缩减;

可以尝试使用一波。

Android App 电量统计原理与优化

电量监控这块我了解的不多,不过庆幸的是文中提出 BatteryCanary 的核心原理为线程监控+系统服务调用监控,这两块我都有过一点了解。

早期一些获取 app cpu 使用率的方案,都是读入/proc/stat 拿到设备 cpu 的使用情况,再通过/proc/pid/stat 拿当前进程的 cpu 使用情况,算 diff 算百分比。

但是/proc/stat 在 8.0 以及以上版本都读取不到了。

当然我们也可以通过看 1s 内,我们进程实际使用的时间来估算。

具体定位耗电,肯定还要看当前进程每个线程的 cpu 使用时间情况,其实就是读取文件/proc/pid/task/tid/stat

大家是不是有点懵逼,其实文件夹名称是有规律的:

  • /proc/stat 系统的

  • /proc/进程 id/stat 当然进程的运行情况

  • /proc/进程 id/task/线程 id/stat 当然进程下,某个线程 id 的运行情况

你就知道从某些文件中可以去读到 app 进程以及线程的运行情况就可以了,然后就是数据做分析。

第二点提到系统服务调用监控,这个主要就是指我们的binder 调用了,比如大家常见的各种 ServiceManager,有个观点我跟作者很类似:

  1. 如果想要监控服务调用频率,推荐通过常规 hook的手段,系统服务大多基于 aidl,所以都是接口。此外大多有统一的暴露类以及缓存手段,hook 起来还是比较方便的;

  2. 但是如果上线一些策略,比如缓存策略之类的,更建议编译期字节码 hook,针对调用出做方法替换。

前者更简单全面但不一定稳定,后者方案没有任何兼容性问题。

对于服务监控,也在近期博客计划内,大家稍等。

仅聊两点我熟悉的,对于电量监控,大家还是详细阅读此文。

腾讯音乐技术团队

全民K歌折叠屏适配探索

现在Android异形屏越来越多了,三星、华为、oppo、小米 pad 等等...

这篇文章详细的分享了折叠屏的适配方案以及踩坑~

MOO音乐的Flutter实战总结之内存治理(上)

MOO音乐的Flutter实战总结之内存治理(中)

MOO音乐的Flutter实战总结之内存治理(下)

Flutter 我这边掌握不多,大家按需查看吸收~

网易云音乐大前端团队

Android 开发,如何写出符合规范的异常处理代码?

这篇文章读起来很舒服,给了很多场景下的处理建议,比如 Kotlin 没有 Checked Exception 该如何处理,以及在 finally{}代码块不要写 return 相关...

AGP 升级之旅

AGP全称就是 android gradle plugin ,一般就是项目根目录 build.gradle 中定义的版本。

因为每个版本 AGP 都会变更一些 API,所以如果你所在项目有各种干涉到编译的脚本,那么建议详细阅读下。

vivo 互联网技术

手把手教你实现Android编译期注解

apt 实际项目中还是有不少使用场景的,例如用来去除反射或者一些模板性的代码的生成,文章还是比较详细的。

不过有一点「编译期注解只能生成代码,但是不能修改代码」,这个在 Processor中利用 AST 能做代码相关改动。

Android模块化开发实践

组件化的必经步骤,写得还是比较实在的~

京东零售技术

AOP技术在APP开发中的多场景实践

提到了 AOP 的一些实验场景:

  • 性能监控

  • 隐私方法/字段合规检测

  • 线程使用数优化

第3 个线程数优化,之前在一个面试分享的题目中出现过,大家可以查看一波,主要还是基于字节码 hook 去做。

对于隐私合规检测,如果有特定的 API,静态检测来说,字节码 hook 也是比较合适的。

如果要自动化,也可以把apk->dex->smali,做字符串匹配。

文中提到了许多 AOP方案:apt,aspectj,javassist/AMS,xposed/Dexposed,大家可以关联想一下使用场景。

闲鱼技术

关于闲鱼的ANR治理,我有几条心得...

大家可以与微信的 ANR 文章一起来看,文章的心得还是不错的:sp 优化,这个实打实减少 ANR; 

ipc 缓存这个,对耗电、流畅度都会有帮助,体验在 ANR 可能不会那么明显,但是算一个技术优化的方案。

字节跳动终端技术

Flutter 疑难杂症系列:键盘原理及常见问题解决方案

Flutter 疑难杂症系列:实现中文文本的垂直居中

Flutter 踩坑系列...

字节跳动技术团队

西瓜视频稳定性治理体系建设三:Sliver 原理及实践

西瓜卡顿 & ANR 优化治理及监控体系建设

又来卡顿和 ANR 啦,前面的文章主要讲了监控、一些经验分享,实际上即使监控到 ANR 的产生,消费也是个非常大的问题。

 很多 ANR_INFO 是不足矣定位 ANR的,很多都是主线程阻塞之后,然后用户触摸屏幕没有反应,然后给一个 input not resp 类似的INFO,肯定是对不上的。

字节的分享更专注于,更细致的监控,上报足够细化的信息所以和卡顿可以放一起建设。

抖音Android无障碍开发知识总结

无障碍这块关注比较少,以前的认知就能够做一些「自动化处理的事情」,大家可以按需关注。


快手大前端技术

卡死 App 的神秘字符串,究竟是何方神圣(上)

卡死 App 的神秘字符串,究竟是何方神圣(下)

之前看到微信也遇到过类似的卡死的事情~

爱奇艺技术产品团队

如何在Android 8.0以下高效地复用图片?

看到这个标题我就想灵魂一问:为什么说 8.0 以下,8.0以及以上图片有什么变化吗?

其实还是内存相关存储发生了变化,8.0 以及以上 Bitmap 的像素存储在 native 内存,而 8.0 以下存储在 Java 堆中,毕竟堆内存是有上限的,所以对内存相关需要更加的注意。

自如大前端团队

自如客APP裸眼3D效果的实现

https://juejin.cn/post/6989227733410644005

这个效果算是掘金近期 Android 版本最火的文章了,实现起来不复杂,效果确实不错。

Android_增量更新(BSDiff)详解

https://juejin.cn/post/6991279283620544543

这个比较常规了,BSDiff 主要是二进制 diff,增量更新的一些场景;另外 tinker 开源库里面印象中有一套 Java 的实现,相对 native 实现更可控一些。

深入理解内存泄漏

https://juejin.cn/post/6992508087336697887

玩转ViewPager2以及在自如中的应用

https://juejin.cn/post/6998063057649811486

这两篇比较常规,直接看即可~

快手无线电商团队

一起设计一个Android倒计时组件

https://juejin.cn/post/6984725689257689101

一般遇到倒计时,大家会用 Handler.post 或者 Timer?这个文章还真是触发了我一个盲点,就是是否「支持CPU休眠」,以前从未关注过,值得看一下。

历史分享(点击可直接访问):

3.  字节跳动开源 bhook

字节跳动开源 Android PLT hook 方案 bhook

字节的 Android PLT hook 方案 bhook 开源了。bhook 支持 Android 4.1 - 12 (API level 16 - 31),支持 armeabi-v7a, arm64-v8a, x86 和 x86_64,使用 MIT 许可证授权。

https://github.com/bytedance/bhook

这个就比较硬核了,之前 native hook 用的比较多的是 iqiyi 的 xhook。文章中也指出了一下 xhook 的不足之处。

当然作者对于xhook 是有绝对的话语权的,从提交人来看,两个框架的作者都是 caikelun,巨人就是我自己的感觉。

4. 字节跳动开源移动研发工具链 MBox

一文读懂字节跳动自研移动研发工具链 MBox

MBox 是一款运行在 macOS 上,专注于移动端研发的工具链应用。它不仅能帮助开发者管理环境、项目依赖和仓库,还允许开发者通过开发 MBox 插件来定制属于自己的工具链。

https://github.com/mboxplus/mbox

 转自:新技术又又又又叒叒来了?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,根据您提供的问题,我来回答。这是一个经典的背包问题,可以使用动态规划来解决。具体思路为:对于每个酒,我们可以选择放或者不放到背包中,如果放入,则需要考虑可用的酒量和当前酒的重量是否超过限制,以及当前价值是否更高,如果更高则更新当前最大价值和选择的酒的编号。最终输出最大价值和选择的酒的编号即可。以下是示例代码: ``` #include <iostream> #include <vector> #include <algorithm> using namespace std; struct Wine { int weight; int price; int id; }; bool cmp(Wine a, Wine b) { return a.price > b.price; } int main() { int n, m; while (cin >> n >> m) { vector<Wine> wines(n); for (int i = 0; i < n; i++) { cin >> wines[i].weight >> wines[i].price; wines[i].id = i + 1; } sort(wines.begin(), wines.end(), cmp); vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0)); vector<vector<int>> choice(n + 1, vector<int>(m + 1, 0)); for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (wines[i - 1].weight > j) { dp[i][j] = dp[i - 1][j]; } else { int v1 = dp[i - 1][j]; int v2 = dp[i - 1][j - wines[i - 1].weight] + wines[i - 1].price; if (v2 > v1) { dp[i][j] = v2; choice[i][j] = 1; } else { dp[i][j] = v1; } } } } int max_price = dp[n][m]; if (max_price == 0) { cout << "There is no proper wine." << endl; } else { cout << "The max price is " << max_price << "." << endl; vector<int> chosen; int i = n, j = m; while (i > 0 && j > 0) { if (choice[i][j] == 1) { chosen.push_back(wines[i - 1].id); j -= wines[i - 1].weight; } i--; } sort(chosen.begin(), chosen.end()); cout << "Choose:"; for (int i = 0; i < chosen.size(); i++) { cout << " " << chosen[i]; } cout << endl; } } return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值