最近項目中須要添加應用渠道,我使用的是友盟統計,對於不一樣渠道須要編譯不一樣版本,對於開發者說編譯一次,手動操做仍是能夠接受的,可是項目發佈版本頻率較高,並且渠道不少,這就是一個體力活,並且手動打包還比較容易出錯,因此就想到了用腳本打包。 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>
只要運行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不久,寫的很囉嗦,望各位看官見諒。
下面是一些截圖。