我正在使用 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/