Android的apk編譯和第三方j(luò)ar包的使用
eclipse增加 User Library方式,如果該.jar不在eclipse項(xiàng)目目錄下,則不會打包進(jìn)Apk。
這也許就是android.jar為何不會被打包到apk中的原因。
參見如下文章:
Android筆記34:命令行打包編譯.apk 包含第三方.jar 的方法
2011-09-11 00:20:12| 分類: android筆記 | 標(biāo)簽:命令行 打包 apk jar 第三方 |字號 訂閱
**中秋節(jié)真是個假期~,從凌晨1點(diǎn)直接睡到下午3點(diǎn),睡了14個小時累積的疲勞一掃而空腦袋也好使了..
之前受托研究個挺好玩的項(xiàng)目..細(xì)節(jié)不說了,我在實(shí)現(xiàn)的時候卡在怎樣脫離eclipse而能將項(xiàng)目源碼編譯成.apk上
發(fā)現(xiàn)網(wǎng)上有現(xiàn)成答案的,參考了以下這篇
http://jojol-zhou.iteye.com/blog/729254
雖然原作者是針對較早期的 Android 1.5(API-3)寫的,但原理和用法相同。
用到的路徑和工具包括(容我偷個懶直接把部分的批處理內(nèi)容直接cp出來了):
SET WORK_SPACE=E:\code\autopack_demo
SET PKG_PATH=com\xxx\apk\autopack_demo
SET JAVA_SPACE=D:\Progra~2\Java\jdk1.6.0_21\bin
SET ANDROID_SPACE=E:\android-sdk-windows
SET JAVAC=%JAVA_SPACE%\javac.exe
SET AAPT=%ANDROID_SPACE%\platform-tools\aapt.exe
SET DX=%ANDROID_SPACE%\platform-tools\dx.bat
REM 輸出的路徑
SET OUT_FOLDER=...
SET OUT_CLASS_FOLDER=...
依葫蘆畫瓢寫批處理試運(yùn)行,發(fā)現(xiàn)卡在一個問題上:項(xiàng)目中部分的功能模塊引用了第三方的 jar 里的類
在編譯的時候報錯,
javac 時凡事引用到j(luò)ar的類的地方都報出了 class not found 之類的錯誤
gen/R.java 里也提對象不匹配 還有一大堆的東西
按著錯誤提示一個一個來解決,按照打包的流程
1. 先解決生成 R.java 這個環(huán)節(jié)
這里預(yù)先我把第三方的3rd.jar復(fù)制到了項(xiàng)目文件夾的 lib/ 下,然后再批處理里定義為
-------------------------------------------------------------------------------------------
SET THIRD_JAR=%WORK_SPACE%\lib\3rd.jar
REM 以下這行命令生成 R.java
%AAPT% package -m -J %GEN_FOLDER% -M %WORK_SPACE%\AndroidManifest.xml -S %RESOURCE_FOLDER% -I %ANDROID_JAR% -I % THIRD_JAR%
-------------------------------------------------------------------------------------------
在命令最后加上了 -I % THIRD_JAR%,這樣有關(guān) R.java 的報錯消失了
2. javac 的錯誤提示..這里是把 .java 編譯成 .class 提示找不到第三方的包
那么在原命令行略作修改 最后添加上 -classpath %THIRD_JAR% 這個引用參數(shù),問題解決
再編譯沒有報錯,把其他資源文件也打包進(jìn)apk最后加上簽名~生成了apk,好像成功咯
安裝到手機(jī)里,運(yùn)行,程序崩潰了... Android筆記34:命令行打包編譯.apk 包含第三方.jar 的方法 - 惡 - 早衰男的巢
看DDMS 輸出地日志~~ 問題還是在于第三方的類..not found ... 呃,不是已經(jīng)編譯通過了嗎
回頭看看那個apk文件,的確太小.. 沒有包含那個jar
做逆向研究... 看看從eclipse 編譯出來的apk(104kb)和我打包出來的(26kb)到底差別在哪里...
把a(bǔ)pk文件當(dāng)做zip解壓~看見尺寸的差異在于 classes.dex 這個文件
!原來問題在這里...
生成dex文件是用 %DX% 查了下 % DX% --help 用法,找到了解決問題的最后一步
3. 輸出dex時把第三方的jar包含在內(nèi)
在 dx --help里說的很明白了:
-------------------------------------------------------------------------------------------
E:\android\android-sdk-windows\platform-tools>dx --help
usage:
dx --dex [--debug] [--verbose] [--positions=<style>] [--no-locals]
[--no-optimize] [--statistics] [--[no-]optimize-list=<file>] [--no-strict]
[--keep-classes] [--output=<file>] [--dump-to=<file>] [--dump-width=<n>]
[--dump-method=<name>[*]] [--verbose-dump] [--no-files] [--core-library]
[--num-threads=<n>] [<file>.class | <file>.{zip,jar,apk} | <directory>] ...
Convert a set of classfiles into a dex file, optionally embedded in a
jar/zip. Output name must end with one of: .dex .jar .zip .apk. Positions
options: none, important, lines.
dx --annotool --annotation=<class> [--element=<element types>]
[--print=<print types>]
dx --dump [--debug] [--strict] [--bytes] [--optimize]
[--basic-blocks | --rop-blocks | --ssa-blocks | --dot] [--ssa-step=<step>]
[--width=<n>] [<file>.class | <file>.txt] ...
Dump classfiles, or transformations thereof, in a human-oriented format.
dx --junit [-wait] <TestClass>
Run the indicated unit test.
dx -J<option> ... <arguments, in one of the above forms>
Pass VM-specific options to the virtual machine that runs dx.
dx --version
Print the version of this tool (1.6).
dx --help
-------------------------------------------------------------------------------------------
在原先寫的 dx 指令最后加上 jar的完整路徑 也就是 %THIRD_JAR% 就ok了
%DX% --dex --output=%OUT_FOLDER%\classes.dex %OUT_CLASS_FOLDER% %THIRD_JAR%
再把編譯打包簽名的順序重新做一遍~生成的apk運(yùn)行一切正常!
或許不是個什么大不了值得做筆記的一個專題,只是老衲java底子如此脆弱不堪..
但之前數(shù)天在 度娘、谷哥、有盜和有病 四個知名包打聽都尋遍了皆一無所獲
在技術(shù)論壇發(fā)帖提問也純引來圍觀無人能解
我想不通是這個問題真的不值一提還是國內(nèi)的編程開發(fā)風(fēng)氣已經(jīng)浮躁到量產(chǎn)我這種白菜的地步..但愿不是后者。
-擱筆-
[Android]命令行編譯APK
(2010年04月18日) 發(fā)表于 ChinaUnix
手動編譯你的apk,可以讓資源目錄不命名為res, 你能夠命名任何你想要的名字。
你可以在以下目錄發(fā)現(xiàn)ant腳本: <SDK_HOME>\platforms\android-1.5\templates\android-rules.xml
第一步: 產(chǎn)生R文件以及包資源
aapt package -f -M ${manifest.file} -F ${packaged.resource.file} -I ${path.to.android-jar.library} -S ${android-resource-directory} [-m -J ${folder.to.output.the.R.java}]
第二步:編譯java源文件以及R.java文件
use javac
第三步:將classes文件轉(zhuǎn)化成Dalvik自節(jié)碼
use dx.bat
dx.bat –dex –output=${output.dex.file} ${compiled.classes.directory} ${jar files..}
第四步:創(chuàng)建未簽名的apk
use apkbuilder
apkbuilder ${output.apk.file} -u -z ${packagedresource.file} -f ${dex.file}
or
apkbuilder ${output.apk.file} -u -z ${packagedresource.file} -f ${dex.file} -rf ${source.dir} -rj ${libraries.dir}
-rf = resources required for compiled source files?
-rj = resources required for jar files
第六步: 產(chǎn)生一個key
use keytool
第七步驟: 對APK進(jìn)行簽名
use jarsigner
jarsigner -keystore ${keystore} -storepass ${keystore.password} -keypass ${keypass} -signedjar ${signed.apkfile} ${unsigned.apkfile} ${keyalias}
第八步: 發(fā)布
use adb
adb -d install -r ${signed.apk}
Inspecting your APK file:
aapt list -v latest.apk
Open questions:
1. Can you include more than one dex file in the apk?
2. Can you have dex file named other than classes.dex in the apk?
3. Does an apk have to have a packaged resource?
android 打包第三方j(luò)ar包
June 30th, 2011 Charlie
android, android 打包外部jar文件 android 打包外部包, android 打包第三方j(luò)ar
android項(xiàng)目開發(fā)時會用到第三方提供的jar包,通常情況下按照eclipse導(dǎo)入jar包的方法(選擇項(xiàng)目,右鍵點(diǎn)擊Build Path,Build Path–>Add Libraries–>User Library–>Next–>User Libraries–>New–>Add JARs,選擇第三方的jar包),就可以將jar包導(dǎo)入到項(xiàng)目。
根據(jù)這樣的打包方式時,eclipse導(dǎo)入jar包后,eclipse編譯器也能識別,即項(xiàng)目不會因?yàn)槿鄙賘ar包而報錯,但是運(yùn)行android程序的時候卻沒有找到包而報錯了。APK文件也很小,也就是jar包并沒有打包到APK文件中。
在android項(xiàng)目中找到.classpath文件并打開,文件代碼如下:
view plaincopy to clipboardprint?
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/box2d"/>
<classpathentry kind="output" path="bin"/>
</classpath>
發(fā)現(xiàn)eclipse導(dǎo)入包操作后,寫入了這行代碼
<classpathentry kind=”con” path=”org.eclipse.jdt.USER_LIBRARY/box2d”/>
這行代碼應(yīng)該是eclipse內(nèi)部識別的,并不會打包到模擬器上,所以運(yùn)行到模擬器上找不到相應(yīng)的jar包。
為了在android內(nèi)部能找到j(luò)ar包,于是在android項(xiàng)目內(nèi)新建一個lib文件夾,將jar包放在lib文件夾內(nèi)。
并將上面的那行代碼刪除,添加一行代碼:
<classpathentry kind=”lib” path=”lib/jbox2d-2.0.1-full.jar”/>
jbox2d-2.0.1-full.jar是lib文件下的jar包,可添加多個jar包。
即最終修改代碼為:
view plaincopy to clipboardprint?
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry kind="lib" path="lib/jbox2d-2.0.1-full.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>
最后刷新eclipse項(xiàng)目,會發(fā)現(xiàn)項(xiàng)目bin目錄的APK文件大小增大,說明APK文件已經(jīng)包含jar包文件,重新clean項(xiàng)目并運(yùn)行即可。