Android系统开发:GMS包移植

首先,我们拿到一份完整的GMS包应该是如下图所示:

Gmesh软件 gms软件包_xml

简单介绍每一个目录的作用

1)apps以及apps_go : 这里面就是google释放的apk资源文件,其中go版本适配低内存设备的apk.
2)etc: 这里面就是Google 的一些权限申明文件,在日常维护gms更新时,经常会出现应用包权限的改动,我们跟着改,并做好记录即可。
3)frameworks:这里面一般就是一些jar包,目的是将必须的jar包编译到system系统中,可以让一些apk正常使用,日常维护中不需要改动。
4)overlay:这里面是一些软件的overlay包 , 可以指定编译这些overlay软件替换原生软件。
5)product:这里面是编译脚本和一些overlay的配置文件。其中十分重要的是gms_overlay文件夹 以及gms_go.mk,gms.mk文件

GMS的编译脚本

GMS包一般通过gms.mk或者gms_go.mk编译到系统中的。这两者的区分与之前apps/apps_go文件夹相似,一般来说go版本软件会走gms_go.mk文件编译(现在也有gms_go_2gb.mk 也就是2G内存的Go设备会走该mk文件编译)。非Go版本自然走gms.mk文件
下面我们来看一下gms.mk的内容(gms_go.mk同理):

###############################################################################
# GMS home folder location
# Note: we cannot use $(my-dir) in this makefile
ANDROID_PARTNER_GMS_HOME := vendor/partner_gms          ##这里指定了我们GMS包在源码根目录的位置,下文中会用到该路径

# GMS mandatory core packages   
PRODUCT_PACKAGES := \      ##备注GMS mandatory core packages这个是指gms强制安装包,不装的话会导致过不了gms,我们不应该对其有什么修改
    AndroidAutoStub \      ##PRODUCT_PACKAGES就是gms包中常用的编译变量名。 
    AndroidPlatformServices \
    ConfigUpdater \
    GoogleExtShared \
    GoogleFeedback \
    GoogleLocationHistory \
    GoogleOneTimeInitializer \
    GooglePackageInstaller \
    GooglePartnerSetup \
    GooglePrintRecommendationService \
    GoogleRestore \
    GoogleServicesFramework \
    GoogleCalendarSyncAdapter \
    GoogleContactsSyncAdapter \
    GoogleTTS \
    GmsCore \
    Phonesky \
    SetupWizard \
    WebViewGoogle \
    Wellbeing
# GMS mandatory libraries               ##这个jar包就是上文frameworks里面的jar包,就是在这里编译到系统中的
PRODUCT_PACKAGES += com.google.android.maps.jar
# GMS common RRO packages              ##这个GmsConfigOverlay就是上文中Overlay包中的文件,在这里被编译进系统
PRODUCT_PACKAGES += GmsConfigOverlay
# GMS common configuration files
PRODUCT_PACKAGES += \                  ##这些配置文件以及权限文件一般都是在etc中的,在这里被编译进系统
    default_permissions_whitelist_google \
    privapp_permissions_google_system \
    privapp_permissions_google \
    split_permissions_google \
    preferred_apps_google \
    sysconfig_google \
    sysconfig_wellbeing \
    google_hiddenapi_package_whitelist
# Overlay for GMS devices: default backup transport in SettingsProvider    
PRODUCT_PACKAGE_OVERLAYS += $(ANDROID_PARTNER_GMS_HOME)/products/gms_overlay   
# Overlay for GoogleDialer               ##可以看到overlay编译文件我们使用PRODUCT_PACKAGE_OVERLAYS编译,gms_overlay文件下文会讲
PRODUCT_PACKAGE_OVERLAYS += $(ANDROID_PARTNER_GMS_HOME)/apps/GoogleDialer/overlay
# GMS mandatory application packages    ##有这个备注的都是必装应用,请勿删改,要不然过不了gms测试
PRODUCT_PACKAGES += \
    Chrome \
    Drive \
    Gmail2 \
    Duo \
    Maps \
    YTMusic \
    Photos \
    Velvet \
    Videos \
    YouTube
# GMS comms suite               ##这个备注虽然不是强制,但是现在非Go版Dialer以及messages的改动还是会过不了gms测试,所以也不太好修改。
PRODUCT_PACKAGES += \
    CarrierServices \
    GoogleContacts \
    GoogleDialer \
    Messages
