Android phiên bản 3 (Cũ) – Tổng quan

Hướng dẫn dành cho nhà phát triển này mô tả cách triển khai Trình quản lý thẻ của Google trong một ứng dụng di động.

Giới thiệu

Trình quản lý thẻ của Google cho phép nhà phát triển thay đổi các giá trị cấu hình trong ứng dụng di động của họ bằng giao diện Trình quản lý thẻ của Google mà không cần phải tạo lại và gửi lại các tệp nhị phân ứng dụng cho các trang web thương mại ứng dụng.

Điều này hữu ích cho việc quản lý mọi giá trị cấu hình hoặc cờ trong ứng dụng mà bạn có thể cần thay đổi trong tương lai, bao gồm:

  • Nhiều chế độ cài đặt giao diện người dùng và chuỗi hiển thị
  • Kích thước, vị trí hoặc loại quảng cáo được phân phát trong ứng dụng của bạn
  • Cài đặt trò chơi

Các giá trị cấu hình cũng có thể được đánh giá trong thời gian chạy bằng cách sử dụng các quy tắc, cho phép các cấu hình động như:

  • Sử dụng kích thước màn hình để xác định kích thước biểu ngữ quảng cáo
  • Sử dụng ngôn ngữ và vị trí để định cấu hình các phần tử trên giao diện người dùng

Trình quản lý thẻ của Google cũng cho phép triển khai linh hoạt các thẻ theo dõi và pixel trong ứng dụng. Nhà phát triển có thể đẩy các sự kiện quan trọng vào một lớp dữ liệu và quyết định sau này nên kích hoạt thẻ theo dõi hoặc pixel nào. TagManager hỗ trợ các thẻ sau:

  • Google Analytics cho ứng dụng di động
  • Thẻ Lệnh gọi hàm tuỳ chỉnh

Trước khi bạn bắt đầu

Trước khi sử dụng hướng dẫn bắt đầu này, bạn cần có những thứ sau:

Nếu mới sử dụng Trình quản lý thẻ của Google, bạn nên tìm hiểu thêm về vùng chứa, macro và quy tắc (Trung tâm trợ giúp) trước khi tiếp tục xem hướng dẫn này.

Bắt đầu

Phần này sẽ hướng dẫn nhà phát triển thực hiện một quy trình làm việc điển hình với Trình quản lý thẻ:

  1. Thêm SDK Trình quản lý thẻ của Google vào dự án của bạn
  2. Đặt giá trị mặc định cho vùng chứa
  3. Mở vùng chứa
  4. Nhận giá trị cấu hình từ vùng chứa
  5. Đẩy sự kiện vào DataLayer
  6. Xem trước và xuất bản vùng chứa

1. Thêm SDK Trình quản lý thẻ của Google vào dự án

Trước khi sử dụng SDK Trình quản lý thẻ của Google, bạn cần trích xuất gói SDK, thêm thư viện vào đường dẫn bản dựng của dự án và thêm các quyền vào tệp AndroidManifest.xml.

Trước tiên, hãy thêm thư viện Trình quản lý thẻ của Google vào thư mục /libs của dự án.

Tiếp theo, hãy cập nhật tệp AndroidManifest.xml để sử dụng các quyền sau:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

2. Thêm tệp vùng chứa mặc định vào dự án

Trình quản lý thẻ của Google sử dụng một vùng chứa mặc định trong lần chạy đầu tiên của ứng dụng. Vùng chứa mặc định sẽ được dùng cho đến khi ứng dụng có thể truy xuất một vùng chứa mới qua mạng.

Để tải xuống và thêm một tệp nhị phân vùng chứa mặc định vào ứng dụng, hãy làm theo các bước sau:

  1. Đăng nhập vào giao diện web của Trình quản lý thẻ của Google.
  2. Chọn Phiên bản của vùng chứa mà bạn muốn tải xuống.
  3. Nhấp vào nút Tải xuống để truy xuất tệp nhị phân của vùng chứa.
  4. Thêm tệp nhị phân vào đường dẫn sau: <project-root>/assets/tagmanager/

Tên tệp mặc định phải là mã vùng chứa (ví dụ: GTM-1234). Sau khi tải tệp nhị phân xuống, hãy nhớ xoá hậu tố phiên bản khỏi tên tệp để đảm bảo bạn tuân thủ quy ước đặt tên chính xác.

