1

我知道我的源代码在 Eclipse 中编译得很好,但是为了更容易地一次又一次地使用相同的源代码进行生产,我选择设置一个 .bat 来为我处理大部分工作。好吧,简短而甜蜜,我的外部 jar 在编译时可用,但在运行时不可用,我收到强制关闭(Android ClassNotFoundDefError)。我确定问题出在我的命令是如何在我的 .bat 文件上设置的,并且在阅读了网站之后(我将列出我最后使用的一组参考资料)我来到了这段代码......

echo on
@REM %1 NOTUSED
@REM %2 SHORT NAME (DIR HIERARCHY POINTER)
@REM %3 SRCPATH (RECEIVES PACKAGE PATH)
@SET PREV_PATH=%CD%
@cd /d %0\..

@rmdir %2\bin /S /Q
@rmdir %2\gen /S /Q
@mkdir %2\bin || goto EXIT
@mkdir %2\gen || goto EXIT
@SET APP_NAME=%2
@SET ANDROID_REV=android-7

@SET ANDROID_AAPT_ADD="%ANDROID-SDK%\platform-tools\aapt.exe" add

@SET ANDROID_AAPT_PACK="%ANDROID-SDK%\platform-tools\aapt.exe" package -v -f -I "%ANDROID-SDK%\platforms\%ANDROID_REV%\android.jar" -j ".\usrsrc\libs\MobileSDK.jar" -j ".\usrsrc\libs\MobileSDK2.jar"

@SET ANDROID_DX="%ANDROID-SDK%\platform-tools\dx.bat" --dex

@SET JAVAC="%JAVABIN%\javac.exe" -classpath ".\%2;%ANDROID-SDK%\platforms\%ANDROID_REV%\android.jar;%2\libs\MobileSDK.jar;%2\libs\MobileSDK2.jar"

@SET JAVAC_BUILD=%JAVAC% -sourcepath "%2\src;%2\gen" -d "%2\bin" -jar "%2\libs\MobileSDK.jar;%2\libs\MobileSDK2.jar"

call %ANDROID_AAPT_PACK% -M "%2\AndroidManifest.xml" -A "%2\assets" -S "%2\res" -m -J "%2\gen" -F "%2\bin\resources.ap_" -j "%2\libs\MobileSDK.jar" -j "%2\libs\MobileSDK2.jar" || goto EXIT

call %JAVAC_BUILD% %2%3*.java || goto EXIT

call %ANDROID_DX% --output="%CD%\%2\bin\classes.dex" %CD%\%2\bin || goto EXIT

copy "%CD%\%2\bin\resources.ap_" "%CD%\%2\bin\%APP_NAME%.ap_" || goto EXIT

call %ANDROID_AAPT_ADD% "%CD%\%2\bin\%APP_NAME%.ap_" "%CD%\%2\bin\classes.dex" || goto EXIT

call "%JAVABIN%\jarsigner" -keystore "%CD%\keystore.keystore" -storepass "XXXXXXXXXX" - keypass "XXXXXXXX" -signedjar "%CD%\%2\%APP_NAME%.apk" "%CD%\%2\bin\%APP_NAME%.ap_" "XXXXXXXXX" || goto EXIT
del "%2\bin\%APP_NAME%.ap_"
:EXIT
cd "%PREV_PATH%"
ENDLOCAL
pause
exit /b %ERRORLEVEL%

现在我知道,每当有人向我展示答案是多么痛苦显而易见时,我都会感到非常愚蠢。但是我已经在这件事上坚持了大约 24 小时了,我再也受不了了。我将不胜感激任何帮助。

仅供参考:输入这个 bat 的大多数变量都是从另一个程序输入的,该程序在我们进入 .bat 之前设置文件层次结构和其他所有内容。这就是我能真正描述的关于这个问题的全部内容。

参考:
http ://www.herongyang.com/Android/Project-aapt-Android-Asset-Packaging-Tool.html
http://www.apriorit.com/our-company/dev-blog/233-how-to -build-apk-file-from-command-line
以及有关外部 jar 堆栈溢出的所有问题;还有一些;我目前找不到会像我一样更新。

4

1 回答 1

0

因为不像某些人;我确实想提供帮助,并且过去曾收到过潜伏堆栈溢出的答案,在我研究了答案后我回来了,因为我在堆栈溢出中多次看到这个问题,没有人对此给出正确答案:

“您必须在 dx.bat 中明确调用您的外部 jars”

call %ANDROID_DX% --output="%CD%\%2\bin\classes.dex" "%CD%\%2\bin" "C:\<dir>\mobileSDK.jar" "C:\<dir>\MobileSDK2.jar" || goto EXIT

为了符合“java标准”,您必须提供一个没有空格的静态地址(请参阅我上面的问题参考资料)。这告诉 Android 构建内容将这两个 jar 包作为编译代码包含在内。


对他们的第一次召唤

@SET ANDROID_AAPT_PACK="%ANDROID-SDK%\platform-tools\aapt.exe" package -v -f -I "%ANDROID-SDK%\platforms\%ANDROID_REV%\android.jar" -j ".\usrsrc\libs\MobileSDK.jar" -j ".\usrsrc\libs\MobileSDK2.jar"

对他们来说是唯一的,在 compileTime 期间是明显的,并且有可供编译器使用的类,以避免由于缺少更好的术语而引发错误。
将它们包含在 dx.bat 中也会告诉它在将其压缩成 APK 时包含这些 .jar 以及所有 .class 文件。但我希望这对将来的某人有所帮助。

于 2013-03-18T15:33:36.653 回答