修复 Android ROM 的 Google 网络定位

一些定制、第三方 ROM 在安装了 Google 框架后,仍然无法使用其网络定位功能。我在网上搜索了许多资料,整理如下。

本文假设你的设备已经 Root,并已经安装了 Google 框架。我测试用的 ROM 为一加氢 OS。

一、准备工具

需要准备的工具有 zip、unzip、apktool、adb、zipalign,以及一个好使的文本编辑器。

(注意 zipalign 工具可能不在 $PATH 中,如 Arch AUR 包 android-sdk-build-tools 安装后会放在 /opt/android-sdk/build-tools/$pkgver/zipalign)

二、提取需要的资源

取出 ROM 中的 framework-res.apk,并反编译得到需要修改的文件:

三、修改文件

修改位置提供商相关设置,使用 Google 提供网络定位。

1、修改 framework-res/res/values/arrays.xml,找到 config_locationProviderPackageNames 的位置,确保 Google 在列表中。如我的 ROM 默认只有 com.android.location.fused 和 com.amap.android.location 两项,这时应当加入 com.google.android.gms,使得最终结果类似这样:

Continue reading 修复 Android ROM 的 Google 网络定位

不双清给一加氢 OS 刷上 Google Apps

最近入爪一台一加 3,解锁刷 root 后几乎配置完了所有东西,然后才发现忘记了 gapps。网上看到许多人在这种情况下刷 gapps 遇到了各种各样的问题,一般都被建议双清解决。我查找了一些资料后,决定试试不双清自己修复权限问题。

安装 OpenGApps

这里的假设是已经刷过第三方 Recovery,我这里是 TWRP。从 OpenGApps 网站下载对应的包(我这里对应的是 ARM64、6.0),我选择了 nano 包。

重启进入 Recovery 刷入此包。然后不要急着重启,因为大量网友反应此时重启后会不断 fc。我在一加论坛找到了这样的方法,经实测有效(针对 TWRP,其他 Recovery 请自行调整):此时应回到 Recovery 首页,进入 Mount 页面勾上 System,然后回到首页依次选择 Advanced -> File Manager -> system -> priv-app -> SetupWizard,然后点击右下的选择气泡,最后点击 Delete 删除这个文件夹。

重启正常进入系统后,点击 Google Play 或直接添加 Google 帐号即可。

遇到的问题

一、Google Play 无法正常下载应用

Google Play 下载或更新任何应用时,提示 DF-DLA-15 错误。我找到的方法是进入应用管理清空 Google Play 及 Google Play Services 的数据后重试。

二、Google 联系人同步选项消失

帐户管理中的 Google 帐号内只剩下健身、人脉、应用数据,联系人同步不见踪影。Reddit 上有人指出授权 sync adapter 读写联系人即可,但 H2OS 的应用管理界面中似乎没有办法直接操作,因此我用 adb 手动进行了授权:

执行后,重启手机即可,不需要如原文所说删除、重新添加 Google 帐号。

更新:此方法在三星 Galaxy Note 7 原生系统上也测试成功,理论上还可以推广到更多系统。有遇到 Google Play Services 不断崩溃退出的问题,另 grant 了如下权限解决:

Pacman Hooks 简介

Pacman 5.0 带来了 Hooks 支持,但在大规模应用前,我们留出了一个多月的时间来让用户先升级到 Pacman 5.0(因为同时升级 pacman 和有定义 hooks 的包会导致无法正常执行这些 hooks)。现在距离 Hooks 正式投入使用已经过去了一个月,我觉得是时候介绍一下 Hooks 和如何使用它了。

先来看一个简单的 Hook:

这个 Hook 的作用是:当检测到安装或更新的包文件中存在 usr/lib/tmpfiles.d/*.conf 时,在更新后对每个文件调用 systemd-tmpfiles --create 方法。前面的检测部分定义在 [Trigger] 部分,后面执行的操作定义在 [Action] 部分。下面我们分别了解一下这两部分。

一、[Trigger] 部分

首先需要了解的是可以用于触发的条件类别(Type)。上面的例子里使用了文件(File),即当操作中的包中存在对应文件时触发。另一个可选的 Type 是软件包名(Package),即直接匹配操作中的包名。

接下来,操作(Operation)选项限制了对软件包的操作类别。可以选择的操作有安装(Install)、更新(Upgrade)和删除(Remove)。一个 Hook 需要在多种操作执行时,如例子中那样写成多行即可。常用的组合有三种全部写上(更新缓存、数据库等)、写 Install+Upgrade(执行安装时的一次性操作)及与之对应的 Upgrade+Remove(卸载时的一次性操作)。

最后,我们需要定义具体的目标(Target)。如果目标是文件,这里需要写其相对根目录的完整路径,但需要去掉开头的 / 字符。通配符(*、?)可以使用,具体匹配时会使用 fnmatch 方法。同样的,在一个 Hook 中可以定义多个目标,类似例子中的 Operation 那样写成多行即可。
Continue reading Pacman Hooks 简介