Mặc dù nên sử dụng tệp nhị phân, nhưng nếu vùng chứa của bạn không chứa quy tắc hoặc thẻ, thì bạn có thể chọn sử dụng tệp JSON. Tệp này phải nằm trong một thư mục /assets/tagmanager mới của dự án Android và phải tuân theo quy ước đặt tên sau: <Container_ID>.json. Ví dụ: nếu mã vùng chứa của bạn là GTM-1234, bạn nên thêm các giá trị vùng chứa mặc định vào /assets/tagmanager/GTM-1234.json.

3. Mở vùng chứa

Trước khi truy xuất các giá trị từ một vùng chứa, ứng dụng của bạn cần mở vùng chứa đó. Việc mở một vùng chứa sẽ tải vùng chứa đó từ ổ đĩa (nếu có) hoặc yêu cầu vùng chứa đó từ mạng (nếu cần).

Cách dễ nhất để mở một vùng chứa trên Android là sử dụng ContainerOpener.openContainer(..., Notifier notifier), như trong ví dụ sau:

import com.google.tagmanager.Container;
import com.google.tagmanager.ContainerOpener;
import com.google.tagmanager.ContainerOpener.OpenType;
import com.google.tagmanager.TagManager;

import android.app.Activity;
import android.os.Bundle;

public class RacingGame {

  // Add your public container ID.
  private static final String CONTAINER_ID = "GTM-YYYY";

  volatile private Container mContainer;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    TagManager mTagManager = TagManager.getInstance(this);

    // The container is returned to containerFuture when available.
    ContainerOpener.openContainer(
        mTagManager,                            // TagManager instance.
        CONTAINER_ID,                           // Tag Manager Container ID.
        OpenType.PREFER_NON_DEFAULT,            // Prefer not to get the default container, but stale is OK.
        null,                                   // Time to wait for saved container to load (ms). Default is 2000ms.
        new ContainerOpener.Notifier() {        // Called when container loads.
          @Override
          public void containerAvailable(Container container) {
            // Handle assignment in callback to avoid blocking main thread.
            mContainer = container;
          }
        }
    );
    // Rest of your onCreate code.
  }
}

Trong ví dụ này, ContainerOpener.openContainer(..., Notifier notifier) được dùng để yêu cầu một vùng chứa đã lưu từ bộ nhớ cục bộ. Bằng cách xử lý việc chỉ định mContainer trong lệnh gọi lại containerAvailable, chúng ta đảm bảo rằng luồng chính không bị chặn. Nếu vùng chứa đã lưu cũ hơn 12 giờ, lệnh gọi này cũng sẽ lên lịch một yêu cầu để truy xuất không đồng bộ một vùng chứa mới qua mạng.

Mẫu triển khai này thể hiện cách đơn giản nhất để mở và truy xuất các giá trị từ một vùng chứa bằng cách sử dụng lớp tiện ích ContainerOpener. Để biết các lựa chọn triển khai nâng cao khác, hãy xem phần Cấu hình nâng cao.

4. Nhận các giá trị cấu hình từ vùng chứa

Sau khi vùng chứa mở, bạn có thể truy xuất các giá trị cấu hình bằng cách sử dụng các phương thức get<type>Value():

// Retrieving a configuration value from a Tag Manager Container.

// Get the configuration value by key.
String title = mContainer.getStringValue("title_string");

Các yêu cầu được thực hiện bằng một khoá không tồn tại sẽ trả về một giá trị mặc định phù hợp với loại được yêu cầu:

// Empty keys will return a default value depending on the type requested.

// Key does not exist. An empty string is returned.
string subtitle = container.getStringValue("Non-existent-key");
subtitle.equals(""); // Evaluates to true.

5. Đẩy các giá trị đến DataLayer

DataLayer là một bản đồ cho phép thông tin thời gian chạy về ứng dụng của bạn (chẳng hạn như sự kiện chạm hoặc lượt xem màn hình) có sẵn cho các macro và thẻ của Trình quản lý thẻ trong một vùng chứa.

Ví dụ: bằng cách đẩy thông tin về lượt xem màn hình vào bản đồ DataLayer, bạn có thể thiết lập các thẻ trong giao diện web Trình quản lý thẻ để kích hoạt pixel chuyển đổi và lệnh gọi theo dõi để phản hồi những lượt xem màn hình đó mà không cần mã hoá cứng chúng vào ứng dụng của mình.

