0

我有一个root带有actionbarsherlock子项目的 sbt 项目,我无法将其打包到 apk 中。

我能够成功构建这两个项目,但是当我运行时,我从 actionbarsherlock 中的类被 dex'd 两次android:package的任务中得到错误:root/android:dex

Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/actionbarsherlock/ActionBarSherlock$Implementation;

我跑了last root/android:dex,发现它既包括intermediates/class.jar根项目也包括子项目:

.../actionbarsherlock/bin/intermediates/classes.jar,
.../bin/intermediates/classes.jar

这解释了 dex 错误,但我不知道如何更改构建以避免这种情况。

我能够在一个更简单的项目上复制这个问题,其中根项目没有源代码和一个简单的构建配置,例如:

// build.sbt for root
androidBuild

javacOptions in Compile ++= "-source" :: "1.7" :: "-target" :: "1.7" :: Nil

lazy val root = project.in(file(".")).dependsOn(abs)

lazy val abs = project.in(file("actionbarsherlock"))

和:

// build.sbt for subproject
androidBuild

javacOptions in Compile ++= "-source" :: "1.7" :: "-target" :: "1.7" :: Nil

libraryDependencies ++= Seq(
  "com.android.support" % "support-v4" % "18.0.0"
)

这两个项目都有project/build.properties

sbt.version=0.13.9

project/plugins.sbt

addSbtPlugin("org.scala-android" % "sbt-android" % "1.6.0")

文件层次结构如下所示:

.
├── actionbarsherlock
│   ├── AndroidManifest.xml
│   ├── build.sbt
│   ├── lint.xml
│   ├── project
│   │   ├── build.properties
│   │   └── plugins.sbt
│   ├── project.properties
│   ├── README.md
│   ├── res
│       ├── ...
│   ├── src
│   │   ├── ...
│   └── test
│       └── ...
├── AndroidManifest.xml
├── build.sbt
├── lint.xml
├── proguard-project.txt
├── project
│   ├── build.properties
│   └── plugins.sbt
├── project.properties
├── README.MD
├── res
│   ├── ...
├── src

我在 sbt 上使用干净结账的典型流程是:

project abs
compile
project root
compile
android:package

提前致谢!

4

1 回答 1

0

删除对 actionbarsherlock 的引用project.properties。actionbarsherlock 项目是自动构建的,因为它位于 中project.properties,它是重复的,因为您添加了手动子项目。

如果您从未在 actionbarsherlock 项目中设置所有 sbt 项目内容,那么一切都会正常工作。鉴于您确实设置了它,您没有正确使用androidBuildWith依赖项目的功能。从根项目中删除该androidBuild行并将根项目中的行更改为project.in(file(".")).androidBuildWith(abs)

另外,考虑使用 actionbarsherlock apklib 而不是子项目。最重要的是,完全远离 actionbarsherlock。

此外,您只需sbt android:package从干净的构建运行即可完全构建。不需要所有这些步骤。

于 2016-04-29T03:52:43.867 回答