聊一聊MIUI最近更新的原子内存
前言比起最近雷布斯的个人演讲,其实我更好奇MIUI 12.5增强版(超级Bug-list修复版)推出的那四个性能优化项目:
焦点计算 - 处理器智能调度机制
原子内存 - 精细化内存管理机制
液态存储 - 文件存储管理机制
智能均衡 - 对旗舰硬件性能的智能调配
作为技术爱好者,这个“原子内存”还真是提起了我的兴趣,因为其他三项还算比较好理解。毕竟内存管理这件事,是操作系统领域几乎永恒的课题。
官方解释我们先来了解下MIUI官方网站是如何介绍原子内存的。官网的海报动效还是阐释得比较清晰明了(辛苦设计师小姐姐,不知道又加了多少班)。
最开始是几个独立的应用各自占有一定的内存,看看这绿,这不就是微信绿。看看这蓝,支付宝?看看这橙,这啥,淘宝吧估计是,肯定不是小米自己。设计姐姐在疯狂暗示。
然后,第二步是拆分应用内存,结束不重要的任务,刚才还是整块的内存占用现在在逻辑上被划分为了大小不等(即不同功能占用内存大小不同)的几块。这一步其实就是核心了,如何来划分呢?按什么维度划分呢?有没有可能划分失误反而影响用户体验呢?我们后面来聊。
第三步,根据场景,进一步精细压缩。这一步也很关 ...
最简单改变状态栏文字及背景颜色的方法
问题我们知道,Android的状态栏(StatusBar)是可以由开发者自行更改背景颜色的,至于文字颜色,不能直接由自己修改色值,而是黑白两种颜色,对应的是Light和Dark两种全局主题模式。
为了良好的用户体验,我们在状态栏背景为深色时,需要给予白色字体,反之亦然。比如这样:
然而,有些时候我们在Light Mode下并不需要黑色字体,就需要自己手动修改了。
方法以前我们修改状态栏相关的内容,都是去找各种反射代码,或者各种封装好的StatusBarUtil之类的,不仅代码不优雅,还容易出现千奇百怪的兼容性问题,不利于维护。
如今,谷歌官方已经给出了解决方案,一切尽在AndroidX。直接看代码:
12345678910111213141516171819import androidx.core.view.ViewCompat;import androidx.core.view.WindowInsetsControllerCompat;public class MainActivity extends BaseActivity { @Override prot ...
安装Anaconda后终端base前缀问题
问题最近想训练个小模型来用用,于是乎我在macOS安装 Anaconda | Individual Edition ,选择的是图形界面安装(64-Bit Graphical Installer),整个过程很顺利,一路下一步就行了。
然鹅,安装完之后,我发现我的终端命令行前缀出现了一个base,像这样:
1(base) -> ~
这就很无语。
原因猜测原因应该是Anaconda安装后在shell的配置文件中注入了脚本,因为我用的是zsh,所以打开 .zshrc 文件可见:
1234567891011121314# >>> conda initialize >>># !! Contents within this block are managed by 'conda init' !!__conda_setup="$('/Users/xxx/opt/anaconda3/bin/conda' 'shell.zsh' 'hook' 2> /dev/null ...
快速实现Sublime Text的Kotlin高亮
问题Sublime Text是一款非常实用的编辑器软件,偶尔不想开大型IDE的时候,用它来看看代码还是不错的。
不过发现在用它来查看Kotlin代码时,默认是一片白,没有语言对应的高亮,点击右下角选择语言时也没有Kotlin这个选项(下图是解决问题之后的)。
解决没有高亮看着多不舒服啊,如何快速搞定呢?已经有开源项目帮我们解决了。
新方法(2023更新)
找到Preferences中的Package Control(如果没有这个选项,说明没有安装这个组件,在Tools中找到最后一个Install Package Control即可,稍等几分钟就会弹窗提示成功)。
打开Package Control后在弹窗中找到Install Package这项,双击或者回车均可,等待几秒就会弹出新的窗口,直接搜索Kotlin关键词,选中第一个,安装即可。
旧方法(package下载链接已失效)GitHub - vkostyukov/kotlin-sublime-package: Sublime Text 2 Package for Kotlin Programming Language ...
我的2021 Google IO大会之旅
此文为初稿备份,终稿已发布于少数派:https://sspai.com/post/66830
2021年的 Google I/O大会 已经圆满闭幕,我们从下面几条官方的FAQ可以看出今年大会与往届有所不同:
2021年Google I/O大会主要面向哪些人群?
全球范围内对Google技术感兴趣的开发者都应关注此次大会,以便了解最新的产品发布、Google专家的行业洞见,并进行实践性学习。
Google I/O 2021大会的举办时间和地点?
2021年开发者大会将于5月18日至20日以虚拟形式举办。
Google I/O 2021大会的费用是多少?
本届Google I/O大会对所有人免费,包括会上那些需要预约的内容,我们希望人人都能参与其中并从中获益。
我觉得最有意思的就是这个线上虚拟大会,这基本上就是一个完整的在线RPG游戏。我相信这也是全世界大多数开发者人生中第一次“亲临”IO大会现场。
接下来我就带大家一起逛逛这次有趣的大会吧。
初入乐园刚进入加载页面的时候,我们就能看见背景是整个大会的像素风地图全貌,可以看见内 ...
忘了买电脑音响?手机来替代!
背景前段时间把吃灰的台式电脑搬出来用,我竟然忘了它没配音响,可我现在就想玩游戏听音乐,也不想买音响,怎么办?除此之外,我相信很多公司的办公台式电脑也是没有带音响的,老板告诉你:上个班还要听啥响?好好搬砖就行了。但有时候加班到四下无人的时候,确实会产生一种想要外放音乐的欲望。
此情此景,我摸了摸我的双扬声器小米10,不仅感叹道:你就是个天生的便携音响呀!于是,我开始寻找让手机和电脑通信并传输音频数据的方法。
从流媒体的理论上讲,无非就是电脑将音频数据传输到手机上播放,电脑端作为Server,手机端作为Client,这样一个简单的C/S架构。大致我能想到3种传输方式:
通过局域网传输数据(例如同时连接某一WiFi)
通过USB等有线的方式传输数据
通过蓝牙配对连接来传输数据
下面我们就来探索一下现有的可行方案。
实践AudioRelay基本信息
有官网:https://audiorelay.net/ ,提供Windows和Android应用程序下载。
Android端在Play Store上也能搜到,简介就是 Stream your PC audio on Wifi or U ...
QQ闪照保存小妙招
QQ闪照在IM工具中,QQ较之于微信一直是比较前卫的,毕竟年轻用户居多。比如QQ闪照就是一个有趣的功能,而且已经推出很久了(记得大概是V6.5左右):不管单聊还是群聊都可用,在发送图片时勾选闪照即可,发送成功后所有人都只能看5秒,时间结束后图片被“销毁”,UI层面被打上厚厚的马赛克。
这个功能一经推出,不少老司机可谓是既爱又恨,我们暂且不说其功能意义和影响。但是相信大家都思考过,怎么把闪照保存下来?
接下来我们就以Android端QQ为例探索一下闪照的持久化存储方式。
截图想多了哈哈,Android端QQ是直接禁止在闪照页面截图的,所以这条路走不痛。
12// 禁止截屏一行代码搞定getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
突破5秒限制这个方法非ROOT用户就不用想了,原理上可以通过类似Xposed的框架来修改这个时间限制,以达到一直查看图片的目的,当然这种做法也比较危险,不排除被腾讯封号。
找图片文件图片消息本质上还是一张 ...
macOS备份迁移系统偏好设置
场景不知道诸位在使用macOS时是否遇到过这样的场景:有两台电脑,想把旧电脑中的系统偏好设置原封不动地迁移(导入)到新电脑中,只关心这些设置,不想迁移其他东西。
解决方案1:官方迁移助理其实官方提供了一个方案,叫“迁移助理”。具体操作步骤可见文档:将内容迁移到一台新的 Mac 上,不仅可以迁移系统设置,还包括整个用户帐户下的文件、应用程序等。
如图,我们可以在此步骤中只选择“系统与网络”,就能实现系统设置的迁移。
方案2:macprefs第一个方案其实是比较安全保险的做法,但是需要注意的是:
在这个示例中,John Appleseed 是一个 macOS 用户帐户。如果这个帐户与新 Mac 上已有的帐户同名,则系统会提示您重命名这个旧帐户或替换新 Mac 上的帐户。如果进行重命名,则这个旧帐户会作为单独的用户出现在新 Mac 上,并且拥有单独的个人文件夹和登录名。如果进行替换,则这个旧帐户会删除并随后替换新 Mac 上的帐户,包括相应个人文件夹中的所有内容。
也就是说你可以选择覆盖或者创建另一个帐户来迁移你的数据。其实很多时候,我们只是想把系统偏好设置做一个导出导入仅此而已,并不 ...
Binder机制学习指北
挖坑待填,未完待续……
参考
写给 Android 应用工程师的 Binder 原理剖析
彻底理解Android Binder通信架构
Android跨进程通信:图文详解 Binder机制 原理
Android Bander设计与实现 - 设计篇
Binder十万个为什么
一次Binder通信最大可以传输多大的数据?
源码茶舍:App进程创建中的poll机制
挖坑待填,未完待续……
系列汇总转眼间几年过去了,“源码茶舍”也算是我写的第一个系列文章,最初取这个名字的意思便是“像喝茶一样品味AOSP源码”,喝茶讲究什么?当然是悠闲。因此,此系列的文章一般都不长,且大多数都是我平时偶尔遇见的问题或者趣点,总之是比较随意的,研究深度是在我能力范围内尽可能深入。
希望以后还能一如既往地更新这个系列,疏漏错误之处还请大家指点。至此汇总一下往期所有:
源码茶舍之没有epoll就没有Handler
源码茶舍之如何由Uri找寻ContentProvider
源码茶舍之FLAG_EXCLUDE_STOPPED_PACKAGES与广播唤醒
源码茶舍之PackageManager获取注册Service数量问题
源码茶舍之android:externalService是什么属性?实现原理?
源码茶舍之由一次简单的ANR分析深入了解Context
微信Android端如何安全降级
前言最近微信8.0开始灰度更新,小龙给大家整的新功能我就不赘述了。有不少小伙伴等不及灰度,也开始自行下载安装。
微信Android端内测下载链接(复制后通过微信打开即可):https://szsupport.weixin.qq.com/cgi-bin/mmsupport-bin/readtemplate?t=page/android_exp__index
然而,“后悔药”无论何时都是有市场的。不喜欢or不习惯新版本?想回退旧版本?这让我想到MIUI刷机党回退旧版ROM的麻烦,当然,微信要回退旧版并非难事。
降级对普通用户来说,Android系统是不允许旧版本App安装覆盖掉新版本的,但并不是说就一定不可能。其实任何其他操作系统类似,应用程序安装的产物都是一些文件而已,本质上覆盖它们即可实现降级,只不过在Android中对非ROOT用户来说不能随意改动这些文件,有权限限制。
获取历史版本既然要降级,我们是不是应该先找到历史版本的Apk?这里直接给大家介绍两个途径吧。
Apkpure:微信历史版本下载通道1
豌豆荚:微信历史版本下载通道2
第一个不要选择XAPK+OBB的形式,而选 ...
InputMethodManager内存泄漏已成为历史
历史问题相信做过很多业务开发的同学都遇到过Android应用的内存泄漏问题,虽然大部分泄漏都是我们自己菜导致的,但实际上系统服务也有可能出现内存泄漏。毕竟,代码都是人写的,AOSP也不是完美无瑕的。
说到系统服务,在处理文本输入的时候,我们以前经常会看到这样的泄漏:
这里大家也可自行搜索了解,大致上就是因为InputMethodManager(下简称IMM)实例内部会持有View,而View又持有Activity的引用,最终在Activity退出后没有正确处理View导致了Memory Leak。我们明白,系统服务生命周期一般是长于Activity的。
这里可以查看旧版AOSP源码(分支:android-9.0.0-r8)来取证:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960public final class InputMethodManager { ... /** * Thi ...
源码茶舍之没有epoll就没有Handler
Handler,英文释义:处理者,处理程序。他就是Android系统中的打工人,背负着传递消息的重任。很多人在第一次尝试去阅读framework源码时,可能也是从Handler消息机制开始的,我们会发现源码的很多地方都用到了Handler。然而,他好像并没有我们想象的那么简单,如果我们要深入探索的话,可以一直追溯到Linux内核。
预备本文分析源码均基于API 29,来源于官方AOSP:cs.android.com
问号Handler的API使用还是比较简单的,我们比较常用的就是通过类似如下方式来发送一个Runnable到Handler所在线程去执行:
12new Handler().post(() -> { /* do something */ });new Handler().postDelayed(() -> { /* do something after 3s */ }, 3000);
这里为了简单直接用了匿名类,当然你也可以实现自定义的Handler并重写 handleMessage 方法来处理消息。post 最终其实 ...
Mace-micro引擎编译与测试
官方简介Mobile AI Compute Engine (MACE) 是一个专为移动端异构计算平台(支持Android, iOS, Linux, Windows)优化的神经网络计算框架。主要从以下的角度做了专门的优化:
性能
代码经过NEON指令,OpenCL以及Hexagon HVX专门优化,并且采用Winograd算法来进行卷积操作的加速。此外,还对启动速度进行了专门的优化。
功耗
支持芯片的功耗管理,例如ARM的big.LITTLE调度,以及高通Adreno GPU功耗选项。
系统响应
支持自动拆解长时间的OpenCL计算任务,来保证UI渲染任务能够做到较好的抢占调度,从而保证系统UI的相应和用户体验。
内存占用
通过运用内存依赖分析技术,以及内存复用,减少内存的占用。另外,保持尽量少的外部依赖,保证代码尺寸精简。
模型加密与保护
模型保护是重要设计目标之一。支持将模型转换成C++代码,以及关键常量字符混淆,增加逆向的难度。
硬件支持范围
支持高通,联发科,以及松果等系列芯片的CPU,GPU与DSP(目前仅支持Hexagon)计算加速。CPU模式支持An ...
借助acme.sh免费开启网站的HTTPS(Apache2环境)
本文仅记录无套路搞定网站HTTPS的方法。网上搜索的资料实在太杂乱了,就连acme.sh官方文档也不够详尽。
主要就三步:生成证书、安装证书、配置SSL。下文以Ubuntu 16.04(版本不重要) + Apache2为例。默认已经安装crontab、openssl等基本工具。网站目录也是默认的 /var/www/html/ 。
生成证书1、先做准备工作:
123456# 进入服务器的用户(一般是root)目录然后创建文件夹cd ~mkdir -p ~/.acme.sh/cd ~/.acme.sh/# 配置一下别名,等下方便用alias acme.sh=~/.acme.sh/acme.sh
2、安装acme.sh,它可以帮你搞定免费证书:
1234# 此时已经在~/.acme.sh/目录下,开始安装curl https://get.acme.sh | sh# 安装过程可能会提示socat没装,那你就装一下,装完再重新执行一次上面的安装命令apt-get install socat
3、生成证书,以 test.com 域名作为下文示例(当然 ...