# encoding: UTF-8
require 'io/console'
require 'ruby-pinyin'
task :default => [:release]
PARTNERS = [
['小米市场', 0x10100009],
['360市场', 0x10100009]
]
INPUT_APK_DIR = 'input'
INPUT_APK_FILE_PATH = "unsigned.apk"
OUTPUT_APK_DIR = 'output'
OUTPUT_APK_PREFIX = 'prefix'
TEMP_DIR = 'tmp'
UNPACK_DIR = "#{TEMP_DIR}/unpack"
TEMP_UNSIGNED_APK_FILE_PATH = "#{TEMP_DIR}/unsigned.apk"
TEMP_SIGNED_APK_FILE_PATH = "#{TEMP_DIR}/signed.apk"
KEYSTORE = 'key.keystore'
KEYSTORE_KEY = 'key_alias'
ZIPALIGN = 'zipalign -f -v 4'
def unpack_apk
puts 'unpacking...'
filepath = "#{INPUT_APK_DIR}/#{INPUT_APK_FILE_PATH}"
puts filepath
`apktool d #{filepath} -o #{UNPACK_DIR} > /dev/null 2>&1`
end
def release(name, id, password, version)
puts "release #{name} (#{id.to_s(16)}) ..."
path = "#{OUTPUT_APK_DIR}"
FileUtils.mkdir_p path
filepath = "#{path}/#{OUTPUT_APK_PREFIX}_#{version}_#{to_pinyin(name)}.apk"
puts filepath
replace_umeng_channel(name, id)
pack
sign(password)
zip_align(filepath)
end
def to_pinyin(name)
PinYin.sentence(name).gsub(' ', '').gsub('(', '_').gsub(')', '')
end
def replace_umeng_channel(name, id)
id = "0x#{id.to_s(16).upcase}"
`sed -i -e '/UMENG_CHANNEL/s/value="[^"]*"/value="C_#{id}"/' #{UNPACK_DIR}/AndroidManifest.xml`
end
def replace_xp_key(key)
`sed -i -e '/FP_KEY/s/value="[^"]*"/value="#{key}"/' #{UNPACK_DIR}/AndroidManifest.xml`
`sed -i -e '/FX_KEY/s/value="[^"]*"/value="#{key}"/' #{UNPACK_DIR}/AndroidManifest.xml`
end
def pack
`apktool b -f #{UNPACK_DIR} -o #{TEMP_UNSIGNED_APK_FILE_PATH} > /dev/null 2>&1`
end
def sign(password)
`jarsigner -sigalg MD5withRSA \
-digestalg SHA1 \
-keystore #{KEYSTORE} \
-keypass #{password} \
-storepass #{password} \
-signedjar #{TEMP_SIGNED_APK_FILE_PATH} \
#{TEMP_UNSIGNED_APK_FILE_PATH} #{KEYSTORE_KEY}`
end
def zip_align(path)
`#{ZIPALIGN} #{TEMP_SIGNED_APK_FILE_PATH} #{path}`
end
def get_app_version_code
version = nil
file = open("#{UNPACK_DIR}/AndroidManifest.xml")
file.each_line do |line|
matches = /android:versionCode="(\d+)"/.match line
unless matches.nil?
version = matches[1]
break
end
end
version
end
def get_app_version_name
version = nil
file = open("#{UNPACK_DIR}/AndroidManifest.xml")
file.each_line do |line|
matches = /android:versionName="([\d.]+)"/.match line
unless matches.nil?
version = matches[1]
break
end
end
version
end
def clean
puts 'clean.'
`rm -rf #{TEMP_DIR}`
end
def jsontest
end
task :release do
print "Password:"
password = STDIN.noecho(&:gets).strip
puts ''
unpack_apk
versionName = get_app_version_name
versionCode = get_app_version_code
puts "App VersionCode: #{versionCode}"
puts "App VersionName: #{versionName}"
versionName = "2.0"
versionCode = 20
PARTNERS.each do |partner|
release(partner[0], partner[1], password, versionName)
end
clean
end
task :unpack do
unpack_apk
versionName = get_app_version_name
versionCode = get_app_version_code
puts "App VersionCode: #{versionCode}"
puts "App VersionName: #{versionName}"
end
task :unpack_apk do
unpack_apk
end
task :clean do
clean
end