一键合成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!"


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值