使用ant編譯之簽名問題
DionysosLai([email protected]) 2015/1/5
使用ant編譯,可以很大提高項目開發效率。目前,coco2dx官方所提倡的提高几十倍的編譯速度,其實就是使用了ant技術。原理提前將引擎庫編譯成一個so文件,遊戲編譯時,只需要編譯自己的代碼即可,而不需要同時編譯引擎代碼。相比自己的代碼與引擎代碼量,二者相差了幾十倍,因此速度會提高很多。同時另一方面,很多問題,在Eclipse上只會報錯,而不能指出具體位置(相信,大家在寫mk文件時,就遇到這個問題)。然而,使用了ant編譯,問題具體位置將完完全全的顯示出來。
當然使用ant編譯也有不好的地方,就是每次都會重新編譯代碼,而不是改動過的代碼,這樣導致每次生成apk文件都需要1到2分鐘,這取決於遊戲代碼量。
在cocos2dx引擎中,使用ant編譯工程,是一項比較複雜的操作,因此打算分成幾個部分,詳細的將問題闡述清楚。作爲第一篇關於ant編譯問題,先闡述一個比較簡單的話題:簽名。這個話題的延伸,就是自動生成apk,自動給apk打簽名了。
給apk簽名,有兩種,一種是手動簽名,另一種是自動簽名。
手動簽名:
1. 生成apk
使用ant編譯之簽名問題使用ant編譯,可以參考這篇pdf文件(http://download.csdn.net/detail/dionysos_lai/8333741)或者網上其他資料。大概命令類似如下:
call cd 工程文件夾\proj.android
callandroid update project -p .
call antclean
call antdebug
pause
這是,我寫的一個自動編譯腳本,雙擊運行即可,這樣會自動生成一個debug版的apk(注意,debgu版apk,系統會自動給apk打上bebug簽名,只能將
”call ant debug”改成”call ant release”才能生成一個未簽名過的release版apk)。
2. Apk簽名
如何Apk簽名,可以再網上找到相關資料,這裏可以參考我自己寫的一個腳本命令行:
call jarsigner -verbose -keystore key文件名字 -signedjarok/代簽名apk名字 生成apk名字 key文件名字
pause
創建一個.bat文件,將文件放在待簽名apk同一級目錄下即可,雙擊運行,之後輸入簽名key文件的密碼,就會在ok文件夾生成簽好名的apk了。
這裏簽名會有一個問題出現:"java.util.zip.ZipException:invalid entry compressed size (expected 4308 but got 4432bytes)"。這個問題很多人在網上遇到過,在ant編譯時,我也曾遇到過,網上的說法有很多,解決也一樣。後來,分析問題,其實很簡單,就是說apk大小出錯,本來應該是4308字節,現在確實4432字節了,然後就報壓縮出錯問題。其實,之所以出現這個問題,是因爲我們嘗試使用debug版apk簽名了,而debug版apk已經簽過名了(這也是apk大小增大的原因)。因此我們只能輸出release版apk,再次簽名。
直接將”call ant debug”改成”call ant release”,雙擊運行腳本文件,會報這個如下錯誤;
(ps,這就是使用ant編譯好處,問題出現位置很清楚),這是由於文件” custom_rules.xml”67行清清楚楚這樣寫着” <copyfile="${source.absolute.dir}/../bin/${ant.project.name}-debug.apk"tofile="${customapk.out}/${ant.project.name}.apk" />”我們要做的就是改成這樣即可”<copy file="${source.absolute.dir}/../bin/${ant.project.name}-release.apk"tofile="${customapk.out}/${ant.project.name}.apk" />”
3. 驗證簽名
Apk簽名驗證,可使用以下命令行,相關資料可以參考:http://stackoverflow.com/questions/7104624/how-do-i-verify-that-an-android-apk-is-signed-with-a-release-certificate/7104680#7104680
calljarsigner -verify -verbose -certs 待驗證apk名字
自動簽名:
相對於手動簽名,自動簽名可以省去手動給apk打上簽名這一步驟,不過自動簽名是隻能是release版,debug版不存在這一步驟。
如何自動簽名,其實在文件”ant.properties”中,已經寫得很詳細了:
# This file is used to override default values used bythe Ant build system.
#
# This file must be checked into Version Control Systems,as it is
# integral to the build system of your project.
# This file is only used by the Ant script.
# You can use this to override default values such as
# 'source.dir' forthe location of your java source folder and
# 'out.dir' forthe location of your output folder.
# You can also use it define how the release builds aresigned by declaring
# the following properties:
# 'key.store' forthe location of your keystore and
# 'key.alias' forthe name of the key to use.
# The password will be askedduring the build when you use the 'release' target.
根據其提示,在這個文件中添加如下幾句即可:
key.store=E:/LogicGame/cocos2d-x-2.2.3/apk/key
key.alias=key
key.store.password=123456
key.alias.password=123456
注意,這裏”key”是簽名key,123456,是其密碼。這裏可能會有一個這樣一個錯誤。
引起這個錯誤的原因,就是unix與window的格式問題,也就是將”/”,寫錯了”\”。
ok,關於ant簽名差不多就到這裏了,希望對大家有用。