AOSP 预置APP安装 以MicroG GmsCore.apk安装为例

2023-11-18


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”
但是这样之后,会报错。
主要是三个错误:

  1. 运行patch之后,会自动在同级目录下备份原文件,以.orig结尾,在/core/res下的这些文件会引起错误,可以把他们移动到其他文件夹下
  2. 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;
  1. 补丁中打开签名欺骗需要授予权限,但是直接修改后,重新编译会报错,不过报错中已经说明,直接运行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 文件夹中。
主要流程参考:https://www.cnblogs.com/WuXiaolong/p/11354386.htmlhttps://juejin.cn/post/6844903844044881934。感谢大佬。
首先,需要在/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就已经可以了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AOSP 预置APP安装 以MicroG GmsCore.apk安装为例 的相关文章

  • getItem 与 getItemAtPosition

    有两种方法可以获取列表视图中的选定项目 list getAdapter getItem position list getItemAtPosition position 我的问题是 哪一种是首选的做法 我见过人们同时使用这两种方法 您可以使
  • 检测到设备正在振动?

    我使用下面的代码来振动设备 public void vibrator try Vibrator vibrator Vibrator getSystemService Context VIBRATOR SERVICE vibrator vib
  • 共同的偏好不断消失

    我正在使用共享首选项来存储我的应用程序的登录凭据 除了一个用户之外 一切正常 一段时间后 共享偏好似乎会以某种方式重置或清除 我已针对该用户调整了我的应用程序 使其不再清除他的共享偏好设置 这样我就可以确定这不是我的应用程序的错 但即使在这
  • Delphi XE7 Android 全屏(隐藏软键)

    如何在XE7中全屏显示 隐藏顶部 标题 和底部 软键 工具栏 在 XE6 中 我可以通过在应用程序部分写入来调整 AndroidManifest 以使我的应用程序全屏显示并且没有操作栏 android theme android style
  • 在 Google Analytics 中跟踪应用程序版本

    我正在使用谷歌分析模块 https marketplace appcelerator com apps 5081 2014113336 https marketplace appcelerator com apps 5081 2014113
  • 在 Android 中使用 DataOutputStream 在 POST 正文中发送特殊字符 (ë ä ï)

    我目前正在开发一个具有大量服务器端通信的 Android 应用程序 昨天 我收到一份错误报告 称用户无法发送 简单 特殊字符 例如 我搜索过但没有找到任何有用的东西 可能重复 没有答案 https stackoverflow com que
  • 如何查找 Android 设备中的所有文件并将它们放入列表中?

    我正在寻求帮助来列出 Android 外部存储设备中的所有文件 我想查找所有文件夹 包括主文件夹的子文件夹 有办法吗 我已经做了一个基本的工作 但我仍然没有得到想要的结果 这不起作用 这是我的代码 File files array file
  • 如何在 sqlite 中将 2 列合并为新列

    我有一个包含 3 列的表 我必须将 2 列中的值按降序排列到一列中 A B C z 1 2 f 5 7 s 9 5 使用此示例 输出会将 B 列和 C 列中的值放入其中 如下所示 A B s 9 f 7 f 5 s 5 z 2 z 1 我当
  • minHeight 有什么作用吗?

    在附图中 我希望按钮列与图像的高度相匹配 但我也希望按钮列有一个最小高度 它正确匹配图像的高度 但不遵守 minHeight 并且会使按钮向下滑动 我正在为按钮列设置这些属性
  • Flutter 深度链接

    据Flutter官方介绍深层链接页面 https flutter dev docs development ui navigation deep linking 我们不需要任何插件或本机 Android iOS 代码来处理深层链接 但它并没
  • Android Webview 图像未加载

    我制作了一个简单的应用程序WebView 但有些图片无法加载 正确 在我的电脑上 错误 在模拟器中 Correct 错误 没有横幅 于是我用Chrome debug进行调试 发现我的代码被改变了 我不添加像noscript or style
  • 材质设计图标颜色

    应该是哪种颜色 暗 材质图标 在官方文档上 https www google com design spec style icons html icons system icons https www google com design s
  • Android 设备上的静默安装

    我已经接受了一段时间了 在 Android 上静默安装应用程序是不可能的 也就是说 让程序安装捆绑为 APK 的应用程序 而不提供标准操作系统安装提示并完成应用程序安装程序活动 但现在我已经拿到了 Appbrain 快速网络安装程序的副本
  • 将 JSON 参数从 java 发布到 sinatra 服务

    我有一个 Android 应用程序发布到我的 sinatra 服务 早些时候 我无法读取 sinatra 服务上的参数 但是 在我将内容类型设置为 x www form urlencoded 之后 我能够看到参数 但不完全是我想要的 我在
  • 当手机旋转(方向改变)时如何最好地重新创建标记/折线

    背景 开发一个使用 Android Google Map v2 的本机 Android 应用程序 使用android support v4 app FragmentActivity 在 Android v2 2 上运行 客观的 在更改手机方
  • Android - 将 ImageView 保存到具有全分辨率图像的文件

    我将图像放入 ImageView 中 并实现了多点触控来调整 ImageView 中的图像大小和移动图像 现在我需要将调整大小的图像保存到图像文件中 我已经尝试过 getDrawingCache 但该图像具有 ImageView 的大小 我
  • Android 如何聚焦当前位置

    您好 我有一个 Android 应用程序 可以在谷歌地图上找到您的位置 但是当我启动该应用程序时 它从非洲开始 而不是在我当前的城市 国家 位置等 我已经在developer android com上检查了信息与位置问题有关 但问题仍然存在
  • 用于推送通知的设备令牌

    我正在实施推送通知服务 我需要创建一个数据库来存储 4 个移动平台的所有设备令牌 我想根据他们的平台 iOS Android BlackBerry WP7 来组织它们 但是有什么方法可以区分平台 这样如果我只想向 Android 用户发送消
  • 如何将图像从 Android 应用程序上传到网络服务器的特定文件夹中

    如何将图像从 android 移动到 Web 服务器上的指定文件夹 这是我的安卓代码 package com example bitmaptest import java io ByteArrayOutputStream import ja
  • 找到 Android 浏览器中使用的 webkit 版本?

    有没有办法知道某些特定手机上的 Android 浏览器使用的是哪个版本的 webkit 软件 如果有一个您可以浏览以获取该信息的 URL 那就太好了 但任何其他方式也很好 如果你知道 webkit 版本 你就知道 html5 支持多少 至少

