Android的apk編譯和第三方j(luò)ar包的使用
eclipse增加 User Library方式,如果該.jar不在eclipse項(xiàng)目目錄下,則不會(huì)打包進(jìn)Apk。
這也許就是android.jar為何不會(huì)被打包到apk中的原因。
參見如下文章:
Android筆記34:命令行打包編譯.apk 包含第三方.jar 的方法
2011-09-11 00:20:12| 分類: android筆記 | 標(biāo)簽:命令行 打包 apk jar 第三方 |字號(hào) 訂閱
**中秋節(jié)真是個(gè)假期~,從凌晨1點(diǎn)直接睡到下午3點(diǎn),睡了14個(gè)小時(shí)累積的疲勞一掃而空腦袋也好使了..
之前受托研究個(gè)挺好玩的項(xiàng)目..細(xì)節(jié)不說了,我在實(shí)現(xiàn)的時(shí)候卡在怎樣脫離eclipse而能將項(xiàng)目源碼編譯成.apk上
發(fā)現(xiàn)網(wǎng)上有現(xiàn)成答案的,參考了以下這篇
http://jojol-zhou.iteye.com/blog/729254
雖然原作者是針對(duì)較早期的 Android 1.5(API-3)寫的,但原理和用法相同。
用到的路徑和工具包括(容我偷個(gè)懶直接把部分的批處理內(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)卡在一個(gè)問題上:項(xiàng)目中部分的功能模塊引用了第三方的 jar 里的類
在編譯的時(shí)候報(bào)錯(cuò),
javac 時(shí)凡事引用到j(luò)ar的類的地方都報(bào)出了 class not found 之類的錯(cuò)誤
gen/R.java 里也提對(duì)象不匹配 還有一大堆的東西
按著錯(cuò)誤提示一個(gè)一個(gè)來解決,按照打包的流程
1. 先解決生成 R.java 這個(gè)環(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 的報(bào)錯(cuò)消失了
2. javac 的錯(cuò)誤提示..這里是把 .java 編譯成 .class 提示找不到第三方的包
那么在原命令行略作修改 最后添加上 -classpath %THIRD_JAR% 這個(gè)引用參數(shù),問題解決
再編譯沒有報(bào)錯(cuò),把其他資源文件也打包進(jìn)apk最后加上簽名~生成了apk,好像成功咯
安裝到手機(jī)里,運(yùn)行,程序崩潰了... Android筆記34:命令行打包編譯.apk 包含第三方.jar 的方法 - 惡 - 早衰男的巢
看DDMS 輸出地日志~~ 問題還是在于第三方的類..not found ... 呃,不是已經(jīng)編譯通過了嗎
回頭看看那個(gè)apk文件,的確太小.. 沒有包含那個(gè)jar
做逆向研究... 看看從eclipse 編譯出來的apk(104kb)和我打包出來的(26kb)到底差別在哪里...
把a(bǔ)pk文件當(dāng)做zip解壓~看見尺寸的差異在于 classes.dex 這個(gè)文件
!原來問題在這里...
生成dex文件是用 %DX% 查了下 % DX% --help 用法,找到了解決問題的最后一步
3. 輸出dex時(shí)把第三方的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)行一切正常!
或許不是個(gè)什么大不了值得做筆記的一個(gè)專題,只是老衲java底子如此脆弱不堪..
但之前數(shù)天在 度娘、谷哥、有盜和有病 四個(gè)知名包打聽都尋遍了皆一無所獲
在技術(shù)論壇發(fā)帖提問也純引來圍觀無人能解
我想不通是這個(gè)問題真的不值一提還是國內(nèi)的編程開發(fā)風(fēng)氣已經(jīng)浮躁到量產(chǎn)我這種白菜的地步..但愿不是后者。
-擱筆-
[Android]命令行編譯APK
(2010年04月18日) 發(fā)表于 ChinaUnix
手動(dòng)編譯你的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)生一個(gè)key
use keytool
第七步驟: 對(duì)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ā)時(shí)會(huì)用到第三方提供的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ù)這樣的打包方式時(shí),eclipse導(dǎo)入jar包后,eclipse編譯器也能識(shí)別,即項(xiàng)目不會(huì)因?yàn)槿鄙賘ar包而報(bào)錯(cuò),但是運(yùn)行android程序的時(shí)候卻沒有找到包而報(bào)錯(cuò)了。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)部識(shí)別的,并不會(huì)打包到模擬器上,所以運(yùn)行到模擬器上找不到相應(yīng)的jar包。
為了在android內(nèi)部能找到j(luò)ar包,于是在android項(xiàng)目內(nèi)新建一個(gè)lib文件夾,將jar包放在lib文件夾內(nèi)。
并將上面的那行代碼刪除,添加一行代碼:
<classpathentry kind=”lib” path=”lib/jbox2d-2.0.1-full.jar”/>
jbox2d-2.0.1-full.jar是lib文件下的jar包,可添加多個(gè)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)目,會(huì)發(fā)現(xiàn)項(xiàng)目bin目錄的APK文件大小增大,說明APK文件已經(jīng)包含jar包文件,重新clean項(xiàng)目并運(yùn)行即可。