一键合成APK

require 'FileUtils'
require 'pathname'
require 'digest/md5'
require 'rexml/document'

include REXML

#测试参数
rsyncServer = "keeper@192.168.1.4::"     #rsync服务器地址

apkName = "keeper"                        #最终版本APK名字

ClientApkVer = 13851                     #客户端APK版本

UIType = 0                                 #0 ldip, 1 hdpi UI分辨率类型
LdpiVer = 13935                         #标清UI
HdpiVer =                                  #高清UI
MusicVer = 13934                         #音乐版本

GameVer = 1                             #游戏版本号

cfglVer = 13847                            #cfgl.db版本号
logicclVer = 13847                        #logiccl.db版本号
CfgVer = 13847                            #Cfg配置文件版本号

FightWorldVer = 13870                    #fightWorld Assetbundle版本号
FightABVer = 13452                        #Fight Assetbundle版本号
fightmlVer = 13775                        #fightml.db版本号
fightulVer = 13775                        #fightul.db版本号    
 
#测试参数
filePath = Pathname.new(File.dirname(__FILE__)).realpath #一键打包APK.rb所在的文件夹

apkPath = ""
DecodingPath = filePath + "Decoding"
resPath = filePath + "Res"
cfgPath = filePath + "Cfg"

# ================================================== download ClientApk from version server ==================================================
clientApkPath = Dir.glob(filePath + "gamec_*.apk")[0]

if clientApkPath != nil
    File.delete clientApkPath
end

SrcPath = rsyncServer + "develop/gamec/"
DesPath = filePath
system "rsync -vzrtopg --include=gamec_#{ClientApkVer}_*.apk --exclude=* --progress --password-file=#{filePath + "keeper.pwd"} #{SrcPath} #{DesPath}"

apkPath = Dir.glob(filePath + "gamec_#{ClientApkVer}_*.apk")[0]

# ================================================== download UI from version server ==================================================
if File.exist?(resPath) == true

    Dir.foreach(resPath) do |file|
        if file!="." and file!=".."
            FileUtils.remove_file(resPath+file, true)
        end
    end

else
    
    Dir.mkdir(resPath)

end

if UIType == 0
    SrcPath = rsyncServer + "develop/ui_l/ldpi_#{LdpiVer}/"
elsif UIType == 1
    SrcPath = rsyncServer + "develop/ui_h/hdpi_#{HdpiVer}/"
end

DesPath = resPath

system "rsync -vzrtopg --exclude=\"*.md5\" --exclude=\"*.meta\" --exclude=\"*.svn\" --progress --password-file=#{filePath + "keeper.pwd"} #{SrcPath} #{DesPath}"

# ================================================== download Music from version server ==================================================
SrcPath = rsyncServer + "develop/ui_music/music_#{MusicVer}/"
DesPath = resPath
system "rsync -vzrtopg --exclude=\"*.md5\" --exclude=\"*.meta\" --exclude=\"*.svn\" --progress --password-file=#{filePath + "keeper.pwd"} #{SrcPath} #{DesPath}"

# ================================================== download Fight from version server ==================================================
SrcPath = rsyncServer + "develop/fightUl/"
DesPath = resPath
system "rsync -vzrtopg --include=fightul_#{fightulVer}_*.db --exclude=* --progress --password-file=#{filePath + "keeper.pwd"} #{SrcPath} #{DesPath}"

SrcPath = rsyncServer + "develop/fightMl/"
DesPath = resPath
system "rsync -vzrtopg --include=fightml_#{fightmlVer}_*.db --exclude=* --progress --password-file=#{filePath + "keeper.pwd"} #{SrcPath} #{DesPath}"

SrcPath = rsyncServer + "develop/fightAB/fightAB_#{FightABVer}/"
DesPath = resPath
system "rsync -vzrtopg --exclude=\"*.md5\" --exclude=\"*.meta\" --exclude=\"*.svn\" --progress --password-file=#{filePath + "keeper.pwd"} #{SrcPath} #{DesPath}"

