「Android Getting Started SDK8」修訂間的差異

出自TAMedia
跳至導覽 跳至搜尋
 
(未顯示同一使用者於中間所作的 26 次修訂)
行 6: 行 6:
:<ul><li>Native</li></ul>
:<ul><li>Native</li></ul>


<br>
== <b>系統需求</b> ==
== <b>系統需求</b> ==
:Android 5.0以上 (API Level 21+)
:Android 6.0以上 (API Level 23+)
<br>


== <b>SDK說明文件</b> ==
== <b>SDK說明文件</b> ==
行 15: 行 13:
<br>
<br>


== <b>Android Studio專案整合SDK</b> ==
== <b>APP專案整合SDK</b> ==
請按照下列方式設置專案<br><br>
請按照下列方式設置專案<br><br>
<big><u>Step 1: 將SDK放入app專案的<b>libs</b>資料夾</u></big><br><br>
<big><u>Step 1: 將SDK放入app專案的<b>libs</b>資料夾</u></big><br><br>
:請至[[Download MADP Android SDK|下載 Download SDK]]下載SDK,並將壓縮檔內的AAR檔 (adpmobile-lib-r8.0.0.aar) 放至專案的libs資料夾, 若無libs資料夾請自行建立<br>
:請至[[Download MADP Android SDK|下載 Download SDK]]下載SDK,並將壓縮檔內的AAR檔放至專案的libs資料夾, 若無libs資料夾請自行建立<br>


[[檔案:AS SDK8 aar.png | 300px]]
[[檔案:AS SDK8 aar.png | 300px]]
行 27: 行 25:
[[檔案:AS SDK8 gradle.png | 300px]]
[[檔案:AS SDK8 gradle.png | 300px]]


<br>
:請加入TAmedia SDK aar與下列相依性函式庫
:<ul><li>retrofit</li></ul>
:<ul><li>ads identifier</li></ul>
:<ul><li>gson</li></ul>
:<ul><li>appset</li></ul>
:<ul><li>jetpack security-crypto</li></ul>
:<ul><li>activity-ktx</li></ul>
== <b>Gradle設定</b> ==


====== MADP SDK 8.0.6 (Kotlin 1.8.x ~ 1.9.22) ======
<source>
<source>
dependencies {
dependencies {
行 45: 行 34:
     // =======================================================================//
     // =======================================================================//
     implementation files('libs/adpmobile-lib-r8.0.0.aar')
     implementation files('libs/adpmobile-lib-r8.0.0.aar')
    implementation files('libs/omsdk-android-1.3.37-release.aar')


     // =======================================================================//
     // =======================================================================//
行 53: 行 43:
     implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
     implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
     implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'
     implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'
     // ads identifier
     // google ads identifier
     implementation 'com.google.android.gms:play-services-ads-identifier:17.0.1'
     implementation 'com.google.android.gms:play-services-ads-identifier:17.0.1'
    // google app set id
    implementation 'com.google.android.gms:play-services-appset:16.0.1'
     // gson
     // gson
     implementation 'com.google.code.gson:gson:2.8.6'
     implementation 'com.google.code.gson:gson:2.8.6'
    // app set id
    implementation 'com.google.android.gms:play-services-appset:16.0.1'
     // Jetpack Security
     // Jetpack Security
     implementation "androidx.security:security-crypto:1.1.0-alpha03"
     implementation 'androidx.security:security-crypto:1.1.0-alpha03'
    // activity-ktx
    implementation 'androidx.activity:activity-ktx:1.9.3'
 


}
}
</source>
</source>