随机推荐

  • 38个MySQL数据库的小技巧

    1 如何快速掌握MySQL 培养兴趣 兴趣是最好的老师 不论学习什么知识 兴趣都可以极大地提高学习效率 当然学习MySQL 5 6也不例外 夯实基础 计算机领域的技术非常强调基础 刚开始学习可能还认识不到这一点 随着技术应用的深 入 只有有
  • java之MySQL数据库

    MySQL数据库 1 什么是数据库 答 数据库是以一定方式存储在一起 能予多个用户共享 具有尽可能小的冗余度 与应用程序彼此独立的数据集合 2 数据库的分类 具体含义 常见的数据库 答 关系型数据库和非关系型数据库 关系数据库 是建立在关系
  • springCloud - 第10篇 - 服务间调用追踪 (zipkin 的使用)

    前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到教程 一 在微服务系统中 不同应用服务可能会有各种不同的相互调用 springcloud 集成了 zipkin 来实现对于不同服务调用的追踪和统计
  • LIBSVM 使用

    预备 NTU TW Chih Chung Chang and Chih Jen Lin LIBSVM LIBSVM Data Classification Regression and Multi label 正文 a 编译libsvm u
  • 【机器学习】决策树 No.3

    1 决策树之信息论基础 决策树思想来源非常朴素 程序设计中的条件分支结构 if else 最早的决策树就是利用这类结构分割数据的一种分类学习方法 例 银行贷款例子 使用决策树划分是否贷款 此处特征为两个 房子 工作 香农 信息论创始人 19
  • 一文带你了解ES6迭代器(iterator)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 迭代器 iterator 是什么 二 工作原理 总结 一 迭代器 iterator 是什么 迭代器 iterator 是一种接口 为各种不同的数据结构提供统一的
  • SkipList(跳表)

    跳表简介 跳表是基于有序链表实现的搜索结构 是一种动态的搜索结构 即支持动态插入和删除操作 且跳表查找和删除的平均时间复杂度是Olog n 因此跳表是一种时间复杂度相对较小的搜索结构 我们知道对一个数据集合的查找 最差的时间复杂度是O n
  • Switch / Xbox / PS / PSV / PSP 游戏指南

    1 Switch Xbox PS PSV PSP 对比分析 table 1 PSV2000 1000 比较分析 PSV2000 相对 PSV1000 具体变更点 薄了20 轻了15 屏幕改为液晶屏 PS键 开始键和选择键变成球形更方便按 内
  • 2,一个人体姿态识别的项目实现

    学习opencv的例子 1 认识 2 start 直接干货 例子1 例子2 例子3 例子4 例子5 固定阈值 自适应阈值 文档说明 参考链接 http codec wang opencv start 02 basic element ima
  • git仓库创建及上传

    如何创建一个git仓库并上传代码 1 在此之前我们需要安装git和注册gitee账号 1 打开git官网下载安装程序 然后按照指令进行安装即可 2 搜索gitee进行注册和绑定邮箱即可 上传代码时需要登录gitee账号 安装成功之后告诉本地
  • Android apk 反编译解析

    学习android开发 有必要对android的反编译有所了解 当然学习android反编译并不是为了破解别人的软件 完全是一种学习的方法 了解别人写程序的思想是一件很有趣的事情 工具下载地址 http code google com p
  • androidstudio开发!花三分钟看完这篇文章你就懂了!技术详细介绍

    阿里面试 自我介绍 首先要介绍自己的项目经验和个人的擅长点 因为面试官主要考察你的表达能力和语言精简能力 简历的编写其实这里可能需要注意几点 1 标题的直接按照姓名 几年工作经验 应聘岗位格式来填写 例如 黄铭 四年工作经验 Android
  • STP与RSTP区别

    STP 不能快速迁移 即使是在点对点链路或边缘端口 边缘端口指的是该端口直接与用户终端相连 而没有连接到其它设备或共享网段上 也必须等待2 倍的ForwardDelay 的时间延迟 端口才能迁移到转发状态 RSTP Rapid Spanni
  • Python 异步: 异步上下文管理器(17)

    动动发财的小手 点个赞吧 上下文管理器是一种 Python 构造 它提供了一个类似 try finally 的环境 具有一致的接口和方便的语法 例如通过 with 表达 它通常与资源一起使用 确保在我们完成资源后始终关闭或释放资源 无论资源
  • VC++ OpenCV+ZBar二维码识别

    利用OpenCV处理图像的优势 结合ZBar提高二维码识别结果 接口定义 include
  • SpringSecurity配置类--常用配置

    SpringSecurity配置类 在学习这门课的时候 实现各种功能时进行了各种配置 我想将各种配置综合讲述一下 首先自定义配置类 需要继承WebSecurityConfigurerAdapter这个类 在这个类里面做了一些默认配置 Con
  • linux grpc,grpc linux下的编译使用-Go语言中文社区

    1 一些工具安装 apt get install build essential autoconf libtool pkg config apt get install libgflags dev libgtest dev apt get
  • [转]IDEA 撤销 merge 操作(详解)

    目录 一 前言 二 解决方案 通过 Git Bash 命令行解决 1 合并过程中未发生冲突 2 合并过程中发生冲突 三 解决方案 通过 IDEA 解决 附带详细的操作图 1 合并过程中未发生冲突 2 合并过程中发生冲突 四 最后 作为一个开
  • 自己制作的 macOS Mojave 10.15.3 iso 文件,亲测可用(附 VMware15 安装 macOS Catalina 图文教程与 macO Catalina.iso 镜像下载地址)

    注 如果需要分享此资源 请注明原作者 不要把别人的东西当做自己的成果 也不要把别人免费分享出来的东西以有偿的方式去分享 自己制作的 macOS Mojave 10 15 3 iso 文件 亲测可用 已在 VMware 15 5 Player
  • AOSP 预置APP安装 以MicroG GmsCore.apk安装为例

    AOSP 预置APP 以MicroG为例 MicroG 无root安装教程 通过源码修改打开签名欺骗 预置不带源码的APP 其他 AOSP 安装谷歌三件套失败 开始寻找代替方案 尝试使用MicroG项目代替谷歌服务 目前情况 已成功安装 所