すべてのプロダクト
Search
ドキュメントセンター

Web Application Firewall:Android 向けアプリ保護 SDK の統合

最終更新日:Aug 25, 2026

Android アプリでアプリ保護を有効にするには、機能を有効化する前にボット対策 SDK (本トピックでは SDK と呼びます) を統合します。

制限事項

Android API レベル 16 以降が必要です。アプリのターゲット API レベルが 16 未満の場合、SDK は正常に動作しません。

前提条件

開始する前に、以下をご用意ください:

  • アプリ保護 を購入し、有効化していること。「アプリ保護を有効化する手順」をご参照ください。

  • Android 向けの SDK パッケージ (AAR ファイル)。入手するには、DingTalk のサービスグループでテクニカルサポートに連絡するか、チケットを送信してください。ファイル名は AliTigerTally_X.Y.Z.aar です。X.Y.Z はバージョン番号です。

  • アプリキー (SDK 認証キー)。取得するには、WAF コンソールにログインし、保護設定 > Web サイト保護 を選択します。次に、[Bot Management] タブに移動し、アプリ保護 をオンにして、Appkey の取得およびコピー をクリックします。

Alibaba Cloud アカウントごとに一意のアプリキーが割り当てられます。このアプリキーは、Web Application Firewall (WAF) インスタンス内のすべてのドメイン名、および Android と iOS 両方のアプリで利用できます。アプリキーの例:
****OpKLvM6zliu6KopyHIhmneb_****u4ekci2W8i6F9vrgpEezqAzEzj2ANrVUhvAXMwYzgY_****vc51aEQlRovkRoUhRlVsf4IzO9dZp6nN_****Wz8pk2TDLuMo4pVIQvGaxH3vrsnSQiK****

仕組み

SDK は、アプリから送信される各リクエストに署名します。WAF はサーバー側でこれらの署名を検証し、悪意のあるトラフィックを検出してブロックした後、正当なリクエストをオリジンサーバーに転送します。

(オプション) テスト用 Android プロジェクトの作成

本番環境のアプリに適用する前に統合手順を試す場合は、まず Android Studio でテストプロジェクトを作成してください。

次の図は、TigerTally_sdk_test という名前のテストプロジェクトの例を示しています。

次の手順に進む前に、テストプロジェクトを実行して動作を確認してください。

SDK の統合

ステップ 1:Android Studio でプロジェクトを開く

Android Studio でプロジェクトを開き、プロジェクトのファイルディレクトリに移動します。

ステップ 2:AAR 依存関係の追加

  1. AliTigerTally_X.Y.Z.aar をプロジェクトの libs ディレクトリにコピーします。ファイルをディレクトリに直接ドラッグすることもできます。

  2. build.gradle を開き、以下の設定を追加します:

    • libs をローカルリポジトリとして宣言します:

      repositories {
          flatDir {
              dirs 'libs'
          }
      }
    • コンパイル依存関係を追加します:

      dependencies {
          compile(name: 'AliTigerTally_X.Y.Z', ext: 'aar')
      }
      重要: X.Y.Z は、ダウンロードした AAR ファイルの実際のバージョン番号に置き換えてください。
  3. [Sync Now] をクリックして変更を適用してください。

  4. ProGuard を使用してアプリを難読化している場合は、依存関係を追加した直後に次のルールを ProGuard 設定ファイルに追加してください。これにより、SDK のクラスがビルド時に削除されるのを防ぎ、ランタイムエラーを回避できます。

    -keep class com.aliyun.TigerTally.* {*;}

ステップ 3:(必要に応じて) ネイティブライブラリフィルターの設定

プロジェクトにすでに SO ファイルが含まれている場合は、この手順をスキップしてください。含まれていない場合は、以下の ndk ブロックを build.gradle に追加してください:

android {
    defaultConfig {
        ndk {
            abiFilters 'arm64-v8a', 'x86', 'armeabi-v7a'
            //abiFilters "armeabi-v7a"
        }
    }
}

ステップ 4:権限の要求

以下の権限を AndroidManifest.xml に追加してください。SDK の動作に必須なのは INTERNET のみです。

権限 必須 実行時リクエスト (Android 6.0+) 説明
android.permission.INTERNET はい いいえ — インストール時に自動的に付与されます SDK が署名付きリクエストを WAF に送信できるようにします。
android.permission.ACCESS_NETWORK_STATE いいえ いいえ — インストール時に自動的に付与されます リスクシグナルを強化するためにデバイスのネットワーク状態を読み取ります。
android.permission.ACCESS_WIFI_STATE いいえ いいえ — インストール時に自動的に付与されます リスクシグナルを強化するために Wi-Fi 接続状態を読み取ります。
android.permission.READ_PHONE_STATE いいえ はい — 実行時にリクエストする必要があります リスクシグナルを強化するためにデバイス ID を読み取ります。
android.permission.BLUETOOTH いいえ いいえ — インストール時に自動的に付与されます リスクシグナルを強化するために Bluetooth デバイス情報を読み取ります。
android.permission.READ_EXTERNAL_STORAGE いいえ はい — 実行時にリクエストする必要があります リスクシグナルを強化するために外部ストレージを読み取ります。
android.permission.CHANGE_NETWORK_STATE いいえ いいえ — インストール時に自動的に付与されます リスクシグナルを強化するためにネットワーク接続状態を変更します。

