LoginSignup
4
6

More than 5 years have passed since last update.

Dalvikの警告ログ「Could not find class '〜', referenced from method 〜」を抑制する方法

Posted at

Androidのアプリケーションでは、存在しないクラスを参照するクラスをロードした際、次のような警告ログが出力されます:

E/dalvikvm( 4165):Could not find class 'com.example.spikeapp.library.optional.Optional', referenced from method com.example.spikeapp.library.Library.hoe
W/dalvikvm( 4165): VFY: unable to resolve new-instance 1020 (Lcom/example/spikeapp/library/optional/Optional;) in Lcom/example/spikeapp/library/Library;
D/dalvikvm( 4165): VFY: replacing opcode 0x22 at 0x0000
D/dalvikvm( 4165): DexOpt: unable to opt direct call 0x20f2 at 0x02 in Lcom/example/spikeapp/library/Library;.hoe

このログは例えば次のようなコードを実行すると出力されます:

MainActivity.java
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        new Library().say();
Library.java
public class Library {
    public void hoe() {
        new Optional(); // Optionalクラスはクラスパス上にない
    }

    public void say() {
        Log.d("spike", "hello!");
    }
}

Optionalクラスが存在しなくてもLibrary#say()の実行には影響がないため実行自体は意図通りに行なわれますが、もしログに余計な情報を出力させたくないのであれば、例えば次のように存在しないクラスを参照するコードを別クラスに分割して間接的に参照するようにすると良いでしょう:

MainActivity.java
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        new Library().say();
Library.java
public class Library {
public class Library {
    public void hoe() {
        new OptionalLibrary().hoe();  // Optionalクラスを直接参照しないようにする
    }

    public void say() {
        Log.d("spike", "hello!");
    }
}
OptionalLibrary.java
public class OptionalLibrary {
    public void hoe() {
        new Optional();
    }
}
4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6