このトピックでは、Anti-Bot SDKをAndroidアプリケーションに統合する方法について説明します。
Androidアプリケーション用のSDKファイル
Alibaba Cloudテクニカルサポートに問い合わせてSDKパッケージを入手し、ローカルマシンで解凍します。 次の表に、sdk-Androidフォルダに含まれるファイルを示します。
ファイル名 | 説明 |
SecurityGuardSDK-xxx.aar | 主なフレームワーク。 |
AVMPSDK-xxx.aar | 仮想マシンエンジンのプラグイン。 |
SecurityBodySDK-xxx.aar | ボット認識プラグイン。 |
yw_1222_0335_mwua.jpg | 仮想マシンの構成ファイル。 |
Androidプロジェクトの設定
![Androidプロジェクトの設定](https://help-static-aliyun-doc.aliyuncs.com/assets/img/ja-JP/1859002661/p7355.png)
- 解凍されたSDKパッケージからAndroid StudioにAARファイルをインポートします。 すべてのAARファイルをsdk-AndroidフォルダからAndroidアプリケーションプロジェクトのlibsディレクトリにコピーします。 説明 現在のプロジェクトにlibsディレクトリが存在しない場合は、指定したパスにlibsという名前のフォルダを手動で作成します。
- 設定を変更します。 プロジェクトのbuild.gradleファイルを開き、次のように設定を変更します。
- 依存関係を検索するためのソースとしてlibsディレクトリを追加します。
repositories{ flatDir { dirs 'libs' } }
- コンパイル依存関係を追加します。 説明 この例のAARファイルのバージョンは、ダウンロードしたファイルのバージョンとは異なる場合があります。
dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') compile ('com.android.support:appcompat-v7:23.0.0') compile (name:'AVMPSDK-external-release-xxx', ext:'aar') compile (name:'SecurityBodySDK-external-release-xxx', ext:'aar') コンパイル (名前: 'SecurityGuardSDK-external-release-xxx' 、ext:'aar') }
- 依存関係を検索するためのソースとしてlibsディレクトリを追加します。
- 解凍されたSDKパッケージからJPG設定ファイルをdrawableディレクトリに追加します。 sdk-Androidフォルダ内のyw_1222_0335_mwua.jpg設定ファイルをAndroidアプリケーションプロジェクトのdrawableディレクトリにコピーします。 説明 プロジェクトにdrawableディレクトリが存在しない場合は、指定したパスにdrawableという名前のフォルダを作成します。
- SOファイルが必要なため、冗長なアプリケーションバイナリインターフェイス (ABI) を削除します。 現在、Anti-Bot SDKは、armeabi、armeabi-v7a、およびarm64-v8aのためのSOファイルのみを提供しています。 警告 したがって、冗長なABIを除外する必要があります。 そうしないと、アプリケーションがクラッシュする可能性があります。
- Androidアプリケーションプロジェクトのlibsディレクトリで、armeabi、armeabi-v7a、arm64-v8a以外のすべてのCPUアーキテクチャファイル (x86、x86_64、mips、mips64など) を削除します。 armeabi、armeabi-v7a、およびarm64-v8aフォルダのみを保持します。
- 次のサンプルコードに示すように、アプリケーションプロジェクトのbuild.gradle構成ファイルにフィルタールールを追加します。 abiFiltersで指定されたアーキテクチャは、Androidアプリケーションパッケージ (APK) ファイルに含まれています。 説明 この例では、abiFiltersはarmeabiアーキテクチャのみを指定します。 必要に応じて、armeabi-v7aおよびarm64-v8アーキテクチャを指定することもできます。
defaultConfig { applicationId "com.xx.yy" minSdkVersion xx targetSdkVersion xx versionCode xx versionName "x.x.x" ndk { abiFilters "armeabi" // abiFilters "armeabi-v7a" // abiFilters "arm64-v8a" } }
説明 armeabiアーキテクチャのSOファイルのみを保持する場合、互換性に影響を与えることなく、アプリケーションのサイズを大幅に縮小できます。
- アプリケーションに権限を付与します。
- Android StudioプロジェクトとAARファイルを使用してSDKを統合する場合、必要な権限はAARファイルですでに指定されています。 プロジェクト内のアプリケーションに権限を付与する必要はありません。
- Eclipseプロジェクトを使用する場合は、AndroidMenifest.xmlファイルに次の権限を追加する必要があります。
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <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_SETTINGS" />
- ProGuard設定を追加します。 説明 ProGuardを使用してコードを難読化する必要がある場合は、ProGuard設定を追加する必要があります。 Android StudioとEclipseでProGuardを設定する方法は異なります。
- Android Studio proguardFilesパラメーターを設定し、minifyEnabledパラメーターがbuild.gradleファイルでtrueに設定されている場合、proguard-rules.proファイルを使用してコードを難読化します。
- Eclipse
ProGuard. config=proguard.cfg
ステートメントをproject.propertiesファイルに追加するなど、project.propertiesファイルでproguardを構成した場合、ProGuardを使用してコードを難読化します。説明 難読化設定は、proguard.cfgファイルで指定します。
保持ルールの追加
特定のクラスが難読化されないことを保証するには、ProGuard構成ファイルに次のルールを追加する必要があります。-クラスcom.taobao.securityjniを保持します。**{*;} -クラスcom.taobao.wireless.securityをキープ **{*;} -クラスcom.ut.secbodyを保持します。**{*;} -クラスcom.taobao.dpをキープ **{*;} -クラスcom.alibaba.wireless.securityを保持します。 **{*;}
- Android Studio
SDKを呼び出すCall the SDK
com.alibaba.wireless.security.jaq.JAQExceptionをインポートします。com.alibaba.wireless.security.jaq.avmp.IJAQAVMPSignComponentをインポートします。com.alibaba.wireless.security.open.SecurityGuardManagerをインポートします。com.alibaba.wireless.security.open.avmp.IAVMPGenericComponentをインポートします。
ステップ2: SDKの初期化
エンドポイント: boolean initialize();
機能: SDKを初期化します。
パラメータ: なし。
応答: ブール値。 初期化が成功した場合、trueが返されます。 初期化が失敗した場合、falseが返されます。
IJAQAVMPSignComponent jaqVMPComp = SecurityGuardManager.getInstance(getApplicationContext()).getInterface(IJAQAVMPSignComponent.class);
ブール結果=jaqVMPComp.initialize();
ステップ3: 署名要求
エンドポイント: byte[] avmpSign(int signType, byte[] input);
関数: Ali Virtual Machine Protect (AVMP) 手法を使用して入力データに署名し、署名文字列を返します。
パラメーター | データ型 | 必須/任意 | 説明 |
signType | int | 必須 | リクエストの署名に使用されるアルゴリズム。 値を3 に設定します。 |
入力 | byte[] | 任意 | 署名されるデータ。通常はリクエストボディ全体です。 説明 リクエストボディが空の場合 (POSTまたはGETリクエストボディが空の場合) 、nullまたは ".getBytes(" UTF-8 ") などのBytesパラメーターの値を入力します。 |
応答: byte[] データ型の署名文字列。
int VMP_SIGN_WITH_GENERAL_WUA2 = 3;
String request_body = "i am the request body, encrypted or not!";
byte[] result = jaqVMPComp.avmpSign(VMP_SIGN_WITH_GENERAL_WUA2, request_body.getBytes("UTF-8"));
String wToken = new String (結果、"UTF-8");
Log.d("wToken", wToken);
ステップ4: wTokenをプロトコルヘッダーに追加
wTokenフィールドの内容をHttpURLConnectionクラスのオブジェクトに追加します。
String request_body = "i am the request body, encrypted or not!";
URL url=新しいURL (「http://www.aliyundoc.com」);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
// wToken infoをヘッダーに設定する
conn.setRequestProperty("wToken", wToken);
OutputStream os = conn.getOutputStream();
// リクエスト本文情報を設定する
byte[] requestBody = request_body.getBytes("UTF-8");
os.write(requestBody);
os.flush();
os.close();
ステップ5: データをサーバーに送信
エラーコード
initializeメソッドとavmpSigniメソッドを呼び出すと、エラーが発生することがあります。 エラーが発生した場合、またはSDKが署名文字列の生成に失敗した場合は、キーワードSecException
を使用して、ログデータ内の関連情報を検索します。
次の表に、一般的なエラーコードを示します。
エラーコード | 説明 |
1901 | パラメーターが無効な場合に返されるエラーコード。 パラメーターを確認します。 |
1902 | イメージファイルが無効な場合に返されるエラーコード。 画像ファイルの取得に使用されるAPK署名は、アプリケーションの署名と同じではありません。 アプリケーションのAPKシグネチャを使用して、新しい画像を生成します。 |
1903 | イメージファイルの形式が無効な場合に返されるエラーコード。 |
1904 | イメージのバージョンをアップグレードします。 AVMP署名機能はv5イメージのみをサポートします。 |
1905 | 指定されたイメージファイルが見つからない場合に返されるエラーコード。 イメージファイルがres\drawableディレクトリにあり、AVMPイメージがyw_1222_0335_mwua.jpgファイルにあることを確認してください。 |
1906 | イメージのAVMP署名に必要なバイトコードがないため、エラーコードが返されます。 イメージが無効かどうかを確認します。 |
1907 | AVMPの初期化に失敗した場合に返されるエラーコード。 しばらくしてから再試行します。 |
1910 | AVMPインスタンスが無効な場合に返されるエラーコード。 考えられる原因は次のとおりです。
|
1911 | 暗号化されたイメージのバイトコードに必要なエクスポート機能がない場合に返されるエラーコード。 |
1912 | システムがAVMPの呼び出しに失敗した場合に返されるエラーコード。 Alibaba Cloudテクニカルサポートにお問い合わせください。 |
1913 | AVMPインスタンスが破棄された後にInvokeAVMPメソッドが呼び出されたために返されるエラーコード。 |
1915 | AVMPインスタンスのメモリリソースが不足している場合に返されるエラーコード。 しばらくしてから再試行します。 |
1999 | 不明なエラーが発生した場合に返されるエラーコード。 しばらくしてから再試行します。 |
統合を確認するVerify the integration
次の手順を実行して、Anti-Bot SDKがアプリケーションに正しく統合されていることを確認します。
- ファイル名の拡張子を変更して、パッケージ化されたAPKファイルをZIPファイルに変換し、ローカルマシンでファイルを解凍します。
- プロジェクトのlibsディレクトリに移動し、フォルダーにarmeabi、armeabi-v7a、およびarm64-v8aサブフォルダーのみが含まれていることを確認します。 説明 他のアーキテクチャファイルが存在する場合は、削除します。 詳細については、「Androidプロジェクトの設定」をご参照ください。
- プロジェクトのres/drawableディレクトリに移動し、yw_1222_0335_mwua.jpgファイルが存在し、サイズが0でないことを確認します。
- ログを印刷し、avmpSignメソッドが呼び出された後に正しい署名情報が生成されることを確認します。 説明 署名情報を生成できない場合は、エラーコードとトラブルシューティングの説明を参照してください。
よくある質問
shrinkResourcesをtrueに設定した後、キーイメージが正しく最適化されないのはなぜですか。
Android StudioでshrinkResourcesをtrueに設定すると、コードで参照されていないリソースファイルがプロジェクトのコンパイル中に最適化される場合があります。 shrinkResourcesをtrueに設定すると、Anti-Bot SDKのJPGファイルが期待どおりに機能しない場合があります。 パッケージ化されたAPK内のyw_1222_0335.jpg設定ファイルのサイズが0 KBの場合、画像ファイルが最適化されていることを示します。
ソリューション
- プロジェクトのresディレクトリにrawという名前のディレクトリを作成し、rawディレクトリにkeep.xmlという名前のファイルを作成します。
- 次のコンテンツをkeep.xmlファイルに追加します。
<? xml version="1.0" encoding="utf-8"? > <resources xmlns:tools="http://schemas.android.com/tools" ツール: keep="@ drawable/yw_1222_0335.jpg,@ drawable/yw_1222_0335_mwua.jpg" />
- コンテンツを追加したら、プロジェクトAPKを再度コンパイルします。