<br><br>
====== MADP SDK 8.0.7 / 8.0.8 (Kotlin 2.0.0+) [[檔案:new-xxl.png|30px]] ======
<source>
dependencies {
 
    // =======================================================================//
    // MADP library
    // =======================================================================//
    // 8.0.7 請改用 adpmobile-lib-r8.0.7.aar
    implementation files('libs/adpmobile-lib-r8.0.8.aar')
    implementation files('libs/omsdk-android-1.3.37-release.aar')
 
    // =======================================================================//
    // MADP library dependencies
    // =======================================================================//
    // retrofit
    implementation 'com.squareup.retrofit2:retrofit:3.0.0'
    implementation 'com.squareup.retrofit2:converter-gson:3.0.0'
    implementation 'com.squareup.retrofit2:converter-scalars:3.0.0'
    // google ads identifier
    implementation 'com.google.android.gms:play-services-ads-identifier:18.2.0'
    // google app set id
    implementation 'com.google.android.gms:play-services-appset:16.1.0'
    // gson
    implementation 'com.google.code.gson:gson:2.13.2'
    // Jetpack Security(僅 8.0.7 需要,8.0.8 起請移除此行)
    implementation 'androidx.security:security-crypto:1.1.0'
    // activity-ktx
    implementation 'androidx.activity:activity-ktx:1.11.0'
 


<big><u>Step 3: 在<b>AndroidManifest.xml</b>的manifest tag宣告權限</u></big><br>
}
</source>
<br>
 
== <b>權限設定</b> ==


[[檔案:Import SDK7 Step3-1.PNG]]
[[檔案:Import SDK7 Step3-1.PNG]]


<br><br>
<br>


:<ul><li>Required Permission</li></ul>
:<ul><li>Required Permission</li></ul>
行 89: 行 114:
<br>
<br>


== <b>Target API 為 31+ (Android 12) 的應用程式</b> ==
== <b>高權限功能開關(8.0.8 起)</b> [[檔案:new-xxl.png|30px]] ==
: Target API 為 31+的開發者應用程式,請於AndroidManifest.xml中加入下列使用權限
<source>
<uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
</source>
<br>
 
: Target API 為 31+的開發者應用程式,但是屬於 <b>闔家適用計畫,或將兒童導向應用程式</b> 請於AndroidManifest.xml中加入下列使用權限
<source>
<uses-permission android:name="com.google.android.gms.permission.AD_ID" tools:node="remove"/>
</source>
<br>
 
: Target API 為 30 以下的開發者應用程式,則不須增加此權限
<br>


