2

カスタム コレクションを実装しようとしているので、この投稿をフォローしています。

さて、クラッシュにつながる「裸の」コードは次のとおりです。

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 {*;}
4

0 に答える 0