#

Мы работаем в обычном режиме, несмотря на карантин!

Since 2008

#

Выводим данные в консоль без Root

Редакция Appfox

Редакция Appfox

Время чтения: 3 минуты

Всем доброго времени суток. Это статья будет о том, как проводить отладку приложения/игры на Android.

Альтернативные готовые решения:

  1. В Android SDK входит набор инструментов, предназначенных для отладки. Самый важный инструмент при отладке - это LogCat. Класс android.util.Log позволяет разбивать сообщения по категориям в зависимости от важности.
  2. Можно найти на Play Market много приложений для отлавливания логов, но 90% из них требуют Root права. Что есть не безопасно для нас.
#

Часто сам сталкивался с ситуацией, когда нужно было знать о состоянии приложения на данный момент, знать результат работы функций и результат условных операторов. Решений готовых особо не было. Поэтому, при отсутствии большого количества времени было принято решение, реализовать первую идею которая появилась в и без того уставшем от костылей мозгу.

Решение #1 (так делать не нужно)

Создаем на Canvas элемент Text. Растягиваем этот элемент по всей ширине экрана и в этот textbox будем выводить весь log. Данное решение в свое время мне было необходимо для отладки при интеграции рекламных сетей AdColony AppLovin.

Пример консоли был использован только в одном скрипте (AdsManager) и не требовал вызовов из вне. Так как сам скрипт имел singleton – Instance, то элемент Text в теории можно было вызвать из любого места. Но не стоит этого делать. Так как значение переменной Text может быть равно null.

#

Рис - 1. Создаем текстовый элемент

#

Рис - 2. Размещаем текстовый элемент

#

Рис - 3. Назначаем переменную скрипту в инспекторе

Пример кода

using UnityEngine;
using UnityEngine.UI;

public class AdsManager : MonoBehaviour {
  public static AdsManager Instance;

  void Awake() {
    Instance = this;
  }

  public Text consoleTxt;

  void Start () {
    consoleTxt.text = "";

    for (int i = 0; i < 10; i++) {
      LogToConsole(System.Math.Pow( Random.Range(0,1000),i));
    }
  }

  private void LogToConsole(object log) {
    consoleTxt.text += "\n" + log.ToString();
  }
}

#

Рис - 4. Результат работы

Вывод: решение не оптимальное. Нельзя видеть полный log, так как текстовое поле не бесконечно и всему есть предел. Вторая причина – это неудобный вывод и чтение лога. Конечно можно было бы подзаморочиться и сделать вывод скролящейся панели по нажатию кнопки, НО игра не стоит свеч.

Решение #2 (оптимальное)

Решение простое как божий день. Будем выводить в тестовый файл весь лог с пометками LOG ERROR WARNING. Файл можно найти по исходному пути приложения или же в Streaming Assets. Файл перезаписываем после каждого запуска приложения. Так же для удобства можно после записи выводить время с момента запуска приложения и до момента лога.

Путь к файлу на Android:

.../Android/data/com.YourCompany.ProjectName/files/log.txt

#

Рис - 5. Создаем папку StreamingAssets иначе в редакторе получим ошибку о отсутствии пути

Важно, для редактора и Android разные пути для записи файла.

#

Рис - 6. Результат работы для Win10

#

Рис -7. Результат работы для Android

Пример кода

using UnityEngine;
using System.IO;

public class AndroidLog : MonoBehaviour {
  static string pathFile = "";

  void Start () {
    #if UNITY_EDITOR
      pathFile = Application.dataPath + "/StreamingAssets//log.txt";
    #endif

    #if UNITY_ANDROID && !UNITY_EDITOR
      pathFile = Application.persistentDataPath+"//log.txt";
    #endif

    if (File.Exists(pathFile)) File.WriteAllText(pathFile, "LOG " + Application.productName);
      else File.Create(pathFile);
  }

  public static void LogComment(object str) {
    File.AppendAllText(pathFile,"\nLOG: " + str.ToString());
  }

  public static void LogError(object str) {
    File.AppendAllText(pathFile, "\nERROR: " + str.ToString());
  }

  public static void LogWarning(object str) {
    File.AppendAllText(pathFile,"\nWARNING: " + str.ToString());
  }
}

Вывод: Решение хорошо тем, что оно кросс платформенное.

Заметно улучшилось качество лога, удобность чтения и можно получить развернутый лог.