全平臺安卓源碼預置GMS方法 / 全平臺安卓源碼預置谷歌服務方法

1. 下載GMS刷機包

在https://opengapps.org/根據API,platform,variant下載合適的gms包,這裏推薦pice size,可以最精簡地保證基礎谷歌服務功能

 

2.提取文件


解壓GMS包

Core和Optional目錄下爲谷歌服務核心文件和應用,需要預置到源碼中

GApps目錄下爲一些功能應用,可不預置到源碼中

繼續解壓Core和Optional兩個目錄下的所有文件,得到一些APK,權限Config和jar包等

 

3. 預置

 

  • 稍作整理

  • 對於非APK文件:

使用宏PRODUCT_COPY_FILES,在源碼編譯時將非APK文件拷貝到/system/下,在device.mk里加上

PRODUCT_COPY_FILES += $(call find-copy-subdir-files,*,$(LOCAL_PATH)/gms/copyToSystem,/system)

 

  • 對於APK文件:

增加Android.mk預置到/system/app或/system/priv-app,開啓預編譯減少第一次開機時間

PS: 注意LOCAL_CERTIFICATE := PRESIGNED 保證使用APK本身的簽名信息,否則無法正常使用

#預置到/system/app下

include $(CLEAR_VARS)

LOCAL_MODULE := GoogleContactsSyncAdapter

LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := app/$(LOCAL_MODULE)/$(LOCAL_MODULE).apk

LOCAL_MODULE_CLASS := APPS

LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

LOCAL_CERTIFICATE := PRESIGNED

LOCAL_DEX_PREOPT := true

include $(BUILD_PREBUILT) 
#預置到/system/priv-app下

include $(CLEAR_VARS)

LOCAL_MODULE := ConfigUpdater

LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := priv-app/$(LOCAL_MODULE)/$(LOCAL_MODULE).apk

LOCAL_MODULE_CLASS := APPS

LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

LOCAL_CERTIFICATE := PRESIGNED

LOCAL_DEX_PREOPT := true

LOCAL_PRIVILEGED_MODULE := true

include $(BUILD_PREBUILT)

 

  • 在device.mk文件中開啓APK模塊編譯
PRODUCT_PACKAGES += GoogleContactsSyncAdapter

PRODUCT_PACKAGES += GoogleExtShared

PRODUCT_PACKAGES += SoundPickerPrebuilt

PRODUCT_PACKAGES += AndroidPlatformServices

PRODUCT_PACKAGES += CarrierSetup

PRODUCT_PACKAGES += ConfigUpdater

PRODUCT_PACKAGES += GmsCoreSetupPrebuilt

PRODUCT_PACKAGES += GoogleBackupTransport

PRODUCT_PACKAGES += GoogleExtServices

PRODUCT_PACKAGES += GoogleFeedback

PRODUCT_PACKAGES += GoogleOneTimeInitializer

PRODUCT_PACKAGES += GooglePartnerSetup

PRODUCT_PACKAGES += GoogleServicesFramework

PRODUCT_PACKAGES += Phonesky 

PRODUCT_PACKAGES += PrebuiltGmsCorePi
  • PS: 也可以通過拷貝的方式預置到系統中,不過第一次開機要做DEX2OAT,影響開機時間,不推薦

如果拷貝預置,需要在vendor/mediatek/proprietary/frameworks/base/data/etc/pms_sysapp_removable_system_list.txt中添加需要預製APK的package name 

 

4. 增加System分區大小


if(如果全編系統成功) goto 5

else if error == out of space? the tree size of

{

  • 因爲谷歌服務會增加200M左右System分區大小,極有可能造成分區空間不足的問題不能打包system.img, 需要增加System分區大小
  • 檢查System分區大小 :vim out/target/product/ac8257_demo_1g_32/obj/PTGEN/partition_size.mk 
  • 找到 BOARD_SYSTEMIMAGE_PARTITION_SIZE:=1434451968
  • 1434451968 / 1024 = 1400832, 在 源碼/device/ 目錄下 grep -nr "1400832" 得到 Screenshot-6.png (如果沒找到可以grep 1434451968 或 1434451968/1024 或 1434451968/1024/1024 找出定義大小的位置)
  • 增加 autochips/common/BoardConfig.mk 下 BOARD_MTK_GMO_SYSTEM_SIZE_KB 的大小
  • 全編系統

}

else 聯繫qq: 373683458

 

5. 通過谷歌設備驗證

 

  • 不能修改 build/core/MakeFile 中 的BUILD_FINGERPRINT生成方式,BUILD_FINGERPRINT的拼接格式影響CTS認證和GMS ANDROID ID的生成,可能導致谷歌設備認證不通過
  • 掛上代理,進入Play商店,等待出現設備未驗證的提示,此時纔會生成一個GMS ANDROID ID
  • adb root ; adb shell 'sqlite3 /data/data/com.google.android.gsf/databases/gservices.db "select * from main where name = \"android_id\";"'    
  • 在 https://www.google.com/android/uncertified/中填入 GMS ANDROID ID 即可

 

Recovery中刷入GMS包時做了什麼


翻下install.sh 

for gapp_name in $core_gapps_list; do

  get_apparchives "Core/$gapp_name"

  for archive in $apparchives; do

    case $gapp_name in

      setupwizarddefault) if [ "$device_type" != "tablet" ]; then extract_app "$archive"; fi;;

      setupwizardtablet)  if [ "$device_type"  = "tablet" ]; then extract_app "$archive"; fi;;

      googlepixelconfig) if [ "$googlepixel_compat" = "true" ]; then extract_app "$archive"; fi;;

      backuprestore) if [ "$googlepixel_compat" = "false" ]; then extract_app "$archive"; fi;;

      datatransfertool) if [ "$googlepixel_compat" = "true" ]; then extract_app "$archive"; fi;;

      *)  extract_app "$archive";;

    esac

  done

done

 

  • 看下extract_app做了什麼

extract_app() {

  tarpath="$TMP/$1.tar" # NB no suffix specified here

  if "$TMP/unzip-$BINARCH" -o "$OPENGAZIP" "$1.tar*" -d "$TMP"; then # wildcard for suffix

    app_name="$(basename "$1")"

    which_dpi "$app_name"

    echo "Found $1 DPI path: $dpiapkpath"

    folder_extract "$tarpath" "$dpiapkpath" "$app_name/common"

  else

    echo "Failed to extract $1.tar* from $OPENGAZIP"

  fi

}
  • 繼續看 folder_extract 做了什麼

folder_extract() {

  archive="$1"

  shift

  if [ -e "$archive.xz" ]; then

    for f in "$@"; do

      if [ "$f" != "unknown" ]; then

        "$TMP/xzdec-$BINARCH" "$archive.xz" | "$TMP/tar-$BINARCH" -x -C "$TMP" -f - "$f" && install_extracted "$f"

      fi

    done

}
  • 繼續看install_extracted做了什麼

install_extracted() {

  file_list="$(find "$TMP/$1/" -mindepth 1 -type f | cut -d/ -f5-)"

  dir_list="$(find "$TMP/$1/" -mindepth 1 -type d | cut -d/ -f5-)"

  for file in $file_list; do

      install -D "$TMP/$1/${file}" "/system/${file}"

.....

}

 

注意 install -D "$TMP/$1/${file}" "/system/${file}"

結論:gms包主要是把文件解壓到/system/目錄下,在源碼中通過一些編譯項可以達到類似效果


gapps所有組件中文明細


https://tieba.baidu.com/p/5032829149?fid=12980469&pid=105404260767&red_tag=1621002966#105404260767

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章