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