詳情可參考Google網站說明:<br>
8.0.8 起,廣告素材透過 WebView JS bridge 使用麥克風、相機、行事曆、閃光燈這四項功能前,必須由 App 端主動開啟對應的開關。四個開關預設皆為關閉,未開啟時 SDK 會忽略素材的呼叫。
[https://support.google.com/googleplay/android-developer/answer/6048248?hl=zh-Hant 2021 年 Google Play 服務更新]
<br>
[https://support.google.com/googleplay/android-developer/topic/9877766 Google Play Policy - 家庭]
<br>
 
== <b>Target API 為 34 (Android 14) 的應用程式 [[檔案:new-xxl.png|30px]] </b> ==
: Target API 為 34的開發者應用程式,請下載MADP 8.0.5 SDK, 並參考下面Gradle相依性設定, Proguard混淆設定
<br>
=== <b>Gradle設定</b> ===
<source>
 
    // =======================================================================//
    // APP library dependencies
    // =======================================================================//
    // madp aar
    implementation fileTree(include: ['*.aar'], dir: 'libs')
 
 
    // =======================================================================//
    // MADP library dependencies
    // =======================================================================//
    // retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
    implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'
    // google play service identifier
    implementation 'com.google.android.gms:play-services-ads-identifier:18.0.1'
    // app set id
    implementation 'com.google.android.gms:play-services-appset:16.0.2'
    // gson
    implementation 'com.google.code.gson:gson:2.10.1'
    // jetpack security
    implementation "androidx.security:security-crypto:1.1.0-alpha06"
    // ActivityResultContracts
    implementation 'androidx.activity:activity-ktx:1.8.2'


</source>
=== 開關 API ===
<br>


=== <b>Proguard設定</b> ===
{| class="wikitable"
<source>
! 功能 !! 開啟 !! 查詢
##---------------Begin: proguard for MADP  ----------
|-
-dontoptimize
| 麥克風 || <code>TWMMobileAds.setMicrophoneEnabled(boolean)</code> || <code>TWMMobileAds.isMicrophoneEnabled()</code>
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
|-
-optimizationpasses 5
| 相機 || <code>TWMMobileAds.setCameraEnabled(boolean)</code> || <code>TWMMobileAds.isCameraEnabled()</code>
-dontusemixedcaseclassnames
|-
-keepattributes *Annotation*,InnerClasses,EnclosingMethod,SourceFile,LineNumberTable
| 行事曆 || <code>TWMMobileAds.setCalendarEnabled(boolean)</code> || <code>TWMMobileAds.isCalendarEnabled()</code>
-dontpreverify
|-
-verbose
| 閃光燈 || <code>TWMMobileAds.setFlashlightEnabled(boolean)</code> || <code>TWMMobileAds.isFlashlightEnabled()</code>
-dontwarn android.support.**
|}


-keep public class com.google.vending.licensing.ILicensingService
=== 使用範例 ===
-keep public class com.android.vending.licensing.ILicensingService
-keeppackagenames com.taiwanmobile.pt.**, com.iab.omid.library.taiwanmobile.**


# keep setters in Views so that animations can still work.
以麥克風互動素材為例,在承載該素材的 Activity 進入時開啟,離開時關閉:
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
    void set*(***);
    *** get*();
}


# We want to keep methods in Activity that could be used in the XML attribute onClick
<syntaxhighlight lang="java">
-keepclassmembers class * extends android.app.Activity {
@Override
     public void *(android.view.View);
protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
    // 本頁會投放需要麥克風互動的素材
    TWMMobileAds.setMicrophoneEnabled(true);
}
}


-keep class * extends android.os.Parcelable {
@Override
     public static final android.os.Parcelable$Creator *;
protected void onDestroy() {
     TWMMobileAds.setMicrophoneEnabled(false);
    super.onDestroy();
}
}
</syntaxhighlight>
<br>


-keepclassmembers class **.R$* {
== <b>闔家適用計畫 / 兒童導向應用程式</b> ==
    public static <fields>;
}


-keep public enum  com.taiwanmobile.pt.adp.view.TWMAdRequest$** {
: 本SDK的相依套件 <code>play-services-ads-identifier</code> 已於其manifest中宣告AD_ID權限,manifest合併後會自動出現在您的應用程式中。
    **[] $VALUES;
    public <fields>;
    public <methods>;
}


-keep class com.taiwanmobile.pt.adp.TWMMobileAds {
: 若您的應用程式屬於 <b>闔家適用計畫,或為兒童導向應用程式</b>,請於AndroidManifest.xml中加入下列設定,移除AD_ID使用權限
    public protected <fields>;
    public protected <methods>;
}


-keepclassmembers class com.taiwanmobile.pt.adp.TWMMobileAds {
<source>
    public static ** Companion;
<manifest
}
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">


-keep class com.taiwanmobile.pt.adp.view.*, com.taiwanmobile.pt.adp.view.inread.*, com.taiwanmobile.pt.adp.view.webview.**, com.taiwanmobile.pt.adp.nativead.* {
<uses-permission android:name="com.google.android.gms.permission.AD_ID" tools:node="remove"/>
    public protected <fields>;
</source>
    public protected <methods>;
}


-keep class com.iab.omid.library.taiwanmobile.** {
: 註:targetSdk 33 (Android 13) 以上的應用程式,使用廣告ID時必須宣告AD_ID權限;未宣告時廣告ID會被置換為全為零的字串。此為Android 13起的規則,與SDK版本無關。
    public protected <fields>;
    public protected <methods>;
}


