android - 我可以在 Scala 中编写一些代码(使用 Android Studio)吗?

标签 android scala android-studio

我正在使用 AndroidStudio,我想坚持使用它,因为它是官方的 IDE。

我只想用 Scala 编写一些类,这对我来说很合理。

但是,我在网上只能找到一种使用 SBT(+ Android 插件和 idea 插件)创建新项目然后将其加载到 AndroidStudio 的方法。当然,我不得不处理所有奇怪的错误等等,直到我最终让它在模拟器上编译运行。但是后来我尝试添加一个 fragment 抽屉,但又遇到了问题,因为我需要添加一些额外的 Android 库,但我不知道该怎么做。

理智的方法应该是按原样使用 AndroidStudio(因为它是官方 IDE)并能够以某种方式添加 Scala 文件,然后将其编译成 java 字节码,然后像普通 Java 代码一样被 Android 编译器处理。有办法吗?

最佳答案

我使用 Scala 和 Gradle(是的,我知道 Gradle 是用 Groovy 编写的)。一开始设置起来很痛苦,但我非常喜欢 Scala,所以这是值得的。

要做到这一点,您需要依赖一个 groovy 插件。这是您要做的:

1.classpath "jp.leafytree.gradle:gradle-android-scala-plugin:1.3.1" 添加到您的顶级 gradle 文件中,如下所示(也可以解决混淆器的问题):

build.gradle(顶级):

    buildscript {
        repositories {
           mavenLocal()  // Remove this if your repository is not local
           jcenter()
       }

       dependencies {
          classpath "com.android.tools.build:gradle:1.0.0"
          classpath "jp.leafytree.gradle:gradle-android-scala-plugin:1.3.1"

          // Default version of proguard v4.8 (?) and v5.1 fail with ArrayIndexOutOfBoundsException: 4
          classpath ('net.sf.proguard:proguard-gradle:5.0') {
             force = true
          }

          ...

2. 应用您的插件并在模块中设置 Scala 依赖项,例如“app”或“wear”,级别 gradle 文件:

build.gradle(模块级):

    ...
    apply plugin: "jp.leafytree.android-scala"
    android {
    ...

        buildTypes {
            release {
                debuggable false
                minifyEnabled true
    ...
            debug {
                debuggable true
                minifyEnabled true
    ...
    }

    dependencies {
    ...
        compile 'org.scala-lang:scala-library:2.11.4'
    }

3. 确保您使用的是 Proguard(Scala 代码必须精简才能与 Android 一起使用)。这是我使用的主要 proguard 文件——您需要更改顶部的“保持公共(public)类”行以匹配您的项目域:

proguard-rules.pro:

-dontpreverify
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontusemixedcaseclassnames

# ----
-dontoptimize
# ----


-keep public class com.keithpinson.** { public protected *; }

##
## SCALA SETTINGS
##
-dontwarn scala.**
-dontnote scala.Enumeration
-ignorewarnings

# temporary workaround; see Scala issue SI-5397
-keep class scala.collection.SeqLike {
    public protected *;
}

-keep class scala.math.ordering { *; }
-keep class scala.Function1 { *; }
-keep class scala.Function2 { *; }




##
## ANDROID SETTINGS
##
-keep class android.support.v13.** { *; }
-keep interface android.support.v13.** { *; }

-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}


# Joda Time 2.3
-keep class org.joda.time.** { *; }
-keep interface org.joda.time.** { *; }

如果我没有忘记什么,Gradle 正在下载 leafytree 插件,如果您有正确版本的 Scala 和 Android,它应该可以正常工作。

关于android - 我可以在 Scala 中编写一些代码(使用 Android Studio)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28867573/

相关文章:

java - 在Android中实现类似bucket的方法

database - 会简化插入到具有自动生成的主键的表吗?

unit-testing - Scala 测试模拟隐式参数?

java - 从 GZIPInputStream 读取大量字节

安卓显示器: when i try to take a screenshot i receive Screenshot Unsupported protocol: 2

java - Android Studio 数组值到 TextView

android - 我无法在我的 Android 项目 Android Studio 3.1.3 中使用 volley 库

Android GridLayout 行索引

android - 从 Android 中的 GCM 推送通知获取当前上下文

android - 如何为安卓创建apk文件?