[原]Android打包之跨平台打包

Android自动打包流程详细图:

技术分享

在前面一些博客我们知道了如何通过命令行打包,如何通过Eclipse打包,如何通过编写shell脚本来进行打包,但是这些都不能很好的跨平台进行打包。

因Python本身具有很好的跨平台特性,故本博就是通过使用Python来进行编写跨平台打包脚本,脚本如下(build.py):

#!/bin/python
# build Android application package (.apk) from the command line using the SDK tools

import os
import re
import sys
import time
import shutil
import hashlib

build_root = os.path.dirname(os.path.abspath(__file__))
build_source_name = source
build_apk_name = FullscreenActivity-release.apk
release_apk_path = build_root + /release_apks
publish_apks = build_root + /publish_apks
android_sdk = os.environ.get(ANDROID_SDK)
build_tool_ant_path = android_sdk + /tools/ant
build_bin_path = bin
build_bin_classes_path = classes
source_dir = build_root + / + build_source_name    

rev_cmd = "svn info"
rev_pattern = r"Last Changed Rev: ([0-9]*)"

# delete file folder
def delete_file_folder(src):
    if os.path.isfile(src):
        try:
            os.remove(src)
        except:
            pass
    elif os.path.isdir(src):
        for item in os.listdir(src):
            itemsrc = os.path.join(src,item)
            delete_file_folder(itemsrc) 
        try:
            os.rmdir(src)
        except:
            pass

# calc file md5
def calcMD5(filepath):
    with open(filepath,rb) as f:
        md5obj = hashlib.md5()
        md5obj.update(f.read())
        hash = md5obj.hexdigest()
        return hash

# get source code from svn Repository
def get_source_code():
    if (os.path.exists(release_apk_path)):
        print release_apk_path +  exists!
    else:
        os.makedirs(release_apk_path)       

    if (os.path.exists(source_dir)):
        os.chdir(source_dir)
        os.system(svn update)
    else:
        os.makedirs(source_dir)
        os.chdir(source_dir)
        os.system(svn checkout https://github.com/clarck/AutoBuildProject/trunk .)

# clear classes file folder
def clear_classes_folder():
    classes_abs_path = source_dir + / + build_bin_classes_path
    if (os.path.exists(classes_abs_path)):
        delete_file_folder(classes_abs_path)
    else:
        os.makedirs(classes_abs_path) 

# get svn revision
def get_revision():
    rev = os.popen(rev_cmd).read()
    m = re.search(rev_pattern, rev)
    if m == None:
        return None
    return m.group(1)

# get current time
def get_time():
    return time.strftime(%Y-%m-%d_%H-%M-%S, time.localtime(time.time()))

# ant build
def ant_build():
    os.system(android update project -p . --target android-19)
    os.system(ant clean & ant release)

# copy apk file to target folder
def copy_apk():
    apk_file = source_dir + / + build_bin_path + / + build_apk_name
    target_apk_file = release_apk_path + / + build_apk_name
    if (os.path.exists(apk_file)):
        shutil.copyfile(apk_file, target_apk_file)
    else:
        print apk_file +  is not exists!

# delete source code files
def delete_source_file():
    delete_file_folder(source_dir)

# publish apk 
def publish(date, rev):
    if (os.path.exists(publish_apks)):
        print publish_apks +  exists!
    else:
        os.makedirs(publish_apks)

    md5 = calcMD5(release_apk_path + / + build_apk_name)
    apk_file = release_apk_path + / + build_apk_name
    publish_file = publish_apks + / + date + _ + rev + _ + release.apk
    shutil.move(apk_file, publish_file)
    delete_file_folder(release_apk_path)

# main function 
def main():
    get_source_code()
    clear_classes_folder()
    rev = get_revision()
    date = get_time()
    ant_build()
    copy_apk()
    publish(date, rev)    

if __name__ == __main__:
    main()

 

最后执行:python build.py即可。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。