# Also keep - Enumerations. Keep the special static methods that are required in
詳情可參考Google網站說明:<br>
# enumeration classes.
[https://support.google.com/googleplay/android-developer/answer/6048248?hl=zh-Hant 2021 年 Google Play 服務更新]
-keepclassmembers enum  * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
 
# Keep names - Native method names. Keep all native class/method names.
-keepclasseswithmembers,allowshrinking class * {
    native <methods>;
}
##---------------End: proguard for MADP  ----------
 
 
 
 
##---------------Begin: proguard for Retrofit  ----------
# Retrofit does reflection on generic parameters. InnerClasses is required to use Signature and
# EnclosingMethod is required to use InnerClasses.
-keepattributes Signature, InnerClasses, EnclosingMethod
 
# Retrofit does reflection on method and parameter annotations.
-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations
 
# Keep annotation default values (e.g., retrofit2.http.Field.encoded).
-keepattributes AnnotationDefault
 
# Retain service method parameters when optimizing.
-keepclassmembers,allowshrinking,allowobfuscation interface * {
    @retrofit2.http.* <methods>;
}
 
# Ignore annotation used for build tooling.
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
 
# Ignore JSR 305 annotations for embedding nullability information.
-dontwarn javax.annotation.**
 
# Guarded by a NoClassDefFoundError try/catch and only used when on the classpath.
-dontwarn kotlin.Unit
 
# Top-level functions that can only be used by Kotlin.
-dontwarn retrofit2.KotlinExtensions
-dontwarn retrofit2.KotlinExtensions$*
 
# With R8 full mode, it sees no subtypes of Retrofit interfaces since they are created with a Proxy
# and replaces all potential values with null. Explicitly keeping the interfaces prevents this.
-if interface * { @retrofit2.http.* <methods>; }
-keep,allowobfuscation interface <1>
 
# Keep generic signature of Call, Response (R8 full mode strips signatures from non-kept items).
-keep,allowobfuscation,allowshrinking interface retrofit2.Call
-keep,allowobfuscation,allowshrinking class retrofit2.Response
 
# With R8 full mode generic signatures are stripped for classes that are not
# kept. Suspend functions are wrapped in continuations where the type argument
# is used.
-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation
##---------------End: proguard for Retrofit  ----------
 
 
 
##---------------Begin: proguard for Gson  ----------
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature
 
# For using GSON @Expose annotation
-keepattributes *Annotation*
 
# Gson specific classes
-dontwarn sun.misc.**
#-keep class com.google.gson.stream.** { *; }
 
# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { <fields>; }
 
# Prevent proguard from stripping interface information from TypeAdapter, TypeAdapterFactory,
# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)
-keep class * extends com.google.gson.TypeAdapter
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer
 
# Prevent R8 from leaving Data object members always null
-keepclassmembers,allowobfuscation class * {
  @com.google.gson.annotations.SerializedName <fields>;
}
 
# Retain generic signatures of TypeToken and its subclasses with R8 version 3.0 and higher.
-keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken
-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken
##---------------End: proguard for Gson  ----------
 
 
 
##---------------Begin: proguard for kotlinx.coroutines  ----------
# Allow R8 to optimize away the FastServiceLoader.
# Together with ServiceLoader optimization in R8
# this results in direct instantiation when loading Dispatchers.Main
-assumenosideeffects class kotlinx.coroutines.internal.MainDispatcherLoader {
    boolean FAST_SERVICE_LOADER_ENABLED return false;
}
 
-assumenosideeffects class kotlinx.coroutines.internal.FastServiceLoaderKt {
    boolean ANDROID_DETECTED return true;
}
 
-keep class kotlinx.coroutines.android.AndroidDispatcherFactory {*;}
 
# Disable support for "Missing Main Dispatcher", since we always have Android main dispatcher
-assumenosideeffects class kotlinx.coroutines.internal.MainDispatchersKt {
    boolean SUPPORT_MISSING return false;
}
 
# Statically turn off all debugging facilities and assertions
-assumenosideeffects class kotlinx.coroutines.DebugKt {
    boolean getASSERTIONS_ENABLED() return false;
    boolean getDEBUG() return false;
    boolean getRECOVER_STACK_TRACES() return false;
}
##---------------End: proguard for kotlinx.coroutines  ----------
 
 
 
##---------------Begin: proguard for Google ads  ----------
# For Google Play Services
-keep public class com.google.android.gms.ads.**{
  public *;
}
 
# For old ads classes
-keep public class com.google.ads.**{
  public *;
}
 
# For mediation
-keepattributes *Annotation*
 
# Other required classes for Google Play Services
# Read more at http://developer.android.com/google/play-services/setup.html
-keep class * extends java.util.ListResourceBundle {
  protected Object[][] getContents();
}
 
-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable {
  public static final *** NULL;
}
 
-keepnames @com.google.android.gms.common.annotation.KeepName class *
-keepclassmembernames class * {
  @com.google.android.gms.common.annotation.KeepName *;
}
 
-keepnames class * implements android.os.Parcelable {
  public static final ** CREATOR;
}
##---------------End: proguard for Google ads  ----------
 
##---------------Begin: proguard for jetpack security  ----------
-dontwarn com.google.errorprone.annotations.Immutable
##---------------End: proguard for jetpack security  ----------
 
##---------------Begin: Gradle 8.2.1  ----------
-dontwarn java.lang.invoke.StringConcatFactory
##---------------End: Gradle 8.2.1  ----------
-dontwarn com.google.errorprone.annotations.CanIgnoreReturnValue
-dontwarn com.google.errorprone.annotations.CheckReturnValue
-dontwarn com.google.errorprone.annotations.RestrictedApi
 
</source>
<br>
<br>
 
[https://support.google.com/googleplay/android-developer/topic/9877766 Google Play Policy - 家庭]
== <b>資安相關</b> ==
=== CVE-2023-3635 ===
Square公司知名套件retrofit(處理網路API)其相依性套件okio有DDOS風險
<br>
解決辦法:
build.gradle中增加下列設定
<source>
    // CVE-2023-3635
    // implementation 'com.squareup.okio:okio:3.4.0'
</source>
參考資訊: https://nvd.nist.gov/vuln/detail/CVE-2023-3635
 
<br>
<br>
[[SDK8_Android_SDK_Developer_Guide | 回首頁]]

於 2026年8月17日 (一) 01:54 的最新修訂

簡介

TAmedia SDK提供Android Mobile App開發者簡易迅速的方式整合行動App廣告, 廣告的種類包含
  • Banner
  • Interstitial
  • InRead Anchor
  • Native

系統需求

Android 6.0以上 (API Level 23+)

SDK說明文件

SDK說明文件

APP專案整合SDK

請按照下列方式設置專案

Step 1: 將SDK放入app專案的libs資料夾

請至下載 Download SDK下載SDK,並將壓縮檔內的AAR檔放至專案的libs資料夾, 若無libs資料夾請自行建立

AS SDK8 aar.png


Step 2-1: 編輯app專案中build.gradle

AS SDK8 gradle.png


MADP SDK 8.0.6 (Kotlin 1.8.x ~ 1.9.22)
dependencies {

    // =======================================================================//
    // MADP library
    // =======================================================================//
    implementation files('libs/adpmobile-lib-r8.0.0.aar')
    implementation files('libs/omsdk-android-1.3.37-release.aar')

    // =======================================================================//
    // MADP library dependencies
    // =======================================================================//
    // retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
    implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'
    // google ads identifier
    implementation 'com.google.android.gms:play-services-ads-identifier:17.0.1'
    // google app set id
    implementation 'com.google.android.gms:play-services-appset:16.0.1'
    // gson
    implementation 'com.google.code.gson:gson:2.8.6'
    // Jetpack Security
    implementation 'androidx.security:security-crypto:1.1.0-alpha03'
    // activity-ktx
    implementation 'androidx.activity:activity-ktx:1.9.3'


}
MADP SDK 8.0.7 / 8.0.8 (Kotlin 2.0.0+) New-xxl.png
dependencies {

    // =======================================================================//
    // MADP library
    // =======================================================================//
    // 8.0.7 請改用 adpmobile-lib-r8.0.7.aar
    implementation files('libs/adpmobile-lib-r8.0.8.aar')
    implementation files('libs/omsdk-android-1.3.37-release.aar')

    // =======================================================================//
    // MADP library dependencies
    // =======================================================================//
    // retrofit
    implementation 'com.squareup.retrofit2:retrofit:3.0.0'
    implementation 'com.squareup.retrofit2:converter-gson:3.0.0'
    implementation 'com.squareup.retrofit2:converter-scalars:3.0.0'
    // google ads identifier
    implementation 'com.google.android.gms:play-services-ads-identifier:18.2.0'
    // google app set id
    implementation 'com.google.android.gms:play-services-appset:16.1.0'
    // gson
    implementation 'com.google.code.gson:gson:2.13.2'
    // Jetpack Security(僅 8.0.7 需要,8.0.8 起請移除此行)
    implementation 'androidx.security:security-crypto:1.1.0'
    // activity-ktx
    implementation 'androidx.activity:activity-ktx:1.11.0'


}


權限設定

Import SDK7 Step3-1.PNG


  • Required Permission
 <!-- TAmedia Required Permission -->
 <uses-permission android:name="android.permission.INTERNET" />
 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  • Optional Permission
 <!-- TAmedia Optional Permission -->
 <uses-permission android:name="android.permission.VIBRATE" /> 
 <uses-permission android:name="android.permission.CAMERA" />
 <uses-permission android:name="android.permission.RECORD_AUDIO" />
 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


高權限功能開關(8.0.8 起) New-xxl.png

8.0.8 起,廣告素材透過 WebView JS bridge 使用麥克風、相機、行事曆、閃光燈這四項功能前,必須由 App 端主動開啟對應的開關。四個開關預設皆為關閉,未開啟時 SDK 會忽略素材的呼叫。

開關 API

功能 開啟 查詢
麥克風 TWMMobileAds.setMicrophoneEnabled(boolean) TWMMobileAds.isMicrophoneEnabled()
相機 TWMMobileAds.setCameraEnabled(boolean) TWMMobileAds.isCameraEnabled()
行事曆 TWMMobileAds.setCalendarEnabled(boolean) TWMMobileAds.isCalendarEnabled()
閃光燈 TWMMobileAds.setFlashlightEnabled(boolean) TWMMobileAds.isFlashlightEnabled()

使用範例

以麥克風互動素材為例,在承載該素材的 Activity 進入時開啟,離開時關閉:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 本頁會投放需要麥克風互動的素材
    TWMMobileAds.setMicrophoneEnabled(true);
}

@Override
protected void onDestroy() {
    TWMMobileAds.setMicrophoneEnabled(false);
    super.onDestroy();
}


闔家適用計畫 / 兒童導向應用程式

本SDK的相依套件 play-services-ads-identifier 已於其manifest中宣告AD_ID權限,manifest合併後會自動出現在您的應用程式中。
若您的應用程式屬於 闔家適用計畫,或為兒童導向應用程式,請於AndroidManifest.xml中加入下列設定,移除AD_ID使用權限
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

<uses-permission android:name="com.google.android.gms.permission.AD_ID" tools:node="remove"/>
註:targetSdk 33 (Android 13) 以上的應用程式,使用廣告ID時必須宣告AD_ID權限;未宣告時廣告ID會被置換為全為零的字串。此為Android 13起的規則,與SDK版本無關。

詳情可參考Google網站說明:
2021 年 Google Play 服務更新
Google Play Policy - 家庭