使用ant編譯之簽名問題

使用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簽名差不多就到這裏了,希望對大家有用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章