我正在使用AndroidStudio,我想坚持使用它,因为它是官方IDE。
我想做的就是能够在Scala中编写一些类,对我来说听起来很合理。
然而,我在网上找到的所有内容都是使用SBT(+ Android插件和构思插件)创建新项目然后在AndroidStudio中加载它的方法。当然,我必须处理所有奇怪的错误等,直到我最终编译并在模拟器上运行。但后来我尝试添加一个片段抽屉,然后又遇到问题,因为我需要添加一些额外的Android库,我不知道这样做。
理智的方法应该是使用AndroidStudio(因为它是官方IDE)并且能够以某种方式添加Scala文件然后被编译成java字节码然后被Android编译器视为普通Java代码。有没有办法做到这一点?
答案 0 :(得分:1)
我使用Scala和Gradle(是的,我知道Gradle是用Groovy编写的)。最初设置起来很痛苦,但我非常喜欢Scala,所以值得。
要做到这一点,你需要依赖一个groovy插件。这是你做的:
1。将classpath "jp.leafytree.gradle:gradle-android-scala-plugin:1.3.1"
添加到您的顶级gradle文件中(也可以解决proguard的问题):
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"或者"穿",等级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文件 - 你将要改变它"保持公共类"顶部的行与您的项目域匹配:
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,它应该可以正常工作。