SrcPath = rsyncServer + "develop/fightWorld/fightWorld_#{FightWorldVer}/"
DesPath = resPath
system "rsync -vzrtopg --exclude=\"*.md5\" --exclude=\"*.meta\" --exclude=\"*.svn\" --progress --password-file=#{filePath + "keeper.pwd"} #{SrcPath} #{DesPath}"

# ================================================== download GameDataLayer from version server ==================================================
if File.exist?(cfgPath) == true

    Dir.foreach(cfgPath) do |file|
        if file!="." and file!=".."
            FileUtils.remove_file(cfgPath+file, true)
        end
    end

else
    
    Dir.mkdir(cfgPath)

end

SrcPath = rsyncServer + "develop/cfgl/"
DesPath = cfgPath
system "rsync -vzrtopg --include=cfgl_#{cfglVer}_*.db --exclude=* --progress --password-file=#{filePath + "keeper.pwd"} #{SrcPath} #{DesPath}"

SrcPath = rsyncServer + "develop/logiccl/"
DesPath = cfgPath
system "rsync -vzrtopg --include=logiccl_#{logicclVer}_*.db --exclude=* --progress --password-file=#{filePath + "keeper.pwd"} #{SrcPath} #{DesPath}"

SrcPath = rsyncServer + "develop/c_config/c_config_#{CfgVer}/"
DesPath = cfgPath
system "rsync -vzrtopg --exclude=\"*.md5\" --exclude=\"*.meta\" --exclude=\"*.svn\" --progress --password-file=#{filePath + "keeper.pwd"} #{SrcPath} #{DesPath}"


# ================================================== one key md5 for Cfg==================================================
CfgUpdateFilePath = cfgPath + "UpdateFile.xml"

if File.exist?(CfgUpdateFilePath) == true
    FileUtils.remove_file(CfgUpdateFilePath, true)
end

xmlFile = File.new(CfgUpdateFilePath, "w+")    #新建XML文件, 将以下内容写入
doc = Document.new       #创建XML内容
 
xmldecl = XMLDecl.new("1.0", "UTF-8")
doc.add(xmldecl)

root = doc.add_element('updateFile')
e1 = root.add_element('updateFileList',
{'version'        =>    "1.0.#{GameVer}",
 'date'         =>    Time.now})

Dir.foreach(cfgPath) do |file|
    if file!="." and file!=".." and file !="UpdateFile.xml" and file != ".DS_Store"
        str = file.to_str
        
        index1 = str.rindex('_')
        index2 = str.rindex('.')
        
        md5 = str[(index1+1), (index2-index1-1)]
        
        str = str.gsub('_' + md5, "")
        
        index1 = str.rindex('_')
        index2 = str.rindex('.')
        
        filetype = str[index2+1, str.length]
        
        if filetype == "unity3d"
        
        elsif filetype == "db"
            ver = str[(index1+1), (index2-index1-1)]
            str = str.gsub('_' + ver, "")
        end
        
        File.rename(cfgPath+file, cfgPath+str)
          
        e1.add_element('files',    {
        'fileName'    =>    str,
        'md5'        =>    md5})
        
        
    end
end

#doc.write
xmlFile.puts doc.write

checkPath = cfgPath + "check"
xmlMd5 = Digest::MD5.hexdigest(File.read(CfgUpdateFilePath))
checkFile = File.new(checkPath, "w+")
checkFile.puts xmlMd5
checkFile.close

# ================================================== one key md5 for Res==================================================

ResUpdateFilePath = resPath + "UpdateFile.xml"

if File.exist?(ResUpdateFilePath) == true
    FileUtils.remove_file(ResUpdateFilePath, true)
end

xmlFile = File.new(ResUpdateFilePath, "w+")    #新建XML文件, 将以下内容写入
doc = Document.new       #创建XML内容
 
xmldecl = XMLDecl.new("1.0", "UTF-8")
doc.add(xmldecl)

root = doc.add_element('updateFile')
e1 = root.add_element('updateFileList',
{'version'        =>    "1.0.#{GameVer}",
 'date'         =>    Time.now})

