問題の発生
カスタムApplicationクラスでログ出力を実装したところ、Logcatに全く表示されない事象が発生しました。以下のようなシンプルなコードです。
public class AppInitializer extends Application {
@Override
public void onCreate() {
super.onCreate();
Log.i("AppInit", "初期化開始");
}
}
実際にはより詳細な情報を出力予定でしたが、一切表示されないため、まずはメソッドの実行確認を別アプローチで行いました。
public class AppInitializer extends Application {
@Override
public void onCreate() {
super.onCreate();
Log.i("AppInit", "初期化開始");
// 実行確認のため一時的にファイルに書き出し
try {
FileOutputStream fos = openFileOutput("debug.txt", MODE_PRIVATE);
fos.write("onCreate executed".getBytes());
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
ファイルには正常に書き込まれたため、onCreate()は確実に実行されています。しかしLogcatは空のままです。一方、Activity内のログは正常に表示されるため、Application固有の問題と推測しました。
原因特定のプロセス
Activity内で同じTAGを使用してテストしてみました。
class HomeScreen : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.screen_home)
Log.d("HomeScreen", "Activityログ")
Log.i("AppInit", "Applicationからの移植テスト")
}
}
このとき、"AppInit"でのログも表示されませんでした。これはTAG文字列自体に問題があることを示唆します。さらに検証のため、文字列のパターンを体系的に調査しました。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.screen_home)
val basePrefix = "LIB"
Log.w("TestRunner", "=== タグパターン検証開始 ===")
// 異なる文字種を付与してテスト
(33..126).forEach { asciiValue ->
val testPattern = basePrefix + asciiValue.toChar()
Log.i(testPattern, "パターンテスト: $testPattern")
}
}
この検証により、LIBで始まる特定のパターンでログがフィルタリングされることを発見しました。特にLIBに続く文字が特定の記号の場合に顕著でした。
最終的な調査結果
さらに詳細なテストを実施した結果、AndroidのLogcat実装において、LIBという3文字の接頭辞がシステムレベルのログフィルタと競合することが判明しました。回避策として以下のいずれかを推奨します。
// 解決策1: 接頭辞を変更
private static final String LOG_TAG = "MyAppInit";
// 解決策2: 大文字小文字を組み合わせる
private static final String LOG_TAG = "libSystem";
// 解決策3: 接尾辞を追加
private static final String LOG_TAG = "LIB-App";
この問題はAndroid SDKのバージョンや端末の製造元によって発生条件が異なるため、ログが表示されない場合はまずTAG文字列を疑うことが重要です。