昨日、アプリの 1 つの新しいバージョンをデプロイしました。今朝、マーケット ダッシュボードでいくつかの ClassCastExceptions が報告されました。私のJavaコードがfindViewByIdを使用して、ボタンにキャストしていた要素を取得していたため、例外が発生していました。取得された要素が実際には LinearLayout であったため、これは例外を発生させていました。これをトラブルシューティングするために、Eclipse から生成された最新の R ファイルのコピーを取得し、テキスト ファイルに保存しました。私はプロジェクトをきれいにし、R の新しいコピーを取り、それらを比較しました。一部のウィジェットに関連付けられた ID は、実際には異なっていました。ボタンの ID は、LinearLayout の ID でした。このクリーンなプロジェクトを本番環境にデプロイすると、この問題が修正されると思います。私の質問は、R ファイルと xml の間のこの切断により、私のコードはどのようにローカルで実行されたのでしょうか? 展開する前に、将来必ずクリーンを実行するようにしますが、これはバグのようです。
1 に答える
私の質問は、R ファイルと xml の間のこの切断により、私のコードはどのようにローカルで実行されたのでしょうか?
あなたの問題は、「Rファイルとxmlの間の切断」ではありませんでした。
あなたの問題は、「Rファイル」と残りのコードとの間の切断にありました。
の値はR.java
static final とマークされています。したがって、実際の数値は、それらの値を参照するクラスのバイトコードにインライン化されます。Android がファイルを更新しても、古いファイルR.java
を参照していたプロジェクト内のプリコンパイル済みクラスが消去されないことがあります。R.java
で変更された値は、R.java
以前にコンパイルされたクラスと同期しなくなります。ClassCastException
それらがどれであるかに応じて、呼び出しの結果など、さまざまな種類のエラーが発生しfindViewById()
ます。
ローカルで実行できた方法に関しては、唯一の答えは、アップロードしたものとは異なる APK を実行していたことです。
展開する前に、将来必ずクリーンを実行します
これは素晴らしいアイデアです。実稼働 APK 生成用にコマンドライン ビルドを実行することを選択した場合はclean
、ant ターゲット リストに追加するだけです。
しかし、これはバグのようです
これは確かに、ビルド ツールの厄介な制限です。これは、コマンドライン ビルド プロセスにも影響することに注意してください。Eclipse を使用していなかった平穏な時代に戻って、私はclean
すべてのビルドで を実行していました (最近ではant clean debug install
.