Android使用Ant多渠道打包


最近項目中須要添加應用渠道,我使用的是友盟統計,對於不一樣渠道須要編譯不一樣版本,對於開發者說編譯一次,手動操做仍是能夠接受的,可是項目發佈版本頻率較高,並且渠道不少,這就是一個體力活,並且手動打包還比較容易出錯,因此就想到了用腳本打包。 java

利用腳本打包的原理就是把項目中的配置文件給覆蓋,而後再次編譯的時候,就是你要的apk了。 python

對於eclipse中項目,可使用ant來編譯,android的sdk中自帶一個ant的build.xml文件,因此直接使用就能夠了,在使用以前須要配置一下。 android

首先定義一個ant的配置文件,放在eclipse的項目目錄中。 windows


ant.properites 數組

out.path=./build/out
out.absolute.dir=./build/compile
out.config.path=./build_config

# sdk的目錄,注意是「/」不是「\」
sdk.dir=E:/tool/android-sdk_r22.2.1-windows/android-sdk-windows

# 項目的package
application.package=com.example.test
# 項目名稱
ant.project.name=test
java.encoding=utf-8

# 簽名的信息
key.store=***
key.store.password=***
key.alias=***
key.alias.password=***

# 應用的版本,和渠道
app_version=1.0
channel=wandoujia

build.xml app


<?xml version="1.0" encoding="UTF-8"?>
<project name="test" default="deploy">

	<property file="ant.properties" />
	<loadproperties srcFile="project.properties" />

	<import file="${sdk.dir}/tools/ant/build.xml" />
	<tstamp prefix="time">
		<format property="time" pattern="yyyyMMddHHmmss" />
	</tstamp>
	<target name="deploy">

		<antcall target="release" />

		<copy tofile="${out.path}/${ant.project.name}_${channel}_${time.time}.apk">
			<fileset dir="${out.absolute.dir}/" includes="${ant.project.name}-release.apk" />
		</copy>

		<delete includeEmptyDirs="true">
			<fileset dir="${out.absolute.dir}" includes="**/*" />
		</delete>
	</target>
</project>



上面的xml定義大概意思就是,找到sdk中{sdk}/tools/ant/build.xml文件,而後編譯,最後簽名,而後拷貝到目標目錄下面,同時重命名apk,apk還有編譯時候的時間戳。

只要運行deploy的任務就能夠完成編譯。
上面的配置文件中的渠道只有豌豆莢一個,那麼怎麼使用多個渠道呢?開發人員很容易就想到了,咱們能夠頂一個渠道數組,而後遍歷數組,分別編譯打包。雖然耗時比較長可是不容易出錯,相對於手動編譯仍是比較好的。 eclipse

在實際項目中我問了下年長的同事,說ant中可使用for循環不,可是須要添加額外的jar包(ant-contrib-1.0b3.jar)來支持,我就覺的比較麻煩,而後本身就寫了一個python的腳步來自動替換ant的配置文件,這樣我又多了幾個文件。若是想了解ant的for標籤使用能夠百度一下,這裏很少作介紹。其實我也不懂,偷笑 python2.7

python_build.cfg



#market_channels
default
hiapk
baidu
360
tencent
nduo
91
wandoujia



上面配置文件裏面是我要打包的渠道,每行一個渠道,#表示註釋。

下面是python的腳步build.py。 ide

configname = "python_build.cfg";
antconfigname = "ant.properties";
channels = [];

def loadChannels():
    global channels;
    configfile = file(configname);
    while True:
        line = configfile.readline();
        if len(line) == 0:
            break;
        line = line.strip();
        if line.startswith('#'):
            pass;
        else:
            channels.append(line);
        
    configfile.close();


def replaceChannel(channel):
    input = open(antconfigname);
    lines = input.readlines();
    input.close();
    
    output = open(antconfigname,"w");
    for line in lines:
        if not line:
            break;
        if line.startswith('channel='):
            temp = 'channel='+channel;
            output.write(temp);
        else:
            output.write(line);
            
    output.close();
        
#==============main begin =========================
import os;

loadChannels();

for channel in channels:
    replaceChannel(channel);
    os.system("ant");
    print ('channel '+channel+' is build success......');



python是一個比較流行的腳步,入手仍是比較簡單的,我也只是週末的時候,看了幾個小時,敲了幾回代碼就寫了上面的腳本,固然可能還有不足的地方,但願有大神看到不要噴我,我這邊使用的是python2.7,使用前須要安裝python才行。 函數

上面分別定義了2個函數,=======下面的就是開始運行腳本,python裏面是沒有main的概念,同時還不支持{},百度來的,好像是發明這個腳本的人,但願強制使用縮進來控制代碼塊,對一個習慣了用ide來寫代碼的的人仍是比較痛苦滴,抓狂。不過我再網上找到了一個比較好的python的ide,叫UliPad。有興趣的童鞋能夠去使用下。

首先是替換渠道名稱,當首先須要讀取配置文件,使用的是python中文件模塊,每次讀取一行,若是開始時「#」則認爲是註釋,不使用,不然加入到一個數組裏面,最後遍歷數組,每次執行的時候,都替換ant裏面的channel一行,而後調用cmd命了,來執行ant。最後完成了渠道打包的功能。


使用cmd,進入到eclipse的項目目錄下面,執行python build.py就能夠了。


小弟也是開發android不久,寫的很囉嗦,望各位看官見諒。



下面是一些截圖。


相關文章
相關標籤/搜索