【发布时间】:2011-03-14 03:46:27
【问题描述】:
我正在尝试构建一个具有一些依赖项的 Android 项目。 jar 文件位于 lib/ 目录中。我可以通过将这些 jar 文件添加到我的类路径来构建项目,但当然它会在模拟器中强制关闭,因为这些库不存在。
我正在使用 ant 从命令行执行此操作(not 在 eclipse 中)。我怎样才能让它在命令行中将这些库包含在 apk 中?
【问题讨论】:
我正在尝试构建一个具有一些依赖项的 Android 项目。 jar 文件位于 lib/ 目录中。我可以通过将这些 jar 文件添加到我的类路径来构建项目,但当然它会在模拟器中强制关闭,因为这些库不存在。
我正在使用 ant 从命令行执行此操作(not 在 eclipse 中)。我怎样才能让它在命令行中将这些库包含在 apk 中?
【问题讨论】:
在编译时这样做:
javac -encoding ascii -target 1.5 -d bin/classes \
-bootclasspath $SDKDIR/android.jar src/some/project/* -classpath=libs/*.jar
并且,当您为 Dalvik 生成字节码时:
dx --dex --output=bin/classes.dex bin/classes libs/*.jar
另外,在打包 APK 文件时:
apkbuilder bin/something.apk -z bin/projectname.ap_ \
-f bin/classes.dex -rf src -rj libs
我假设您使用的是 Linux...在 Windows 上几乎是一样的。
【讨论】:
回答我自己的问题:
我创建了一个文件“build.properties”并添加了这一行
external.libs.dir=lib
这是一个幸运的猜测,真的。
【讨论】:
在撰写本文时,Jay K 的回答是正确的,但现在 SDK 发生了变化,这是新的方法:
将以下行添加到ant.properties:
jar.libs.dir=lib
经过测试,可在 external.libs.dir 不工作的地方工作。
这改变了in December 2010,然后在 2011 年 10 月再次改变。
【讨论】:
external.libs.dir=lib
在搜索此答案 2 小时后,这对我有用。我的 libs 目录中的 jar 文件最终编译并与 APK 捆绑在一起。
【讨论】:
如果您将库存储在 ${basedir}/libs 中,则 ant 脚本将能够找到它们。
我查看了当前的 ant 脚本 ( ${sdk.dir}/tools/ant/build.xml ),它将 jar.libs.dir 定义为“libs”。
仅供参考,ant 脚本有很好的文档记录,因此很容易追踪。
如果您移动库,请务必编辑您的 .classpath 文件,以防止 Eclipse 用户遭受不必要的痛苦。
【讨论】:
将 jars 放入${YOUR_PROJECT}/libs 目录
【讨论】:
jar.libs.dir 属性是一个单个 目录。它不像是冒号/分号分隔列表的 CLASSPATH。在 jar.libs.dir 中有多个目录的方法是不直接设置它;让它默认为 libs 并转到 libs 并创建所需的软链接到您需要的 .jar 文件。
【讨论】:
仅供参考: 现在 SDK 中有一个错误会阻止使用 jar.libs.dir: http://code.google.com/p/android/issues/detail?id=33194
再次使用 jar.libs.dir 的简单解决方案(在等待错误修复时)是在 build.xml 文件中添加此目标:
<target name="-pre-compile">
<path id="project.all.jars.path">
<path path="${toString:project.all.jars.path}"/>
<fileset dir="${jar.libs.dir}">
<include name="*.jar"/>
</fileset>
</path>
</target>
【讨论】:
上面的例子并不完全正确。您不能覆盖 project.all.jars.path 内联。以下是一个工作示例:
<target name="-pre-compile">
<!-- HACK to add the android-support-v4.jar to the classpath directly from the SDK -->
<echo>ORIGINAL jars.path : ${toString:project.all.jars.path}</echo>
<path id="project.all.jars.path.hacked">
<path path="${toString:project.all.jars.path}"/>
<path path="${sdk.dir}/extras/android/support/v4/android-support-v4.jar"/>
</path>
<path id="project.all.jars.path">
<path path="${toString:project.all.jars.path.hacked}"/>
</path>
<echo>HACKED jars.path : ${toString:project.all.jars.path}</echo>
</target>
【讨论】: