Плагин sbt android включает задачу ProGuard, которая удаляет весь неиспользуемый код. Очень классные вещи, которые помогают действительно уменьшить размер получаемого файла .apk, но, к сожалению, методы обратного вызова обычно не упоминаются в вашем коде, поэтому, по умолчанию, ProGuard выбросит их.
Чтобы увидеть это сами, попробуйте использовать javap для класса MainActivity, но установите для classpath значение target / your_scala_version / classes.min.jar.
Вы должны сказать proguard, что явно хранить. В настройках по умолчанию для плагина sbt android уже есть набор параметров -keep, но это относится к вашему проекту, поэтому вам придется отредактировать определение проекта в project / build / YourProjectName.scala. Посмотрите на код sbt android plugin и lok для определения proguardTask. Вам придется переопределить это и добавить дополнительные опции -keep. Вот что я сделал:
import sbt._
import java.io._
import proguard.{Configuration=>ProGuardConfiguration, ProGuard, ConfigurationParser}
import sbt._
import Process._
trait Defaults {
def androidPlatformName = "android-1.6"
}
class TestAndro2(info: ProjectInfo) extends ParentProject(info) {
override def shouldCheckOutputDirectories = false
override def updateAction = task { None }
lazy val main = project(".", "testAndro2", new MainProject(_))
class MainProject(info: ProjectInfo) extends AndroidProject(info) with Defaults {
val scalatest = "org.scalatest" % "scalatest" % "1.0" % "test"
override def proguardTask = task {
val args = "-injars" :: mainCompilePath.absolutePath+File.pathSeparator+
scalaLibraryJar.getAbsolutePath+"(!META-INF/MANIFEST.MF,!library.properties)"+
(if (!proguardInJars.getPaths.isEmpty) File.pathSeparator+proguardInJars.getPaths.map(_+"(!META-INF/MANIFEST.MF)").mkString(File.pathSeparator) else "") ::
"-outjars" :: classesMinJarPath.absolutePath ::
"-libraryjars" :: libraryJarPath.getPaths.mkString(File.pathSeparator) ::
"-dontwarn" :: "-dontoptimize" :: "-dontobfuscate" ::
"-dontwarn" :: "-dontoptimize" :: "-dontobfuscate" :: "-printseeds" ::
"""-keep public class com.test.android.MainActivity {
public void calculate(android.view.View);
}""" ::
"-keep public class * extends android.app.Activity" ::
"-keep public class * extends android.app.Service" ::
"-keep public class * extends android.appwidget.AppWidgetProvider" ::
"-keep public class * implements junit.framework.Test { public void test*(); }" :: proguardOption :: Nil
val config = new ProGuardConfiguration
new ConfigurationParser(args.toArray[String], info.projectPath.asFile).parse(config)
new ProGuard(config).execute
None
}
}
}
Essentially
, я добавил опцию -printseeds и one -keep, чтобы сохранить метод Calculate () функции MainActivity. -printseeds хорош для отладки, так как он сообщает proguard выводить имена сохраненных классов и методов.
ProGuard имеет огромный набор параметров конфигурации, и вам нужно будет следить за ними при создании проекта, так как есть много неоднозначных ситуаций, когда ProGuard не будет делать правильные вещи по умолчанию.