我们有一堆业务对象建模为Scala案例类。我非常希望在Android应用程序中使用这些类来避免重复。
当我将包含我们的类的工件发布到我们的存储库并使用Gradle导入到android时,我得到以下异常:
com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
我认为这是因为该项目现在超过了dex的65k方法限制。为了清楚起见,项目只将我们的案例类作为依赖项。根据.pom,我们的case类的传递依赖性如下所示:
<dependencies>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>2.11.1</version>
</dependency>
<dependency>
<groupId>org.scalatestplus</groupId>
<artifactId>play_2.11</artifactId>
<version>1.2.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.7</version>
</dependency>
</dependencies>
我在gradle中排除了scalatest所以我的gradle依赖项看起来像这样:
compile - Classpath for compiling the main sources.
+--- com.android.support:appcompat-v7:21.0.3
| \--- com.android.support:support-v4:21.0.3
| \--- com.android.support:support-annotations:21.0.3
\--- ourcompany:ourscalacaseclasses_2.11:1.2.22
+--- org.scala-lang:scala-library:2.11.1
\--- joda-time:joda-time:2.7
所以在我看来,问题是gradle正在拉动所有scala lang以便使用这些类,这导致dex变得非常庞大。
有没有办法在android中使用Scala类而不用:
A:走多路dex路线
B:使用scaloid或以其他方式重写Scala中的所有android代码
答案 0 :(得分:0)
有一些非常酷的开源库可以做到这一点。请查看 Scaloid
https://github.com/pocorall/scaloid
Scaloid是一个简化Android代码的库。它通过利用Scala语言使您的代码易于理解和维护。
例如,代码块如下所示:
val button = new Button(context)
button.setText("Greet")
button.setOnClickListener(new OnClickListener() {
def onClick(v: View) {
Toast.makeText(context, "Hello!", Toast.LENGTH_SHORT).show()
}
})
layout.addView(button)
简化为:
SButton("Greet", toast("Hello!"))
答案 1 :(得分:0)
我认识的唯一一个来自“65k限制”的药丸是Proguard。为Android和Scala like that one创建proguard文件,并用它提供您喜欢的IDE。
但如果您打算在Scala中开发Android,我建议使用IntelliJ + Sbt + Android-sdk-plugin