ステップ 5:統合コードの追加

5a. (オプション) ユーザー ID の設定

setAccount() を呼び出して、SDK リクエストにユーザー ID を関連付けます。これにより、WAF はユーザーレベルの保護ポリシーを適用できます。ユーザーがログインしていない場合は、この呼び出しをスキップし、代わりに init() を直接呼び出してください。

// Signature: int setAccount(String account)
// Returns: 0 on success, -1 on failure

final String account = "account"; // マスクされたユーザー ID を使用します
TigerTallyAPI.setAccount(account);
パラメータ タイプ 説明
account String ユーザー ID です。ユーザーのプライバシーを保護するため、マスクされた値を使用してください。

5b. SDK の初期化

アプリの起動時に init() を 1 回だけ呼び出してください。これにより、リスク分析に使用されるデバイス情報が 1 回だけ収集されます。

収集モードは 2 種類あります:

  • DEFAULT: 機密フィールド (imeiimsisimSerialwifiMacwifiListbluetoothMac) を含むすべてのデバイスデータを収集します。対応する権限が必要です。ユーザーがアプリのプライバシーポリシーに同意した後に、このモードを使用してください。

  • NOT_GRANTED: 機密フィールドをスキップします。ユーザーがプライバシーポリシーに同意する前に、このモードを使用してください。

// Signature: int init(Context context, String appkey, int type)
// Returns: 0 on success, -1 on failure

final String appkey = "your_appkey";

// 完全なデータ収集 (ユーザーがプライバシーポリシーに同意した後)
int ret = TigerTallyAPI.init(this.getApplicationContext(), appkey, TigerTallyAPI.CollectType.DEFAULT);

// 機密フィールドを除外 (ユーザーがプライバシーポリシーに同意する前)
int ret = TigerTallyAPI.init(this.getApplicationContext(), appkey, TigerTallyAPI.CollectType.NOT_GRANTED);

Log.d("AliSDK", "ret:" + ret);
パラメータ タイプ 説明
context Context アプリケーションコンテキストです。
appkey String WAF コンソールで取得したアプリキーです。
type CollectType データ収集モード:DEFAULT または NOT_GRANTED

5c. リクエストへの署名

送信する HTTP リクエストごとに、送信前に vmpSign() を呼び出してください。リクエストボディをバイト配列として渡します。GET リクエストまたは POST のボディが空の場合は、null または "".getBytes("UTF-8") を渡します。

// Signature: String vmpSign(int signType, byte[] input)
// Returns: wToken 署名文字列

String request_body = "i am the request body, encrypted or not!";
String wToken = null;
try {
    wToken = TigerTallyAPI.vmpSign(1, request_body.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
}
Log.d("AliSDK", "wToken:" + wToken);
パラメータ タイプ 説明
signType int 署名アルゴリズムです。デフォルトのアルゴリズムを使用する場合は 1 に設定します。
input byte[] 署名対象のリクエストボディです。GET リクエストや、ボディが空の POST リクエストの場合は、null または空のバイト配列を渡します。

5d. HTTP ヘッダーへの署名の追加

リクエスト送信前に、wToken の値を HTTP ヘッダーのプロパティとして設定してください。以下の例では HttpURLConnection を使用しています:

String request_body = "i am the request body, encrypted or not!";
new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            URL url = new URL("https://www.aliyundoc.com");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(5000);
            conn.setRequestMethod("POST");
            // wToken 署名をリクエストヘッダーに追加
            conn.setRequestProperty("wToken", wToken);
            OutputStream os = conn.getOutputStream();
            // リクエストボディを書き込む
            byte[] requestBody = request_body.getBytes("UTF-8");
            os.write(requestBody);
            os.flush();
            os.close();
            int code = conn.getResponseCode();
            Log.d("respCode", Integer.toString(code));
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}).start();

統合後の動作

統合が完了すると、アプリから送信される各リクエストに対して、以下の処理が行われます:

  1. vmpSign() がリクエストボディから wToken 署名を生成します。

  2. wToken を HTTP ヘッダーとして付与します。

  3. WAF が wToken ヘッダーを検査し、署名検証に失敗したリクエストをブロックし、有効なリクエストをオリジンサーバーに転送します。

次のステップ