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

Hướng dẫn 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 ứng dụng dành cho thiết bị 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 giá trị cấu hình trong ứng dụng dành cho thiết bị di động bằng cách sử dụng giao diện Trình quản lý thẻ của Google mà không phải tạo lại và gửi lại tệp nhị phân của ứng dụng cho các trang web thương mại về ứng dụng.

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

  • Các chuỗi hiển thị và chế độ cài đặt giao diện người dùng khác nhau
  • 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, bật 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ữ của quảng cáo
  • Sử dụng ngôn ngữ và vị trí để định cấu hình các thành phần 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 động các thẻ theo dõi và pixel trong các ứ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ên kích hoạt thẻ hoặc pixel theo dõi nào. Trình quản lý thẻ hiện hỗ trợ các thẻ sau:

  • Phân tích ứng dụng di động của Google
  • 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 sẽ cần những điều 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 hướng dẫn này.

Bắt đầu

Phần này sẽ hướng dẫn nhà phát triển thông qua quy trình làm việc thông thường của Trình quản lý thẻ:

  1. Thêm SDK Trình quản lý thẻ của Google vào dự án
  2. Đặt giá trị vùng chứa mặc định
  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 lên Lớp dữ liệu
  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 của bạn

Trước khi sử dụng SDK Trình quản lý thẻ của Google, bạn cần giải nén gói SDK và thêm thư viện vào đường dẫn bản dựng của dự án, đồng thời thêm 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 một 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 vùng chứa mặc định trong lần chạy ứng dụng đầu tiên của bạn. Vùng chứa mặc định sẽ được dùng cho đến khi ứng dụng có thể truy xuất vùng chứa mới qua mạng.

Để tải và thêm tệp nhị phân của vùng chứa mặc định vào ứng dụng của bạn, 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 bạn tải tệp nhị phân xuống, hãy nhớ xoá hậu tố của phiên bản khỏi tên tệp để đảm bảo bạn tuân theo quy ước đặt tên chính xác.

Mặc dù bạn 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 các quy tắc hoặc thẻ, bạn có thể chọn sử dụng tệp JSON đơn giản. 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 giá trị từ một vùng chứa, ứng dụng của bạn cần mở vùng chứa đó. Thao tác mở một vùng chứa sẽ tải vùng chứa đó từ ổ đĩa (nếu có) hoặc sẽ 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 cũng sẽ lên lịch cho yêu cầu truy xuất không đồng bộ một vùng chứa mới qua mạng.

Cách triển khai mẫu 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 lợi ContainerOpener. Để biết thêm các lựa chọn triển khai nâng cao, xem phần Cấu hình nâng cao.

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

Khi vùng chứa mở, bạn có thể truy xuất các giá trị cấu hình bằ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 khoá không tồn tại sẽ trả về một giá trị mặc định phù hợp với loại đã 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 giá trị vào DataLayer

