35

公開した Android アプリの Crittercism (クラッシュ レポート サービス) でいくつかのエラーが表示されます。トレースは次のとおりです。

0   java.io.IOException: Resource not found: "org/joda/time/tz/data/ZoneInfoMap" ClassLoader: dalvik.system.PathClassLoader@45908320
1    at org.joda.time.tz.ZoneInfoProvider.openResource(ZoneInfoProvider.java:211)
2    at org.joda.time.tz.ZoneInfoProvider.<init>(ZoneInfoProvider.java:123)
3    at org.joda.time.tz.ZoneInfoProvider.<init>(ZoneInfoProvider.java:82)
4    at org.joda.time.DateTimeZone.getDefaultProvider(DateTimeZone.java:462)
5    at org.joda.time.DateTimeZone.setProvider0(DateTimeZone.java:416)
6    at org.joda.time.DateTimeZone.<clinit>(DateTimeZone.java:115)
7    at org.joda.time.chrono.GregorianChronology.<clinit>(GregorianChronology.java:71)
8    at org.joda.time.chrono.ISOChronology.<clinit>(ISOChronology.java:66)
9    at org.joda.time.base.BaseDateTime.<init>(BaseDateTime.java:61)
10   at org.joda.time.DateTime.<init>(DateTime.java:155)

検索すると、これは通常コンパイルの問題であることがわかります (通常、Joda Time Library がビルド パスなどに追加されていないことが原因です)。

私の唯一の推測では、誰かがアプリを逆コンパイルして海賊版を作成しようとしており (かなり人気のある有料アプリです)、誤って再コンパイルするとこのエラーが表示されます。その場合、エラーが表示されていることをうれしく思います。これについて心配する必要はありません。

もう 1 つの奇妙な点は、問題の原因となっているコードが try/catch で囲まれていて、それをキャッチしていないように見えることです。

try {
    DateTime dt = new DateTime();
    DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
    return fmt.print(dt);
} catch (Exception e) {
    //Report issue to Analytics service
} 

私には、このエラーがキャッチされるはずだったので、Crittercism でこのエラーが表示される可能性はさらに低いように思えます。誰でもこれを説明できますか?

4

3 に答える 3

0

人気のある無料アプリから同様の報告がまれに見られます。今のところ再現していません。この問題に関するさまざまな 言及がウェブ上に散らばっていますが、すべてが Android に関係しているわけではありません。

1 つの手がかり: ZoneInfoMap は、クラスではなく、元の jar 内のリソース ファイルです。したがって、さまざまなアプリ マーケットのいずれかがクラス以外の情報を取り除いている場合 (たとえば、unjar してから re-jar する)、ZoneInfoMap が候補になります。同様に、クラスローダ ユーティリティにクラス以外のリソースに関するセキュリティまたは愚かさの問題がある場合、ZoneInfoMap が候補になります。

別の角度: 問題のあるランタイム環境は、/data/ セグメントがないクラスパスの前に独自の joda-time jar を持っている可能性がありますか?

結論: これは Android のワイルド ウェストの別の例のように思えます。これは、再現が見つかるまで無視することを学んだものです。

于 2014-01-29T23:54:27.250 に答える
0

私は同じ問題を抱えていましたが、Googleで検索をかなり掘り下げた後、それを理解しました。ZoneInfoMap ファイルは、次の引数を指定して jodaTime (ZoneInfoCompiler) を実行することによって作成されます。

    -dst src\org\joda\time\tz\data src\org\joda\time\tz\src\africa 
src\org\joda\time\tz\src\antarctica src\org\joda\time\tz\src\asia 
src\org\joda\time\tz\src\australasia src\org\joda\time\tz\src\backward 
src\org\joda\time\tz\src\etcetera src\org\joda\time\tz\src\europe 
src\org\joda\time\tz\src\northamerica src\org\joda\time\tz\src\pacificnew 
src\org\joda\time\tz\src\southamerica src\org\joda\time\tz\src\systemv

これにより、すべてのタイムゾーンがjodaTimerに追加されます。方法がわかれば、タイムゾーンエリアをさらに作成できます。すべてが必要ない場合は、すべてを含める必要はありません。

そのエラーでクラッシュするのは、そこにないファイルを探しているためです。なぜtry catchが機能しないのか正確にはわかりませんが、jodaTimerがJARライブラリであるという事実と関係があると思われます(少なくとも私のものはそうでした)?

これが意図された方法なのか、それともより良い解決策があるのか​​ はわかりませんが、それが私がやったことであり、今では完全に機能しています。

m がこの結論に達するのを助けた参照: http://joda-interest.219941.n2.nabble.com/How-to-run-Joda-time-s-test-Resource-Not-Found-exception-td5913668.html http://sourceforge.net/p/joda-time/discussion/337835/thread/2798a578/

これが役立つことを願っています。

于 2015-05-12T13:47:16.143 に答える