Android的apk編譯和第三方jar包的使用


Android的apk編譯和第三方jar包的使用
 
eclipse增加 User Library方式,如果該.jar不在eclipse項目目錄下,則不會打包進Apk。
這也許就是android.jar為何不會被打包到apk中的原因。
 
參見如下文章:
 
Android筆記34:命令行打包編譯.apk 包含第三方.jar 的方法 
 
2011-09-11 00:20:12| 分類: android筆記 | 標簽:命令行 打包 apk jar 第三方 |字號 訂閱
**中秋節真是個假期~,從凌晨1點直接睡到下午3點,睡了14個小時累積的疲勞一掃而空腦袋也好使了..
 
之前受托研究個挺好玩的項目..細節不說了,我在實現的時候卡在怎樣脫離eclipse而能將項目源碼編譯成.apk上
 
發現網上有現成答案的,參考了以下這篇
http://jojol-zhou.iteye.com/blog/729254
 
雖然原作者是針對較早期的 Android 1.5(API-3)寫的,但原理和用法相同。
 
用到的路徑和工具包括(容我偷個懶直接把部分的批處理內容直接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=...
 
依葫蘆畫瓢寫批處理試運行,發現卡在一個問題上:項目中部分的功能模塊引用了第三方的 jar 里的類
 
在編譯的時候報錯,
javac 時凡事引用到jar的類的地方都報出了 class not found 之類的錯誤
gen/R.java 里也提對象不匹配 還有一大堆的東西
 
按着錯誤提示一個一個來解決,按照打包的流程
 
1. 先解決生成 R.java 這個環節
 
這里預先我把第三方的3rd.jar復制到了項目文件夾的 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%,這樣有關 R.java 的報錯消失了
 
2. javac 的錯誤提示..這里是把 .java 編譯成 .class 提示找不到第三方的包
那么在原命令行略作修改 最后添加上 -classpath %THIRD_JAR% 這個引用參數,問題解決
 
 
 
再編譯沒有報錯,把其他資源文件也打包進apk最后加上簽名~生成了apk,好像成功咯
安裝到手機里,運行,程序崩潰了... Android筆記34:命令行打包編譯.apk 包含第三方.jar 的方法 - 惡 - 早衰男的巢
 
看DDMS 輸出地日志~~ 問題還是在於第三方的類..not found ... 呃,不是已經編譯通過了嗎
 
回頭看看那個apk文件,的確太小.. 沒有包含那個jar 
 
做逆向研究... 看看從eclipse 編譯出來的apk(104kb)和我打包出來的(26kb)到底差別在哪里...
把apk文件當做zip解壓~看見尺寸的差異在於 classes.dex 這個文件
!原來問題在這里...
 
生成dex文件是用 %DX% 查了下 % DX% --help 用法,找到了解決問題的最后一步
 
3. 輸出dex時把第三方的jar包含在內
在 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運行一切正常!
或許不是個什么大不了值得做筆記的一個專題,只是老衲java底子如此脆弱不堪..
但之前數天在 度娘、谷哥、有盜和有病 四個知名包打聽都尋遍了皆一無所獲
在技術論壇發帖提問也純引來圍觀無人能解
我想不通是這個問題真的不值一提還是國內的編程開發風氣已經浮躁到量產我這種白菜的地步..但願不是后者。
 
-擱筆-
 
 
[Android]命令行編譯APK
(2010年04月18日) 發表於 ChinaUnix
 
手動編譯你的apk,可以讓資源目錄不命名為res, 你能夠命名任何你想要的名字。
 
你可以在以下目錄發現ant腳本: <SDK_HOME>\platforms\android-1.5\templates\android-rules.xml
 
第一步: 產生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文件轉化成Dalvik自節碼
use dx.bat
dx.bat –dex –output=${output.dex.file} ${compiled.classes.directory} ${jar files..}
 
第四步:創建未簽名的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
 
第六步: 產生一個key
use keytool
 
第七步驟: 對APK進行簽名
use jarsigner
 
jarsigner -keystore ${keystore} -storepass ${keystore.password} -keypass ${keypass} -signedjar ${signed.apkfile} ${unsigned.apkfile} ${keyalias}
 
 
第八步: 發布
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 打包第三方jar包
 June 30th, 2011 Charlie
android, android 打包外部jar文件 android 打包外部包, android 打包第三方jar
 
android項目開發時會用到第三方提供的jar包,通常情況下按照eclipse導入jar包的方法(選擇項目,右鍵點擊Build Path,Build Path–>Add Libraries–>User Library–>Next–>User Libraries–>New–>Add JARs,選擇第三方的jar包),就可以將jar包導入到項目。
 
根據這樣的打包方式時,eclipse導入jar包后,eclipse編譯器也能識別,即項目不會因為缺少jar包而報錯,但是運行android程序的時候卻沒有找到包而報錯了。APK文件也很小,也就是jar包並沒有打包到APK文件中。
 
在android項目中找到.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> 
 
發現eclipse導入包操作后,寫入了這行代碼
 
<classpathentry kind=”con” path=”org.eclipse.jdt.USER_LIBRARY/box2d”/>
 
這行代碼應該是eclipse內部識別的,並不會打包到模擬器上,所以運行到模擬器上找不到相應的jar包。
 
為了在android內部能找到jar包,於是在android項目內新建一個lib文件夾,將jar包放在lib文件夾內。
並將上面的那行代碼刪除,添加一行代碼:
 
<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項目,會發現項目bin目錄的APK文件大小增大,說明APK文件已經包含jar包文件,重新clean項目並運行即可。
 
 





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM