高效更新源码中的GMS包

前言

对于Android 原生系统定制来说,升级google GMS包是不可避免的日常工作。它不像cts软件版本那样,是google提供的GMS包应用。而一般的客户软件版本是必须需要去登录google playstore商店,然后下载最新GMS软件。并将下载好的软件从手机导出到电脑上,再将这些下载的软件一个个对比源码中的google应用版本,然后对比apk包名,最后将软件替换成最新的版本。

遇到的困难

  • 将下载的软件导出到电脑上需要 eng版本
  • 下载的apk名称全是base.apk,需要对应找到/vendor/google/apps下的软件文件。

解决办法

第一点因为user版本,adb没有权限将下载的文件导出到电脑上,所以可以考虑替换user版本的boot.img。
基于第二点困难,我是编写一个脚本能够自动将所需的升级文件apk,替换旧版本的apk。

脚本通过py编写,亲测可用,具体代码如下

# !/usr/bin/python
#coding=utf-8

# 自动替换 google apk文件
# 使用方法:
# linux环境:执行以下命令
# python replace.py
#
import os
import shutil
import sys
#手机中更新的google app包名 data/app
replace_dir = [
    'com.google.android.apps.plus-1',
    'com.google.android.apps.tachyon-1',
    'com.google.android.googlequicksearchbox-1',
    'com.google.android.youtube-1',
    'com.google.android.talk-1',
    'com.google.android.calendar-1',
    'com.google.android.apps.messaging-1',
    'com.google.android.apps.docs.editors.docs-1',
    'com.google.android.apps.photos-1',
    'com.google.android.apps.books-1',
    'com.google.android.gm-1',
    'com.google.android.apps.docs-1',
    'com.google.android.inputmethod.latin-1',
    'com.google.android.music-1',
    'com.google.android.tts-1',
    'com.android.chrome-1',
    'com.android.vending-1',
    'com.google.android.apps.maps-1',
    'com.google.android.videos-1',
    'com.google.android.gms-1',
    ]
#google/apps目录对应的apk dir
target_dir = [
    'PlusOne',
    'Duo',
    'Velvet',
    'YouTube',
    'Hangouts',
    'CalendarGoogle',
    'Messenger',
    'EditorsDocs',
    'Photos',
    'Books',
    'Gmail2',
    'Drive',
    'LatinImeGoogle',
    'Music2',
    'GoogleTTS',
    'Chrome',
    'Phonesky',
    'Maps',
    'Videos',
    'GmsCore'
    ]
#
#google/apps目录对应的apk dir/对应的apk文件名
target_apk_name = [
    'PlusOne_arm_xhdpi.apk',
    'Duo_arm_xhdpi.apk',
    'Velvet_arm_xhdpi.apk',
    'YouTube_arm_xhdpi.apk',
    'Hangouts_arm_xhdpi.apk',
    'CalendarGoogle.apk',
    'Messenger_arm_xhdpi.apk',
    'EditorsDocs_arm_xhdpi.apk',
    'Photos_arm_xhdpi.apk',
    'Books.apk',
    'Gmail2_xhdpi.apk',
    'Drive_arm_xhdpi.apk',
    'LatinImeGoogle_arm.apk',
    'Music2.apk',
    'GoogleTTS_arm.apk',
    'Chrome_arm.apk',
    'Phonesky.apk',
    'Maps_arm_xhdpi.apk',
    'Videos_arm.apk',
    'GmsCore_arm_xhdpi.apk'
    ]
#定义数组类型
replace_apk_path=[]
target_apk_path=[]

#设置初始路径(写死)
#Android源码中的google app路径
apk_target_dir="vendor/google/apps"
#手机下载的google应用导出到电脑上的路径
apk_replace_dir = "/home/work/download/app/"


def search_file(path):#, filename, newpath)
    queue = []
    queue.append(path);
    while len(queue) > 0:
        tmp = queue.pop(0)
        if (os.path.isdir(tmp)):#如果该路径是文件夹
            for item in os.listdir(tmp):#遍历该路径中文件和文件夹
                queue.append(os.path.join(tmp, item))#将所得路径加入队列queue
        elif (os.path.isfile(tmp)):#如果该路径是文件
            name = os.path.basename(tmp)  # 获取文件名
            dirname = os.path.dirname(tmp)  # 获取文件目录
            full_path = os.path.join(dirname, name)  # 将文件名与文件目录连接起来,形成完整路径
            if os.path.splitext(name)[1]== '.apk':
                for x in range(0,len(replace_dir)):
                    if dirname == apk_replace_dir+replace_dir[x]:
                        print("需要替换的目录:"+dirname)
                        print(name)
                        google_path = os.path.join(apk_target_dir,target_dir[x])
                        if os.path.isdir(google_path):
                            print("Google的目录:"+google_path)
                            print(apk_target_dir+"/"+target_dir[x]+"/"+target_apk_name[x])
                            replace_apk_path.append(full_path)
                            target_apk_path.append(apk_target_dir+"/"+target_dir[x]+"/"+target_apk_name[x])
                        else:
                            print("not find "+google_path)
                        break
                else:
                    print(dirname+" not replace ..")
            # des_path = newpath+'/'+path+'_'+name  #目标路径,将该文件夹信息添加进最后的文件名中
            # if filename in name:#匹配符合条件的文件,也可用if(name.find(filename)!=-1):
            #     shutil.move(full_path, des_path)#移动文件到目标路径(移动+重命名)



print("************************************************************")
print("开始执行替换脚本")
print("搜索替换文件 :"+apk_replace_dir)
search_file(apk_replace_dir)
print("搜索完成\n")
print("list \n")
for x in xrange(1,len(replace_apk_path)):
    print(replace_apk_path[x])
    print(target_apk_path[x])

print("开始替换文件\n")
for x in range(0,len(replace_apk_path)):
    log = '[ apk '+bytes(x)+']'+'replacing '+replace_apk_path[x]+' to '+target_apk_path[x]
    print(log)
    print("\n")
    os.unlink(target_apk_path[x])
    shutil.copy(replace_apk_path[x],target_apk_path[x])

print("success!")

注:

  • 代码中的源码路径和下载的gms包路径是写死的,可以自行替换这个文件路径,
  • 替换的apk包名,有可能不是很全,需要自行添加,多了没关系,少了就是个问题。

你可能感兴趣的:(Android学习)