高效更新源码中的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包名,有可能不是很全,需要自行添加,多了没关系,少了就是个问题。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《冒险岛GMS083源码服务端》是一款基于冒险岛系列游戏的源码服务端。冒险岛是一款非常受欢迎的横版冒险游戏,GMS083指的是该游戏的版本号,而源码服务端则是指提供冒险岛游戏服务器的源代码。 冒险岛GMS083源码服务端提供了游戏服务器的源代码,玩家可以通过修改源代码来进行游戏定制和开发。这意味着玩家可以根据自己的需求和喜好来改变游戏的规则、增加新的游戏内容以及修复存在的bug。 通过源码服务端,玩家可以自行搭建冒险岛游戏服务器,以实现自己想要的游戏模式或者创建私人服务器供自己和朋友们玩耍。同时,源码服务端也为玩家提供了更多的灵活性和自由度,可以通过修改源代码来实现自定义的游戏玩法和功能。 当然,自行搭建游戏服务器需要一定的技术和编程知识,因此对于不具备相关背景的玩家来说可能有一定的学习门槛。但是对于对冒险岛游戏有浓厚兴趣并且想要创造属于自己的游戏世界的玩家来说,冒险岛GMS083源码服务端提供了一个非常好的平台。 总的来说,冒险岛GMS083源码服务端提供了给予玩家更多自由度和创造空间的机会,让玩家可以通过修改源代码来实现自定义的游戏玩法和功能,打造属于自己的游戏世界。同时,自行搭建游戏服务器也需要一定的编程知识和技术支持。如果你对此感兴趣,可以尝试使用冒险岛GMS083源码服务端来创建属于自己的冒险岛游戏服务器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值