# 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

android多渠道自动打包工具,Android多渠道打包工具相关推荐

  1. android系统自动构建,[系统集成] Android 自动构建系统

    一.简介 android app 自动构建服务器用于自动下载app代码.自动打包.发布,要建立这样的服务器,关键要解决以下几个问题: 1. android app 自动化打包 android 的打包一 ...

  2. android程序自动卸载软件,Android应用静默安装和卸载

    App的静默安装和卸载 Android系统本身提供了安装卸载功能,但是api接口是@hide的,不是公开的接口,所以在应用级别 是无法实现静默安装和卸载的,要实现静默安装和卸载需要是系统应用,要有系统 ...

  3. android 360自动更新,解决Android百度自动更新SDK和360自动更新SDK兼容

    最近上架的一个项目相序的被百度平台和360平台下架,郁闷的同时只能询问客服,得到的回复都是'**平台的自动更新SDK会在您系统自动安装有害系统的软件,请使用本平台提供的更新SDK',强制使用它平台的更 ...

  4. Android Studio自动排版格式化(android排版和xml排版)

    Android Studio自动排版格式化 今天自己想让Android Studio软件自动格式化排版,结果搜了一下,都说是Ctrl + Alt + L 结果不行 后面自已经过网上一些提示和自己探索终 ...

  5. android编程 自动裁剪图片,Android编程实现调用相册、相机及拍照后直接裁剪的方法...

    本文实例讲述了Android编程实现调用相册.相机及拍照后直接裁剪的方法.分享给大家供大家参考,具体如下: package com.cvte.health.phone; import java.io. ...

  6. android app自动锁屏,Android开机自动启动app 不锁屏

    Android开机自动启动app 不锁屏 发布时间:2020-07-17 03:22:20 来源:51CTO 阅读:2086 作者:清水禅石 主要参考:http://life173.blog.51ct ...

  7. android 图片自动裁剪图片,Android图片选择到裁剪之步步深坑 – 简书

    我的问题已经解决,查阅了几十篇相关文章,换了数种解决方案,最终解决,虽然不是按照本文来的,但关闭窗口的时候发现本文算是系统,特此转载. 最近在自己的项目里实现了一个头像选择的功能,就是先从相册里选取一 ...

  8. android studio自动设置权限,android studio打包,安装后权限都没有默认打开,如何设置打开?...

    android studio打包,安装后权限都没有默认打开,如何设置打开?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! ...

  9. android安装自动打开网页,Android调用系统自带浏览器打开网页的实现方法

    Android调用系统自带浏览器打开网页的实现方法 在Android中可以调用自带的浏览器,或者指定一个浏览器来打开一个链接.只需要传入一个uri,可以是链接地址. 启动android默认浏览器 在A ...

  10. android+后台自动更新+上架,Android增量自动更新

    抽取的Android自动更新库,目的是几行代码引入更新功能,含服务端代码,欢迎Star,欢迎Fork,谢谢- 目录 功能介绍 [x] 支持全量更新apk,直接升级到最新版本 [x] 支持增量更新,只下 ...

最新文章

  1. 8个流行的Python可视化工具包!!!
  2. linux 找回gpt分区,linux – 修复graid mini磁盘上损坏的GPT分区
  3. java web基础1Tomcat服务器基本知识
  4. C语言有三个电阻r1r2r3,[VR虚拟现实]ARM硬件试题库及答案(37页)-原创力文档
  5. python算发必须有输出吗_数据时代为什么一定要学python+算法?
  6. puTTY的配置导入和导出
  7. 应用MVP模式写出可维护的优美Android应用
  8. 【C++】【TinyXml】xml文件的读写功能使用——写xml文件
  9. binary_sort 二叉树
  10. jet mysql连接字符串,关于jet db的连接字串,以及加密后的字串-数据库专栏,SQL Server...
  11. 系统即将关机请保存关机是由nt_设置Windows电脑自动关机
  12. 解决安装IIS时提示找不到zClientm.exe文件的问题
  13. 04_mysql增删改操作
  14. 学了这几招,社交时人人都对你刮目相看
  15. HyperLynx(三)传输线类型及相关设置
  16. 10、【易混淆概念集】-第六章1 三点估算 类比估算和参数估算的区别 储备分析 历时估算 项目进度网络图
  17. Draco使用笔记(1)——图形解压缩
  18. hover出不来是什么原因css,关于css的:hover失效问题
  19. 6p14推挽胆机20w功放电路图_6P14推挽双输出牛胆机
  20. python对于0x01的处理

热门文章

  1. Python 程序员最常犯的十个错误
  2. Splunk安装和配置及源码编译安装SVN
  3. 无法打开物理文件 X.mdf。操作系统错误 5:5(拒绝访问。)
  4. params(C# 参考)
  5. 深入解析windows操作系统。。。。
  6. Cisco Catalyst 2960系列交换机资料
  7. linux 编译sqlitecpp,编译安装sqlite3数据库
  8. 6-4 链表拼接 (20分)_青岛喷绘制作公司不愿透露的喷绘布拼接与安装技巧,建议收藏...
  9. oracle接收输入参数,Oracle带输入输出参数存储过程(包括sql分页功能)
  10. mysql安装samba_centos 安装samba