Dir.foreach(resPath) do |file|
    if file!="." and file!=".." and file !="UpdateFile.xml" and file != ".DS_Store"
        str = file.to_str
        
        index1 = str.rindex('_')
        index2 = str.rindex('.')
        
        md5 = str[(index1+1), (index2-index1-1)]
        p file
        str = str.gsub('_' + md5, "")
        
        index1 = str.rindex('_')
        index2 = str.rindex('.')
        
        filetype = str[index2+1, str.length]
        
        if filetype == "unity3d"
        
        elsif filetype == "db"
            ver = str[(index1+1), (index2-index1-1)]
            str = str.gsub('_' + ver, "")
        end
        
        File.rename(resPath+file, resPath+str)
          
        e1.add_element('files',    {
        'fileName'    =>    str,
        'md5'        =>    md5})
        
        
    end
end

#doc.write
xmlFile.puts doc.write

checkPath = resPath + "check"
xmlMd5 = Digest::MD5.hexdigest(File.read(ResUpdateFilePath))
checkFile = File.new(checkPath, "w+")
checkFile.puts xmlMd5
checkFile.close

# ================================================== one key APK ==================================================
#decoding apk to folder "Decoding"
system "apktool d -f #{apkPath} #{DecodingPath}"
p "client: decoding apk successful!"

#remove folder to decoding folder
if File.exist?(DecodingPath + "assets/Cfg") == true
    FileUtils.remove_dir(DecodingPath + "assets/Cfg", true)
    p "client: delete Cfg folder from decoding folder successful!"
end

if File.exist?(DecodingPath + "assets/Res") == true
    FileUtils.remove_dir(DecodingPath + "assets/Res", true)
    p "client: delete Res folder from decoding folder successful!"
end

#copy folder to decoding folder
FileUtils.cp_r(filePath + "Cfg", DecodingPath + "assets/Cfg")
p "client: cope Cfg to decoding folder successful!"

FileUtils.cp_r(filePath + "Res", DecodingPath + "assets/Res")
p "client: cope Res to decoding folder successful!"

#build Decoding folder to apk
system "apktool b #{DecodingPath}"
p "client: build apk successful!"

#sign apk
keystorePath = filePath + "gate.keystore"
signApkPath = filePath + "apk/#{apkName}_#{GameVer}.apk"
unsignApkPath = DecodingPath + "dist/#{File.basename(apkPath)}"

system "/usr/libexec/java_home -v 1.6.0 --exec jarsigner -verbose -keystore #{keystorePath} -storepass 123456 -signedjar #{signApkPath} #{unsignApkPath} #{keystorePath}"

p "client: sign #{apkName}.apk successful!"

verFilePath = File.dirname(signApkPath) + "/#{apkName}_#{GameVer}.txt"
verFile = File.new(verFilePath, "w+")

verFile.puts "rsync服务器地址: #{rsyncServer}"
verFile.puts "最终版本APK名字: #{apkName}_#{GameVer}.apk"
verFile.puts "客户端APK版本: #{ClientApkVer}"
verFile.puts "UI分辨率类型: #{UIType}"
verFile.puts "标清UI版本: #{LdpiVer}"
verFile.puts "高清UI版本: #{HdpiVer}"
verFile.puts "音乐版本: #{MusicVer}"
verFile.puts "游戏版本号: #{GameVer}"
verFile.puts "cfgl.db版本号: #{cfglVer}"
verFile.puts "logiccl.db版本号: #{logicclVer}"
verFile.puts "Cfg配置文件版本号: #{CfgVer}"
verFile.puts "FightWorld Assetbundle版本号: #{FightWorldVer}"
verFile.puts "Fight Assetbundle版本号: #{FightABVer}"
verFile.puts "fightml.db版本号: #{fightmlVer}"
verFile.puts "fightul.db版本号: #{fightulVer}"

p "client: #{apkName}.apk rebuild successful!"

转载于:https://www.cnblogs.com/bigduck/p/3873521.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值