DataLayer là một bản đồ cho phép thông tin trong thời gian chạy về ứng dụng của bạn (chẳng hạn như các 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 vùng chứa.

Ví dụ: bằng cách đưa 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 của Trình quản lý thẻ để kích hoạt pixel chuyển đổi và theo dõi lệnh gọi để phản hồi các lượt xem màn hình đó mà không cần mã hoá cứng chúng vào ứng dụng.

Các sự kiện được đẩy đế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, bạn hiện có thể tạo thẻ (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: = "openScreen". Để chuyể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 khóa "screenName" trong lớp dữ liệu. Bạn cũng có thể tạo một thẻ (như pixel chuyển đổi Google Ads) để chỉ kích hoạt cho các lượt xem màn hình cụ thể, bằng cách tạo quy tắc, trong đó = "openScreen" && bằng "ConfirmationScreen".

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

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

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

URL xem trước sẽ có trong cửa sổ xem trước của giao diện web của Trình quản lý thẻ
Hình 1: Nhận 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.

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

Cấu hình nâng cao

Trình quản lý thẻ của Google dành cho thiết bị di động có một số tuỳ 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à có thêm các tuỳ chọn để 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.

Tuỳ 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ở vùng chứa, giúp bạn có nhiều quyền kiểm soát hơn đối với quá trình tải:

TagManager.openContainer()

TagManager.openContainer() là API cấp thấp nhất và linh hoạt nhất để mở vùng chứa. Phương thức này sẽ trả về ngay lập tức với 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 nào đã lưu hoặc nếu vùng chứa đã lưu không mới (trên 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ể tìm hiểu thời điểm yêu cầu tải bắt đầu, lý do yêu cầu không thành công và thành công, cũng như liệu vùng chứa cuối cùng được tải qua ổ đĩa hay mạng.

Trừ phi ứng dụng của bạn được chấp nhận sử dụng các giá trị mặc định, bạn sẽ cần phải 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 trong mạng đã tải. Lưu ý: Bạn sẽ không thể tải vùng chứa mạng hoặc vùng chứa đã lưu 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() 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ịNội dung 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ịNội dung mô tả
Container.Callback.NO_SAVED_CONTAINER Không có vùng chứa đã lưu nào.
Container.Callback.IO_ERROR Lỗi I/O đã ngăn việc làm mới vùng chứa.
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 pháp mở vùng chứa không mặc định và mới chứa

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

Mỗi phương thức này sẽ có một bảng liệt kê yêu cầu một vùng chứa không mặc định hoặc mới.

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 phải 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ũ, phương thức này 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 khoảng 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ờ nhất định. Phương thức này sẽ trả về một vùng chứa đã lưu nếu không có kết nối mạng và/hoặc vượt quá khoảng thời gian chờ.

Bạn không nên sử dụng OpenType.PREFER_FRESH ở những nơi có thể thời gian yêu cầu lâu 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 yêu cầu vùng chứa mạng.

Cả hai phương thức thuận tiện 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 vừa tải xong (nhưng điều đó sẽ bị chặn cho đến lúc đó). Phương thức ContainerOpener.openContainer(..., Notifier notifier) nhận một lệnh gọi lại duy nhất, được gọi khi có sẵn vùng chứa. Lệnh gọi lại này có thể dùng để ngăn việc chặn luồng chính. Cả hai phương thức đều có khoảng thời gian chờ mặc định là 2000 mili giây.

Đánh giá macro trong thời gian chạy bằng Quy tắc

Các vùng chứa có thể đánh giá giá trị trong 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ể sử dụng các quy tắc để chọn một chuỗi hiển thị đã 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 mục 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ị trong thời gian chạy: language bằng es. 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 hai ký tự.
Hình 1: Thêm quy tắc để chỉ bật macro thu thập giá trị cho các 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 tập hợ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ữ trên thiết bị của người dùng trong thời gian chạy.

Lưu ý rằng nếu vùng chứa mặc định của bạn cần có quy tắc, bạn phải 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 định cấu hình quy tắc (Trung tâm trợ giúp).

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

Các vùng chứa mặc định cần có quy tắc nên 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. Vùng chứa nhị phân hỗ trợ xác định giá trị vĩ mô 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 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 Trình quản lý thẻ của Google và thêm tệp này vào thư mục /assets/tagmanager/ của dự án, đồng thời 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ó tệp JSON cũng như 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à các macro được đặt thành giá trị trả về của một hàm được chỉ định 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 giá trị thời gian chạy với quy tắc của Trình quản lý thẻ của Google, chẳng hạn như xác định giá 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ị.

Để đị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ặp khoá-giá trị.
  2. Đăng ký FunctionCallMacroHandler trong ứng dụng của bạn bằng cách sử dụng Container.registerFunctionCallMacroHandler() và tên hàm mà bạn đã thiết lập trong giao diện web Trình quản lý thẻ của Google, ghi đè phương thức getValue() của phương thức đó:
    /**
     * 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 đã đă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 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ặp khoá-giá trị.
  2. Đăng ký trình xử lý thẻ 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 thời hạn sử dụng hiện tại của vùng chứa 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, SDK Trình quản lý thẻ của Google sẽ in 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. Bạn có thể triển khai Logger của riêng mình với TagManager.setLogger như trong ví dụ sau:

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 Trình ghi nhật ký hiện có bằng cách sử dụng TagManager.getLogger().setLogLevel(LogLevel), như trong ví dụ sau:

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