Các sự kiện được chuyển đến DataLayer bằng cách sử dụng push() và phương thức trợ giúp DataLayer.mapOf():

//
// MainActivity.java
// Pushing an openScreen event with a screen name into the data layer.
//

import com.google.tagmanager.TagManager;
import com.google.tagmanager.DataLayer;

import android.app.Activity;
import android.os.Bundle;

public MainActivity extends Activity {

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

  }

  // This screen becomes visible when Activity.onStart() is called.
  public void onStart() {
    super.onStart();

    // The container should have already been opened, otherwise events pushed to
    // the DataLayer will not fire tags in that container.
    DataLayer dataLayer = TagManager.getInstance(this).getDataLayer();
    dataLayer.push(DataLayer.mapOf("event",
                                   "openScreen",      // The event type. This value should be used consistently for similar event types.
                                   "screenName",      // Writes a key "screenName" to the dataLayer map.
                                   "Home Screen")     // Writes a value "Home Screen" for the "screenName" key.
    );
  }
  // Rest of the Activity implementation
}

Trong giao diện web, giờ đây, bạn có thể tạo thẻ (chẳng hạn như thẻ Google Analytics) để kích hoạt cho mỗi lượt xem màn hình bằng cách tạo quy tắc sau: bằng "openScreen". Để truyền tên màn hình đến một trong các thẻ này, hãy tạo một macro lớp dữ liệu tham chiếu đến khoá "screenName" trong lớp dữ liệu. Bạn cũng có thể tạo một thẻ (chẳng hạn như pixel lượt chuyển đổi của Google Ads) chỉ kích hoạt cho một số lượt xem màn hình cụ thể bằng cách tạo một quy tắc trong đó bằng "openScreen" && bằng "ConfirmationScreen".

6. Xem trước và xuất bản vùng chứa

Giá trị macro sẽ luôn tương ứng với phiên bản hiện tại đã xuất bản. Trước khi xuất bản phiên bản mới nhất của một vùng chứa, bạn có thể xem trước vùng chứa nháp.

Để xem trước một vùng chứa, hãy tạo một URL xem trước trong giao diện web của Trình quản lý thẻ của Google bằng cách chọn phiên bản vùng chứa mà bạn muốn xem trước, rồi chọn Preview. Lưu URL xem trước này vì bạn sẽ cần đến nó trong các bước sau.

URL xem trước có trong cửa sổ xem trước của giao diện web Trình quản lý thẻ
Hình 1: Lấy URL xem trước từ giao diện web của Trình quản lý thẻ.

Tiếp theo, hãy thêm Hoạt động sau vào tệp AndroidManifest.xml của ứng dụng:

<!-- Google Tag Manager Preview Activity -->
<activity
  android:name="com.google.tagmanager.PreviewActivity"
  android:label="@string/app_name"
  android:noHistory="true" >  <!-- Optional, removes the PreviewActivity from activity stack. -->
  <intent-filter>
    <data android:scheme="tagmanager.c.application_package_name" />
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE"/>
  </intent-filter>
</activity>
  

Mở đường liên kết trên trình mô phỏng hoặc thiết bị thực để xem trước vùng chứa bản nháp trong ứng dụng của bạn.

Khi bạn đã sẵn sàng cung cấp các giá trị cấu hình nháp cho ứng dụng của mình, hãy xuất bản vùng chứa.

Cấu hình nâng cao

Trình quản lý thẻ của Google cho thiết bị di động có một số lựa chọn cấu hình nâng cao cho phép bạn chọn các giá trị dựa trên điều kiện thời gian chạy bằng cách sử dụng các quy tắc, làm mới vùng chứa theo cách thủ công và nhận các lựa chọn bổ sung để mở vùng chứa. Các phần sau đây trình bày một số cấu hình nâng cao phổ biến nhất.

Các lựa chọn nâng cao để mở vùng chứa

SDK Trình quản lý thẻ của Google cung cấp một số phương thức để mở các vùng chứa có thể giúp bạn kiểm soát tốt hơn quá trình tải:

TagManager.openContainer()

TagManager.openContainer() là API linh hoạt và có cấp độ thấp nhất để mở một vùng chứa. Phương thức này sẽ trả về ngay lập tức một vùng chứa mặc định và cũng tải không đồng bộ một vùng chứa từ đĩa hoặc mạng nếu không có vùng chứa đã lưu hoặc nếu vùng chứa đã lưu không mới (> 12 giờ).

