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 域名作为下文示例(当然 ...
Magisk与EdXposed框架安装实践(Android P及以上)
记得初中的时候还在用Android 2.3,高中开始刷机,每个月都去追论坛大佬的自定义精简ROM,不亦乐乎,这一晃都过了快十年了。从以前旧版Android(支持到8.x)的Xposed到现在的EdXposed、Magisk等玩机框架,大佬些的脚步从未停歇。模块开发生态也好了很多(得益于Github及各种文档)。不过由于现在ROM厂商越来越深度的定制和限制(当然也是考虑到普通用户的安全),ROOT起来也麻烦了不少。
其实我自从以前用Android 4.x时搞过机,后来也很久没接触这些了。最近把手边的测试机器(小米POCO F1,骁龙845,Android 10、MIUI 12)拿来搞了搞,发现操作过程也不是很麻烦,本文就仅作记录吧,方便以后查阅,毕竟各种链接每次都临时搜还是很费事。
Xposed由于现在Android新版本的普及,新上市的手机基本都是8.0以上了。所以以前的Xposed框架已经不适用。EdXposed团队成为了后续版本研发的继任者,从Xpsoed的wikipedia中可以查到交接历史:
2017年7月,abforce在GitHub上发布了支持Nougat的xposed, ...
等差数列异或和的小规律
背景异或(xor,运算符号^):按位计算,同0异1,1 ^ 0 = 1 ,1 ^ 1 = 0 ,如此。
现定义等差数列 1, 2, ... , n 的 异或和 为 f(n) = 1 ^ 2 ^ ... ^ n ,求f(n)的值。
实现我们很容易想到质朴的实现如下:
1234567int func(int n) { int xor_sum = 0; for (int i = 1; i <= n; ++i) { xor_sum ^= i; } return xor_sum;}
时间复杂度O(n),空间复杂度此处没有太大必要讨论。
通式联想到等差数列的四则运算都是有求和公式的,那么异或运算有没有呢?直接这么看也看不出来,先输出个十来项看看规律:
12int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18};// 1 3 0 4 1 7 0 8 1 11 0 12 1 15 0 16 1 19 ...
Kotlin变长参数的一些小坑
Java中的变长参数先来看看Java中的变长参数,很简单,为了后面的对比,我们做进行一个连续的传参:
12345678910111213141516171819import java.util.Arrays;public class TestVarargs { public static void main(String[] args) { test1("1", "2"); } private static void test1(String... args) { test2(args); } private static void test2(Object... args) { System.out.println(Arrays.toString(args)); System.out.println(args.length); }}// 输出结果// [1, 2]// ...
浅谈JVM语言之函数式编程
Java中的函数式编程闲聊函数式编程在上世纪五十年代就有了,只不过在工业界一直不温不火,最近十年才被广泛认知。其理论基础也并非为编程而设计,而是一种数学抽象(Lamda演算),其实初中就学过了,λ表达式。
在JS(建议把JS作为函数式编程思想学习的入门语言,Java的实现略显臃肿,可能不太便于理解)当中,函数式编程算是应用比较多的了。各现代高级编程语言,都或多或少地支持了函数式编程。
一些基本特点总结
相比平常的指令式编程,函数式编程更在乎执行结果而非过程;
函数是一等公民,可以像普通的数值、引用等变量一样赋值、作为参数传递、作为返回值;
函数是纯函数,即函数不能产生副作用,如不能修改全局变量等,固定的输入就映射固定的输出。
简单示意一下不代表任何语言,因为不同语言在实现方式上有差异,但核心思想不变:
123456789101112// 定义一个函数g,并赋值给ff = g(x, y) = x + y// 写一个方法,函数作为参数传递printF(g) { print(g(1, 2))}// 调用方法printF(f) // 打印结果3// 作为返回值get ...
macOS下载AOSP的小坑
爬坑以下载Android X源码为例,过程和下载AOSP是一样的,只是分支不同而已。源码在线地址:frameworks/support
安装Homebrew在Mac上搞开发必须的包管理工具,类似Ubuntu上的apt。安装非常简单,一行命令的事情,来自官网(Homebrew):
1/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
安装repo工具可以直接下载谷歌官方的repo源码(https://gerrit.googlesource.com/git-repo)然后自己配置命令,但这样很麻烦,直接用brew安装整套Android编译工具:
1brew cask install android-platform-tools
装完就可以直接使用repo命令了。
下载AOSP源码详细过程可参考:Win10用WSL下载AOSP
123456# 创建一个源码目录,命名随意mkdir AOSPcd AOSP# 这里以An ...
覆盖安装Play Store版本的国产App
前言对于Android平台,如果在国内应用商店安装诸如微信、支付宝等国产大型App,相比去Google Play Store安装,会多要不少权限,即便权限无差异,在隐私政策等规则方面,Play Store也会更严格一些,能上架的应用肯定不敢乱搞。之前也有不少用户反映在Play Store安装的微信要流畅不少,某些功能细节也会有差异。
不过由于严格的审核机制,Play Store上的国产App更新频率普遍落后于国内应用商店,如果我们已经安装了国内的最新版本,正常情况下就没办法覆盖安装低版本了。Play Store上也会显示已安装,没有重新安装这种选项。可我们想在不卸载原有版本且保留数据的情况下覆盖安装Play Store上的版本,该怎么办呢?
下文以微信为例。
方案第一种方法很简单,比如我现在装了国内应用商店上的微信,版本为7.0.14,那我可以等着Play Store上架7.0.15版本的微信后直接升级,自然就替换成了Play Store版本的微信。
第二种方法,拒绝等待。我们可以将Play Store上的微信下载下来,手动安装。但是,Play Store是没有提供Apk官方下载途径的 ...
用Gradle脚本管理Manifest文件
编译时区分不同的manifest很多Android项目都会区分debug和release的manifest文件,以便调试,一些组件化的项目甚至有多个manifest文件来调试不同的组件。举个简单的例子,在app的build.gradle文件中:
1234567891011121314android { defaultConfig { applicationId "com.xxx.xxx" } sourceSets { main { if(是否为debug打包) { manifest.srcFile "${projectDir}/src/main/debug/AndroidManifest.xml" } else { manifest.srcFile "${projectDir ...