- Date: Sun 18 03 2012
- Category: Android
- Response: Comment 1 Trackback 0
proguard.cfgでエラー:Obsolete proguard file...
Eclipseがアップデート要求するのでアップデートしたところまたもやエラー発生。
Obsolete proguard file; use -keepclasseswithmembers instead of -keepclasseswithmembernames proguard.cfg
proguard.cfg …?
たしかプロジェクトが自動生成してくれる、ソースを難読化するための定義が書かれたファイル。
自動生成してくれるファイルがいったい何を?と調べてみたところ…
参考サイト:Gamekozo's Library - Androidでapk出力エラー
どうやら Run Android Lint という機能が原因のようです。
Run Android Lint とは ADT 16 から導入された(表に出てきた)ソースチェックツールで、ソースコード上の潜在的な問題や、パフォーマンスに難のある箇所を指摘してくれます。
で、これが keepclasseswithmembernames は古いから keepclasseswithmembers を使えとエラーを出している様子。
指示通り修正すればいいのですが…
なんとなく怖かったので新プロジェクトを作成して proguard.cfg をコピーして対応しました。
これで無事動きました。
Eclipseを再起動したら再び同じエラーがでましたが [ウィンドウ(W)] - [Run Android Lint] を押したら直りました。
※この記事は [Android トラブルシューティング] に追加しました。
Obsolete proguard file; use -keepclasseswithmembers instead of -keepclasseswithmembernames proguard.cfg
proguard.cfg …?
たしかプロジェクトが自動生成してくれる、ソースを難読化するための定義が書かれたファイル。
自動生成してくれるファイルがいったい何を?と調べてみたところ…
参考サイト:Gamekozo's Library - Androidでapk出力エラー
どうやら Run Android Lint という機能が原因のようです。
Run Android Lint とは ADT 16 から導入された(表に出てきた)ソースチェックツールで、ソースコード上の潜在的な問題や、パフォーマンスに難のある箇所を指摘してくれます。
で、これが keepclasseswithmembernames は古いから keepclasseswithmembers を使えとエラーを出している様子。
指示通り修正すればいいのですが…
なんとなく怖かったので新プロジェクトを作成して proguard.cfg をコピーして対応しました。
これで無事動きました。
Eclipseを再起動したら再び同じエラーがでましたが [ウィンドウ(W)] - [Run Android Lint] を押したら直りました。
※この記事は [Android トラブルシューティング] に追加しました。
スポンサーサイト
日本Androidの会で質問した「例外発生時のアプリ終了について」をこちらに転載。
Androidというよりアプリ全般に言えることですが、アプリで例外が発生するとcatchされていなければアプリは強制終了されてしまいます。
この強制終了ですがアプリが完全に落ちて最初から始まる…というわけではありません。
例外が発生した時、アプリは終了されるためアクティビティは破棄されます。
が、アクティビティは一部を除いてスタックに残ったままとなっています。
そのため、スタックに詰まれたアクティビティが呼び出されてアプリが再開されたように見えます。
※アプリは1度終了しているのでファイルやDBに保存していない情報は破棄されています(static変数など)
さて先ほど一部を除いてと書きましたが、以下の2つのアクティビティはスタックから取り除かれます。
・例外が発生したアクティビティ
・そのアクティビティを呼び出したアクティビティ
例えばアクティビティA、B、C、D、Eとあるとします。
・スタックが A→B→C→D→E の時にEで例外が発生するとスタックは A→B→C となります。
・スタックが A→B→C→(D)→E でDをEへの遷移時に破棄してEで例外が発生するとスタックは同様に A→B→C になります。
この時アクティビティはCから始まるが、アクティビティは1度破棄されているためライフサイクルは onCreate() から始まります(他アクティビティから戻ると本来は onStart() から始まる)
CからBに戻るとBも onCreate() から始まります(Aも同様)
このように例外時には特殊な動きをするので、強制終了された時の処理を何か入れておくべきです。
一番良いのは、必要な情報は全てプリファレンスやDBに保存。
情報の取得は全てそこから行うようにし、どこから再開しても問題ないような作りにすることです。
とはいえ、終了したら必ず最初から始めたいという場合もあります。
その時は以下のような対応を行います。
・起動時にstatic変数に持たせたフラグをオンにする。
・例外で再開されたら、アクティビティはフラグを見てオフだったらアクティビティを閉じる。
これはあくまで一例ですので、他にもっと良い方法があると思います。
マニフェストファイルに1行追加するだけでこういうことやってくれたら嬉しいんですけどねえ…
Androidというよりアプリ全般に言えることですが、アプリで例外が発生するとcatchされていなければアプリは強制終了されてしまいます。
この強制終了ですがアプリが完全に落ちて最初から始まる…というわけではありません。
例外が発生した時、アプリは終了されるためアクティビティは破棄されます。
が、アクティビティは一部を除いてスタックに残ったままとなっています。
そのため、スタックに詰まれたアクティビティが呼び出されてアプリが再開されたように見えます。
※アプリは1度終了しているのでファイルやDBに保存していない情報は破棄されています(static変数など)
さて先ほど一部を除いてと書きましたが、以下の2つのアクティビティはスタックから取り除かれます。
・例外が発生したアクティビティ
・そのアクティビティを呼び出したアクティビティ
例えばアクティビティA、B、C、D、Eとあるとします。
・スタックが A→B→C→D→E の時にEで例外が発生するとスタックは A→B→C となります。
・スタックが A→B→C→(D)→E でDをEへの遷移時に破棄してEで例外が発生するとスタックは同様に A→B→C になります。
この時アクティビティはCから始まるが、アクティビティは1度破棄されているためライフサイクルは onCreate() から始まります(他アクティビティから戻ると本来は onStart() から始まる)
CからBに戻るとBも onCreate() から始まります(Aも同様)
このように例外時には特殊な動きをするので、強制終了された時の処理を何か入れておくべきです。
一番良いのは、必要な情報は全てプリファレンスやDBに保存。
情報の取得は全てそこから行うようにし、どこから再開しても問題ないような作りにすることです。
とはいえ、終了したら必ず最初から始めたいという場合もあります。
その時は以下のような対応を行います。
・起動時にstatic変数に持たせたフラグをオンにする。
・例外で再開されたら、アクティビティはフラグを見てオフだったらアクティビティを閉じる。
これはあくまで一例ですので、他にもっと良い方法があると思います。
マニフェストファイルに1行追加するだけでこういうことやってくれたら嬉しいんですけどねえ…