mContainer = tagManager.openContainer(CONTAINER_ID, new Container.Callback() {

  // Called when a refresh is about to begin for the given refresh type.
  @Override
  public void containerRefreshBegin(Container container, RefreshType refreshType) {
    // Notify UI that the Container refresh is beginning.
   }

  // Called when a successful refresh occurred for the given refresh type.
  @Override
  public void containerRefreshSuccess(Container container, RefreshType refreshType]) {
    // Notify UI that Container is ready.
  }

  // Called when a refresh failed for the given refresh type.
  @Override
  public void containerRefreshFailure(Container container,
                                      RefreshType refreshType,
                                      RefreshFailure refreshFailure) {
    // Notify UI that the Container refresh has failed.
  }

Trong suốt quá trình tải, TagManager.openContainer() sẽ đưa ra một số phương thức gọi lại trong vòng đời để mã của bạn có thể biết khi nào yêu cầu tải bắt đầu, liệu yêu cầu có thất bại hay thành công và lý do, cũng như liệu cuối cùng vùng chứa có được tải từ ổ đĩa hay mạng hay không.

Trừ phi ứng dụng của bạn có thể sử dụng các giá trị mặc định, bạn sẽ cần sử dụng các lệnh gọi lại này để biết thời điểm một vùng chứa đã lưu hoặc vùng chứa mạng đã tải. Xin lưu ý rằng bạn sẽ không thể tải một vùng chứa đã lưu hoặc vùng chứa mạng nếu đây là lần đầu tiên ứng dụng chạy và không có kết nối mạng.

TagManager.openContainer() sẽ truyền các giá trị enum sau đây làm đối số cho các lệnh gọi lại này:

RefreshType

Giá trịMô tả
Container.Callback.SAVED Yêu cầu làm mới đang tải một vùng chứa được lưu cục bộ.
Container.Callback.NETWORK Yêu cầu làm mới đang tải một vùng chứa qua mạng.

RefreshFailure

Giá trịMô tả
Container.Callback.NO_SAVED_CONTAINER Không có vùng chứa đã lưu nào.
Container.Callback.IO_ERROR Đã xảy ra lỗi I/O khiến vùng chứa không làm mới được.
Container.Callback.NO_NETWORK Không có kết nối mạng.
Container.Callback.NETWORK_ERROR Đã xảy ra lỗi mạng.
Container.Callback.SERVER_ERROR Đã xảy ra lỗi trên máy chủ.
Container.Callback.UNKNOWN_ERROR Đã xảy ra lỗi không thể phân loại.

Phương thức mở vùng chứa mới và không mặc định

ContainerOpener bao bọc TagManager.openContainer() và cung cấp 2 phương thức tiện lợi để mở các vùng chứa: ContainerOpener.openContainer(..., Notifier notifier)ContainerOpener.openContainer(..., Long timeoutInMillis).

Mỗi phương thức này lấy một quá trình liệt kê yêu cầu một vùng chứa mới hoặc không mặc định.

OpenType.PREFER_NON_DEFAULT được đề xuất cho hầu hết các ứng dụng và cố gắng trả về vùng chứa không mặc định có sẵn đầu tiên trong một khoảng thời gian chờ nhất định, từ ổ đĩa hoặc mạng, ngay cả khi vùng chứa đó đã hơn 12 giờ. Nếu trả về một vùng chứa đã lưu cũ, thì nó cũng sẽ tạo một yêu cầu mạng không đồng bộ cho một vùng chứa mới. Khi sử dụng OpenType.PREFER_NON_DEFAULT, một vùng chứa mặc định sẽ được trả về nếu không có vùng chứa nào khác hoặc nếu thời gian chờ vượt quá.

OpenType.PREFER_FRESH cố gắng trả về một vùng chứa mới từ ổ đĩa hoặc mạng trong khoảng thời gian chờ đã cho. Phương thức này trả về một vùng chứa đã lưu nếu không có kết nối mạng và/hoặc thời gian chờ đã hết.

Bạn không nên sử dụng OpenType.PREFER_FRESH ở những nơi mà thời gian yêu cầu dài hơn có thể ảnh hưởng đáng kể đến trải nghiệm người dùng, chẳng hạn như với cờ giao diện người dùng hoặc chuỗi hiển thị. Bạn cũng có thể sử dụng Container.refresh() bất cứ lúc nào để buộc đưa ra yêu cầu về vùng chứa mạng.

Cả hai phương thức tiện lợi này đều không chặn. ContainerOpener.openContainer(..., Long timeoutInMillis) trả về một đối tượng ContainerOpener.ContainerFuture, trong đó phương thức get trả về Container ngay khi đã tải (nhưng sẽ chặn cho đến lúc đó). Phương thức ContainerOpener.openContainer(..., Notifier notifier) lấy một lệnh gọi lại duy nhất, được gọi khi vùng chứa có sẵn, có thể dùng để ngăn chặn việc chặn luồng chính. Cả hai phương thức đều có thời gian chờ mặc định là 2000 mili giây.

Đánh giá macro tại thời gian chạy bằng cách sử dụng các quy tắc

Các vùng chứa có thể đánh giá các giá trị tại thời gian chạy bằng cách sử dụng các quy tắc. Các quy tắc có thể dựa trên các tiêu chí như ngôn ngữ thiết bị, nền tảng hoặc bất kỳ giá trị macro nào khác. Ví dụ: bạn có thể dùng các quy tắc để chọn một chuỗi hiển thị được bản địa hoá dựa trên ngôn ngữ của thiết bị trong thời gian chạy. Bạn có thể định cấu hình thông tin này bằng cách sử dụng quy tắc sau:

Một quy tắc được dùng để chọn chuỗi hiển thị dựa trên ngôn ngữ của thiết bị tại thời gian chạy: ngôn ngữ bằng tiếng Tây Ban Nha. Quy tắc này sử dụng macro ngôn ngữ được xác định trước và mã ngôn ngữ ISO 639-1 gồm 2 ký tự.
Hình 1:Thêm một quy tắc để chỉ bật macro thu thập giá trị cho những thiết bị được định cấu hình để sử dụng tiếng Tây Ban Nha.

Sau đó, bạn có thể tạo macro thu thập giá trị cho từng ngôn ngữ và thêm quy tắc này vào từng macro, chèn mã ngôn ngữ thích hợp. Khi vùng chứa này được xuất bản, ứng dụng của bạn sẽ có thể hiển thị các chuỗi hiển thị đã bản địa hoá, tuỳ thuộc vào ngôn ngữ của thiết bị người dùng trong thời gian chạy.

Xin lưu ý rằng nếu vùng chứa mặc định của bạn cần có các quy tắc, thì bạn phải sử dụng tệp vùng chứa nhị phân làm vùng chứa mặc định.

Tìm hiểu thêm về cách thiết lập quy tắc (Trung tâm trợ giúp).

Tệp vùng chứa nhị phân mặc định

Các vùng chứa mặc định cần có quy tắc nên sử dụng tệp vùng chứa nhị phân thay vì tệp JSON làm vùng chứa mặc định. Các vùng chứa nhị phân hỗ trợ việc xác định các giá trị macro trong thời gian chạy bằng các quy tắc của Trình quản lý thẻ của Google, trong khi các tệp JSON thì không.

Bạn có thể tải tệp vùng chứa nhị phân xuống từ giao diện web của Trình quản lý thẻ của Google và nên thêm tệp này vào thư mục /assets/tagmanager/ của dự án và tuân theo mẫu sau: /assets/tagmanager/GTM-XXXX, trong đó tên tệp đại diện cho mã vùng chứa của bạn.

Trong trường hợp có cả tệp JSON và tệp vùng chứa nhị phân, SDK sẽ sử dụng tệp vùng chứa nhị phân làm vùng chứa mặc định.

Sử dụng macro lệnh gọi hàm

Macro Lệnh gọi hàm là những macro được đặt thành giá trị trả về của một hàm cụ thể trong ứng dụng của bạn. Bạn có thể sử dụng Macro Lệnh gọi hàm để kết hợp các giá trị thời gian chạy với các quy tắc của Trình quản lý thẻ của Google, chẳng hạn như xác định tại thời gian chạy giá nào sẽ hiển thị cho người dùng dựa trên ngôn ngữ và đơn vị tiền tệ đã định cấu hình của thiết bị.

Cách định cấu hình macro lệnh gọi hàm:

  1. Xác định macro lệnh gọi hàm trong giao diện web của Trình quản lý thẻ của Google. Bạn có thể tuỳ ý định cấu hình các đối số dưới dạng các cặp khoá-giá trị.
  2. Đăng ký một FunctionCallMacroHandler trong ứng dụng của bạn bằng Container.registerFunctionCallMacroHandler() và tên hàm mà bạn đã định cấu hình trong giao diện web Trình quản lý thẻ của Google, ghi đè phương thức getValue() của hàm đó:
    /**
     * Registers a function call macro handler.
     *
     * @param functionName The function name field, as defined in the Google Tag
     *     Manager web interface.
     */
    mContainer.registerFunctionCallMacroHandler(functionName, new FunctionCallMacroHandler() {
    
      /**
       * This code will execute when any custom macro's rule(s) evaluate to true.
       * The code should check the functionName and process accordingly.
       *
       * @param functionName Corresponds to the function name field defined
       *     in the Google Tag Manager web interface.
       * @param parameters An optional map of parameters
       *     as defined in the Google Tag Manager web interface.
       */
      @Override
      public Object getValue(String functionName, Map<String, Object> parameters)) {
    
        if (functionName.equals("myConfiguredFunctionName")) {
          // Process and return the calculated value of this macro accordingly.
          return macro_value
        }
        return null;
      }
    });

