如何在android

时间:2015-05-21 02:15:29

标签: android scala gradle

我们有一堆业务对象建模为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代码

2 个答案:

答案 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