# GMS optional application packages  ##这个备注表示是可选项,可要可不要,根据项目需求
PRODUCT_PACKAGES += \
    CalendarGoogle \
    DeskClockGoogle \
    LatinImeGoogle \
    TagGoogle \
    talkback \
    Keep \
    CalculatorGoogle
# GMS sample application packages   ##这里两个包比较重要,是桌面界面,可以根据你的需要进行修改
PRODUCT_PACKAGES += \
    GmsSampleIntegration \
    SearchLauncherQRef
PRODUCT_PRODUCT_PROPERTIES += \
    ro.setupwizard.rotation_locked=true \   ##这些系统变量是控制开机向导的
    setupwizard.theme=glif_v3_light \
    ro.opa.eligible_device=true \
    ro.com.google.gmsversion=10_202003  ##这个变量是你gms的版本,在更新中必定是要跟着修改的

gms_overlay文件

在上面的gms.mk文件中,这个文件单独被拎出来使用PRODUCT_PACKAGE_OVERLAYS编译, 这其实是一个很重要的文件。

Path:/product/gms_overlay

Gmesh软件 gms软件包_android_02


其实目录就两个frameworks和packages, 这个文件的作用就是通过修改这里面的文件 覆盖 系统原生的配置

下面我们以桌面(4x4布局)为例:

原生桌面配置文件Path:packages/apps/Launcher3/res/xml/default_workspace_4x4.xml

那么我们在gms文件路径下复制该文件路径:product/gms_overlay/packages/apps/Launcher3/res/xml/default_workspace_4x4.xml

并对该文件做出自己想要的修改:

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2013 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->
<favorites xmlns:launcher="http://schemas.android.com/apk/res-auto/com.android.launcher3">
  <!-- Hotseat (We use the screen as the position of the item in the hotseat) -->
  <!-- Dialer Messaging [All Apps] Contacts Camera -->
  <favorite container="-101" screen="0" x="0" y="0" packageName="com.google.android.dialer" className="com.android.dialer.DialtactsActivity"/>
  <favorite container="-101" screen="1" x="1" y="0" packageName="com.google.android.apps.messaging" className="com.google.android.apps.messaging.ui.ConversationListActivity"/>
  <favorite container="-101" screen="2" x="2" y="0" packageName="com.android.chrome" className="com.google.android.apps.chrome.Main"/>
  <favorite container="-101" screen="3" x="3" y="0" packageName="com.mediatek.camera" className="com.mediatek.camera.CameraActivity"/>
  <!-- In Launcher3, workspaces extend infinitely to the right, incrementing from zero -->
  <!-- Google folder -->
  <!-- Google, Chrome, Gmail, Maps, YouTube, (Drive), (Music), (Movies), Hangouts, Photos -->
  <folder title="@string/google_folder_title" screen="0" x="0" y="3">
    <favorite packageName="com.google.android.googlequicksearchbox" className="com.google.android.googlequicksearchbox.SearchActivity"/>
    <favorite packageName="com.google.android.gm" className="com.google.android.gm.ConversationListActivityGmail"/>
    <favorite packageName="com.google.android.apps.maps" className="com.google.android.maps.MapsActivity"/>
    <favorite packageName="com.google.android.youtube" className="com.google.android.youtube.app.honeycomb.Shell$HomeActivity"/>
    <favorite packageName="com.google.android.apps.docs" className="com.google.android.apps.docs.app.NewMainProxyActivity"/>
    <favorite packageName="com.google.android.apps.youtube.music" className="com.google.android.apps.youtube.music.activities.MusicActivity"/>
    <favorite packageName="com.google.android.videos" className="com.google.android.youtube.videos.EntryPoint"/>
    <favorite packageName="com.google.android.apps.photos" className="com.google.android.apps.photos.home.HomeActivity"/>
  </folder>
  <favorite screen="0" x="1" y="3" packageName="com.google.android.apps.tachyon" className="com.google.android.apps.tachyon.MainActivity"/>
  <favorite screen="0" x="3" y="3" packageName="com.android.vending" className="com.android.vending.AssetBrowserActivity"/>
</favorites>

这样子 ,编译出来的桌面效果 就是我们这个配置文件的了, 覆盖了原生的配置文件效果。其他方面的覆盖原理也相同,都可以自己去尝试一下。