Sử dụng thẻ lệnh gọi hàm

Thẻ Lệnh gọi hàm cho phép thực thi các hàm được đăng ký trước bất cứ khi nào một sự kiện được đẩy vào lớp dữ liệu và các quy tắc của thẻ đánh giá thành true.

Cách định cấu hình thẻ lệnh gọi hàm:

  1. Xác định thẻ lệnh gọi hàm trong giao diện web của Trình quản lý thẻ của Google. Bạn có thể tuỳ ý định cấu hình các đối số dưới dạng các cặp khoá-giá trị.
  2. Đăng ký trình xử lý thẻ lệnh gọi hàm trong ứng dụng của bạn bằng cách sử dụng Container.registerFunctionCallTagHandler():
    /**
     * Register a function call tag handler.
     *
     * @param functionName The function name, which corresponds to the function name field
     *     Google Tag Manager web interface.
     */
    mContainer.registerFunctionCallTagHandler(functionName, new FunctionCallTagHandler() {
    
      /**
       * This method will be called when any custom tag's rule(s) evaluates to true.
       * The code should check the functionName and process accordingly.
       *
       * @param functionName The functionName passed to the functionCallTagHandler.
       * @param parameters An optional map of parameters as defined in the Google
       *     Tag Manager web interface.
       */
      @Override
      public void execute(String functionName, Map<String, Object> parameters) {
        if (functionName.equals("myConfiguredFunctionName")) {
          // Process accordingly.
        }
      }
    });

