カスタム コレクションを実装しようとしているので、この投稿をフォローしています。
さて、クラッシュにつながる「裸の」コードは次のとおりです。
object TraversableCollection extends TraversableFactory[TraversableCollection] {
implicit def canBuildFrom[T] : CanBuildFrom[Coll, T, TraversableCollection[T]] = new GenericCanBuildFrom[T]
def newBuilder[T] = new ListBuffer[T].mapResult(x => new TraversableCollection(x:_*))
}
class TraversableCollection[T](seq : T*) extends Traversable[T]
with GenericTraversableTemplate[T, TraversableCollection]
with TraversableLike[T, TraversableCollection[T]] {
override def companion = TraversableCollection
def foreach[U](f: T => U) = seq.foreach(f)
}
私の実装全体はそれほど複雑ではありませんVector
。アイテムを前後に移動できるイミュータブルをラップし、インデックス値を内部に保存し、「現在の」アイテムを公開するコレクションにすぎません。つまり、本質的には双方向イテレータです。
とにかく、実装全体 (上記のスケルトンと私の完全な実装の両方) は REPL で問題なく動作します (完全な実装はこちら):
scala> val vec = Vector("Just", "testing", "it")
vec: scala.collection.immutable.Vector[String] = Vector(Just, testing, it)
scala> val t = new TraversableCollection(vec:_*)
t: TraversableCollection[String] = (Just, testing, it)
scala> t.current
res6: String = Just
scala> t.moveForward(2)
scala> t.current
res8: String = it
scala> t.moveBack(1)
scala> t.current
res10: String = testing
シンプルで必要です。ただし、問題は次のとおりです。Android アプリでは、コレクションが作成された時点でPathClassLoader
クラッシュし始め、次のようになります。
this: NoClassDefFoundError
detailMessage: "scala.collection.generic.TraversableFactory"
ログでこれで死ぬ:
05-16 12:14:35.056: E/AndroidRuntime(575): java.lang.VerifyError: my.package.data.TraversableCollection
なんで?私にできることはありますか?
GenericTraversableTemplate
ここでの一時的な解決策は、 andを削除し、特性TraversableLike
を残すことです。Traversable
完璧ではありませんが、今のところうまくいくでしょう。
設定:
ADT の Eclipse、Scala IDE プラグイン + AndroidProguardScala プラグイン
スカラ 2.10.0-2012-12-05
[編集] プロガード関連
Proguard に関する私の非常に限られた知識から、パスが でコメントアウトされているため、無効にする必要があるようですproject.properties
。
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
これをproguard-project.txtに追加するとともに、行にコメントを付けてコメントを外してみました:
-keepnames scala.collection.generic.TraversableFactory
何があっても同じエラーが発生します。
[EDIT 2] まだ Proguard 関連
AndroidProguardScala が生成する (アプリがクラッシュしたときに使用される) デフォルトの構成は次のとおりです。
-injars "F:\adt-bundle-windows-x86_64\eclipse\configuration\org.eclipse.osgi\bundles\373\1\.cp\lib\scala-library.jar"(!META-INF/MANIFEST.MF)
-injars "F:\adt-bundle-windows-x86_64\eclipse\configuration\org.eclipse.osgi\bundles\373\1\.cp\lib\scala-actors.jar"(!META-INF/MANIFEST.MF)
-injars "F:\adt-bundle-windows-x86_64\eclipse\configuration\org.eclipse.osgi\bundles\372\1\.cp\lib\scala-reflect.jar"(!META-INF/MANIFEST.MF)
-outjars "F:\Projects\AndroidScalaProject\proguard_cache\jartender_cache_7212076580182750151.jar"
-injars "F:\Projects\AndroidScalaProject\bin\classes"
-libraryjars "F:\adt-bundle-windows-x86_64\sdk\platforms\android-17\android.jar"
-libraryjars "F:\Projects\AndroidScalaProject\libs\android-support-v4.jar"
-keep public class * extends android.**
-dontwarn **$$anonfun$*
-dontwarn
-dontoptimize
-dontobfuscate
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-ignorewarnings
-forceprocessing
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-keep public class scala.ScalaObject { *; }
-keep public class scala.Function0, scala.Function1
# Fix for https://issues.scala-lang.org/browse/SI-5397
-keep class scala.collection.SeqLike {
public protected *;
}
# AndroidProguardScala version: 0.0.47.201302150529
-keep class ...
-keep class ... # and a looot of that for anon-functions and classes in the project.
# Here's one that's interesting:
-keep class my.project.data.TraversableCollection {*;}