AOSP 预置APP 以MicroG为例
- MicroG 无root安装教程
- 通过源码修改打开签名欺骗
- 预置不带源码的APP
- 其他
AOSP 安装谷歌三件套失败,开始寻找代替方案,尝试使用MicroG项目代替谷歌服务。
目前情况:已成功安装,所有需要配置全不勾选,但是仍有大量需要地图服务的App失败了,不过其他类型需要谷歌服务的基本都成功了。也不清楚是不是我的安装流程其实是有问题的。
MicroG 无root安装教程
MicroG是一个谷歌服务的替代品,可以在不安装谷歌服务的情况下使用需要谷歌服务的软件。
下载链接:https://github.com/microg/GmsCore/wiki/Downloads 它有多种方式安装,其必要条件是开启签名欺骗,有些ROM自带签名欺骗,有些安装Xpose,可以使用Xpose安装,我因为手机不具备签名欺骗,没有root,也没装Xpose,所以这里采用了最后一种源码修改的方式开启签名欺骗。
此外,在安装说明页面有这样的注释:
Note: On Android 7 (or later) an additional patch is needed to make location work, or alternatively:
You can install GmsCore.apk in the /system/priv-app folder. This can be done by using adb push.
由于我们没有root权限,只能使用修改源码的方式将GmsCore.apk放入/system/priv-app 文件夹中,这也是我写下这篇文章的原因,做一个记录。
通过源码修改打开签名欺骗
MicroG项目提供了通过AOSP修改权限的补丁,https://github.com/microg/GmsCore/wiki/Signature-Spoofing 只需要按照说明操作即可,下载对应安卓版本的补丁,我的安卓版本是12,对应字母是S,然后在frameworks/base目录并运行patch -p1 -i “path/to/where/you/saved/the/patch”
但是这样之后,会报错。
主要是三个错误:
- 运行patch之后,会自动在同级目录下备份原文件,以.orig结尾,在/core/res下的这些文件会引起错误,可以把他们移动到其他文件夹下
- patch文件报错,在我S版本的补丁中运行后会报错,错误部分会保存在.rej文件中,打开文件可以查看到错在哪里,以下就是.rej文件中的内容,我是通过打开
services/core/java/com/android/server/pm/PackageManagerService.java
文件,搜索关键词找到了这个函数,然后进行了手动修改。
--- services/core/java/com/android/server/pm/PackageManagerService.java
+++ services/core/java/com/android/server/pm/PackageManagerService.java
@@ -3380,13 +3407,17 @@ public class PackageManagerService extends IPackageManager.Stub
final int[] gids = (flags & PackageManager.GET_GIDS) == 0 ? EMPTY_INT_ARRAY
: mPermissionManager.getGidsForUid(UserHandle.getUid(userId, ps.appId));
// Compute granted permissions only if package has requested permissions
- final Set<String> permissions = ((flags & PackageManager.GET_PERMISSIONS) == 0
- || ArrayUtils.isEmpty(p.getRequestedPermissions())) ? Collections.emptySet()
- : mPermissionManager.getGrantedPermissions(ps.name, userId);
+ boolean computePermissions = !ArrayUtils.isEmpty(p.getRequestedPermissions()) &&
+ ((flags & PackageManager.GET_PERMISSIONS) != 0 || getRequestedFakeSignature(p) != null);
+ final Set<String> permissions = computePermissions ?
+ mPermissionManager.getGrantedPermissions(ps.name, userId)
+ : Collections.emptySet();
PackageInfo packageInfo = PackageInfoUtils.generate(p, gids, flags,
ps.firstInstallTime, ps.lastUpdateTime, permissions, state, userId, ps);
+ packageInfo = applyFakeSignature(p, packageInfo, permissions);
+
if (packageInfo == null) {
return null;
- 补丁中打开签名欺骗需要授予权限,但是直接修改后,重新编译会报错,不过报错中已经说明,直接运行
m api-stubs-docs-non-updatable-update-current-api
更新一下
exit
38 ) # hash of input list: 029245c8d5b1fb42417b35080e5be16671c76fca0c74c985b4a579247f7b7b1e
--- frameworks/base/core/api/current.txt 2023-04-13 20:08:15.061038569 +0800
+++ out/soong/.intermediates/frameworks/base/api-stubs-docs-non-updatable/android_common/metalava/api-stubs-docs-non-updatable_api.txt 2023-04-13 21:03:34.363465
566 +0800
@@ -82,9 +82,9 @@ public static final class Manifest.permi
field public static final String DIAGNOSTIC = "android.permission.DIAGNOSTIC";
field public static final String DISABLE_KEYGUARD = "android.permission.DISABLE_KEYGUARD";
field public static final String DUMP = "android.permission.DUMP";
- field public static final String FAKE_PACKAGE_SIGNATURE = "android.permission.FAKE_PACKAGE_SIGNATURE";field public static final String FACTORY_TEST = "android.permission.FACTORY_TEST"; [3/2158]
+ field public static final String FAKE_PACKAGE_SIGNATURE = "android.permission.FAKE_PACKAGE_SIGNATURE";
field public static final String FOREGROUND_SERVICE = "android.permission.FOREGROUND_SERVICE";
field public static final String GET_ACCOUNTS = "android.permission.GET_ACCOUNTS";
field public static final String GET_ACCOUNTS_PRIVILEGED = "android.permission.GET_ACCOUNTS_PRIVILEGED";
-e
******************************
You have tried to change the API from what has been previously approved.
To make these errors go away, you have two choices:
1. You can add '@hide' javadoc comments (and remove @SystemApi/@TestApi/etc)
to the new methods, etc. shown in the above diff.
2. You can update current.txt and/or removed.txt by executing the following command:
m api-stubs-docs-non-updatable-update-current-api
To submit the revised current.txt to the main Android repository,
you will need approval.
******************************
上述操作后,重新烧一下,刷入镜像,签名欺骗就打开了。
预置不带源码的APP
下面就是使用修改源码的方式将GmsCore.apk放入/system/priv-app 文件夹中。
首先,需要在/package/apps/ 文件夹下创建文件夹,同时放入apk。
在新创建的文件夹下创建Android.mk文件。
然后在Android.mk中填入对该模块的说明:
比较关键的是签名函数 LOCAL_CERTIFICATE := PRESIGNED 这里使用PRESIGNED 表示直接用第三方App原有的。
其次是 LOCAL_PRIVILEGED_MODULE := true 表示是系统权限的App,这样就可以放入/system/priv-app ,没有这个的话就是普通App 是在/system/app 中
其他参数的说明可以看大佬的链接。
0 LOCAL_PATH := $(call my-dir)
1
2 my_archs := arm arm64..
3 my_src_arch := $(call get-prebuilt-src-arch, $(my_archs))
4
5 include $(CLEAR_VARS)
6
7 LOCAL_MODULE_TAGS := optional
8
9 LOCAL_MODULE := MicroG
10
11 # 签名
12 LOCAL_CERTIFICATE := PRESIGNED
13
14 # 指定 src 目录.
15 LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
16
17 LOCAL_MODULE_CLASS := APPS
18
19 LOCAL_BUILT_MODULE_STEM := package.apk
20
21 LOCAL_PRIVILEGED_MODULE := true
22
23
24 include $(BUILD_PREBUILT)
这个写好之后,要在device.mk中添加 PRODUCT_PACKAGES += MicroG
这是告诉你的设备,你有这个App
device.mk 不同设备会在不同地方:
一般来说可以在 device文件夹下寻找,在这个目录下可以看到不同厂商和设备的子目录。要找到特定设备的device.mk文件,需要进入相应的子目录我是google设备的device.mk文件,就进入Google 文件夹。我的文件的所在地是下图:
然后构建一下模块,
source build/envsetup.sh
mmm packages/apps/MicroG
可以看到提示信息中的说明,device.mk修改了,正在重新生成
看到这种提示信息就说明成功了。
之后就进行
make snod
m -j35
提示:
make snod 是一个用于构建Android系统的命令,它会生成system.img(系统分区镜像)。在Android源码树的根目录下执行此命令,它将构建出一个包含Android操作系统的系统镜像。
要运行 make snod,请按照以下步骤操作:
打开终端。
使用 cd 命令导航到Android源码树的根目录。
确保已经执行了环境设置脚本。在Android源码树的根目录下运行以下命令:
bash
source build/envsetup.sh
为您的目标设备选择一个合适的构建配置。例如,如果您要为模拟器构建x86镜像,您可以执行:
lunch aosp_x86-eng
在这里,根据您的具体设备和需求选择相应的配置。
现在,运行 make snod 命令。构建过程可能需要一些时间,具体取决于您的硬件和构建配置:
make snod
完成构建后,您可以在 out/target/product/[设备名称]/ 目录下找到生成的system.img文件。请注意,设备名称应与您在 lunch 命令中选择的设备名称相匹配。
成功之后刷入文件,即可。
其他
F-Droid 是一个应用管理商店,里面是一些开源应用,MicroG会在上面发布,所以下载它可以方便获取更新。
最新MicroG已经集成了地理位置控制的UnifiledNlp,所以不需要额外下载这个,UnifiledNlp是一个提供集成管理的APK并不提供具体定位服务等等。
一些提供辅助定位功能的APK还是需要下载,并在MicroG中UnifiledNlp模块进行配置管理。
可以在F-Droid中下载,添加源 https://microg.org/fdroid/repo 然后搜索相关APK进行安装。但这些都是辅助定位功能,地图功能理论上安装完MicroG就已经可以了。