Đặt khoảng thời gian làm mới tuỳ chỉnh

SDK Trình quản lý thẻ của Google sẽ cố gắng truy xuất một vùng chứa mới nếu tuổi của vùng chứa hiện tại vượt quá 12 giờ. Để đặt khoảng thời gian làm mới vùng chứa tuỳ chỉnh, hãy sử dụng Timer, như trong ví dụ sau:

timer.scheduleTask(new TimerTask() {
  @Override
  public void run() {
    mContainer.refresh();
  }
}, delay, <new_period_in milliseconds>);

Gỡ lỗi bằng Trình ghi nhật ký

Theo mặc định, Trình quản lý thẻ của Google SDK sẽ in các lỗi và cảnh báo vào nhật ký. Việc bật tính năng ghi nhật ký chi tiết hơn có thể hữu ích cho việc gỡ lỗi và có thể thực hiện bằng cách triển khai Logger của riêng bạn bằng TagManager.setLogger, như trong ví dụ này:

TagManager tagManager = TagManager.getInstance(this);
tagManager.setLogger(new Logger() {

  final String TAG = "myGtmLogger";

  // Log output with verbosity level of DEBUG.
  @Override
  public void d(String arg0) {
    Log.d(TAG, arg0);
  }

  // Log exceptions when provided.
  @Override
  public void d(String arg0, Throwable arg1) {
    Log.d(TAG, arg0);
    arg1.printStackTrace();
  }

  // Rest of the unimplemented Logger methods.

});

Hoặc bạn có thể đặt LogLevel của Logger hiện có bằng cách sử dụng TagManager.getLogger().setLogLevel(LogLevel), như trong ví dụ này:

// Change the LogLevel to INFO to enable logging at INFO and higher levels.
TagManager tagManager = TagManager.getInstance(this);
tagManager.getLogger().setLogLevel(LogLevel.INFO);