為Android應(yīng)用集成SDK
本文中含有需要您注意的重要提示信息,忽略該信息可能對您的業(yè)務(wù)造成影響,請務(wù)必仔細(xì)閱讀。
參考以下SDK集成說明為您的Android應(yīng)用集成爬蟲防護(hù)SDK。
Android SDK文件
聯(lián)系阿里云技術(shù)支持人員獲取對應(yīng)的SDK包后,將其解壓至本地。下表描述了解壓獲得的sdk-Android文件夾中包含的文件。
文件名 | 說明 |
SecurityGuardSDK-xxx.aar | 主框架SDK文件 |
AVMPSDK-xxx.aar | 虛擬機(jī)引擎插件 |
SecurityBodySDK-xxx.aar | 人機(jī)識別插件 |
yw_1222_0335_mwua.jpg | 虛擬機(jī)引擎配置文件 |
配置Android工程
在Android Studio中導(dǎo)入解壓SDK獲得的.aar文件。將sdk-Android文件夾中所有.aar文件復(fù)制到Android應(yīng)用工程的libs目錄中。
說明如果當(dāng)前工程中不存在libs目錄,請在指定路徑下手動創(chuàng)建libs文件夾。
編輯配置信息。打開該Module的build.gradle文件,完成以下配置修改。
將libs目錄添加為查找依賴的源。
repositories{ flatDir { dirs 'libs' } }
添加編譯依賴。
說明.aar文件的版本號可能有所不同,以您下載解壓得到的文件名為準(zhǔn)。
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') compile (name:'SecurityGuardSDK-external-release-xxx', ext:'aar') }
將解壓SDK獲得的.jpg配置文件導(dǎo)入drawable目錄。將sdk-Android文件夾中的yw_1222_0335_mwua.jpg配置文件復(fù)制到Android應(yīng)用工程的drawable目錄中。
說明如果當(dāng)前工程中不存在drawable目錄,請在指定路徑下手動創(chuàng)建drawable文件夾。
過濾ABI(刪除多余架構(gòu)SO)。爬蟲防護(hù)SDK目前僅支持armeabi、armeabi-v7a、arm64-v8a架構(gòu)的SO。
警告您必須對最終導(dǎo)出的ABI進(jìn)行過濾,否則可能導(dǎo)致應(yīng)用崩潰。
在Android應(yīng)用工程的lib目錄中,刪除armeabi、armeabi-v7a、arm64-v8a文件夾以外所有其他CPU架構(gòu)的文件夾,包括x86、x86_64、mips、mips64等,只保留armeabi、armeabi-v7a、arm64-v8a文件夾。
參考以下代碼示例,在應(yīng)用工程的build.gradle配置文件中增加過濾規(guī)則,被abiFilters指定的架構(gòu)將會被包含在APK文件中。
說明本代碼示例中僅指定了armeabi架構(gòu),您可以根據(jù)實際情況指定或兼容armeabi-v7a、arm64-v8a架構(gòu)。
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架構(gòu)的SO,不會影響應(yīng)用的兼容性,還能大幅減小應(yīng)用的體積。
添加應(yīng)用權(quán)限。
如果是Android Studio項目,并且使用了aar方式進(jìn)行集成,由于在.aar文件中已經(jīng)聲明了相關(guān)權(quán)限,因此不需要在項目中額外配置權(quán)限。
如果是Eclipse項目,您需要在AndroidManifest.xml文件中添加以下權(quán)限配置:
<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進(jìn)行混淆,則需要添加ProGuard配置。ProGuard的配置根據(jù)集成方式的不同,分為Eclipse和Android Studio兩種情況。
Android Studio
如果在build.gradle中配置了proguardFiles,并且開啟了minifyEnabled,則表明使用了proguard-rules.pro配置文件進(jìn)行混淆。
Eclipse
如果在project.properties中指定了proguard配置,例如在project.properties中存在
proguard.config=proguard.cfg
語句,則表明使用了proguard進(jìn)行混淆。說明混淆配置在proguard.cfg文件中。
添加keep規(guī)則
為了保證一些需要的類不被混淆,需要在proguard的配置文件中添加以下規(guī)則:
-keep class com.taobao.securityjni.**{*;} -keep class com.taobao.wireless.security.**{*;} -keep class com.ut.secbody.**{*;} -keep class com.taobao.dp.**{*;} -keep class com.alibaba.wireless.security.**{*;}
調(diào)用SDK接口
步驟1:導(dǎo)入包
import com.alibaba.wireless.security.jaq.JAQException;
import com.alibaba.wireless.security.jaq.avmp.IJAQAVMPSignComponent;
import com.alibaba.wireless.security.open.SecurityGuardManager;
import com.alibaba.wireless.security.open.avmp.IAVMPGenericComponent;
步驟2:初始化
接口定義:boolean initialize();
功能:初始化SDK。
接口參數(shù):無。
返回值:Boolean類型。初始化成功返回true,失敗返回false。
示例代碼
IJAQAVMPSignComponent jaqVMPComp = SecurityGuardManager.getInstance(getApplicationContext()).getInterface(IJAQAVMPSignComponent.class);
boolean result = jaqVMPComp.initialize();
步驟3:簽名請求數(shù)據(jù)
接口定義:byte[] avmpSign(int signType, byte[] input);
功能:使用avmp技術(shù)對input的數(shù)據(jù)進(jìn)行簽名處理,并且返回簽名串。
接口參數(shù)
名稱 | 類型 | 是否必須 | 描述 |
signType | int | 是 | 簽名使用的算法。目前是固定值,填寫 |
input | byte[] | 否 | 待簽名的數(shù)據(jù),一般是整個請求體(request body)。 說明 如果請求體為空(例如POST請求的body為空、或者GET請求),則填寫空對象null或空字符串的Bytes值(例如,"".getBytes("UTF-8"))。 |
返回值:byte[]類型,返回簽名串。
示例代碼:客戶端向服務(wù)器端發(fā)送數(shù)據(jù)時,需要調(diào)用avmpSign接口對整個body數(shù)據(jù)進(jìn)行簽名處理,所得到的簽名串就是wToken。
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(result, "UTF-8");
Log.d("wToken", wToken);
步驟4:將wToken放進(jìn)協(xié)議頭
在HttpURLConnection類的對象中添加wToken字段的內(nèi)容。
示例代碼
String request_body = "i am the request body, encrypted or not!";
URL url = new URL("http://www.aliyundoc.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
// set wToken info to header
conn.setRequestProperty("wToken", wToken);
OutputStream os = conn.getOutputStream();
// set request body info
byte[] requestBody = request_body.getBytes("UTF-8");
os.write(requestBody);
os.flush();
os.close();
步驟5:發(fā)送數(shù)據(jù)到服務(wù)器
將修改好協(xié)議頭的數(shù)據(jù)發(fā)送到App自有服務(wù)器,中間會由Anti-Bot截獲,并通過解析wToken進(jìn)行風(fēng)險識別。
被簽名的請求體應(yīng)該與客戶端實際發(fā)送的請求體完全一致。完全一致的含義包括請求體中字符串的編碼格式、空格、特殊字符以及參數(shù)的順序等均一致,否則將導(dǎo)致簽名驗證失敗。
錯誤碼
上述initialize和avmpSign接口的調(diào)用過程中可能出現(xiàn)異常。如果生成簽名串異常或失敗,請在Log中搜索與SecException
相關(guān)的信息。
下表描述了常見錯誤碼及含義。
錯誤碼 | 含義 |
1901 | 參數(shù)不正確,請檢查輸入的參數(shù)。 |
1902 | 圖片文件有問題。一般是獲取圖片文件時的APK簽名和當(dāng)前程序的APK簽名不一致。請使用當(dāng)前程序的APK重新生成圖片。 |
1903 | 圖片文件格式有問題。 |
1904 | 請升級新版本圖片。AVMP簽名功能僅支持V5圖片。 |
1905 | 沒有找到圖片文件。請確保圖片文件在res\drawable目錄下,與AVMP相關(guān)的圖片為yw_1222_0335_mwua.jpg。 |
1906 | 圖片中缺少AVMP簽名對應(yīng)的byteCode。請檢查使用的圖片是否正確。 |
1907 | 初始化AVMP失敗,請重試。 |
1910 | 非法的avmpInstance實例。可能由于以下原因?qū)е拢?
|
1911 | 加密圖片的byteCode沒有相應(yīng)導(dǎo)出的函數(shù)。 |
1912 | AVMP調(diào)用失敗。請聯(lián)系我們。 |
1913 | AVMPInstance被destroy后,調(diào)用InvokeAVMP出現(xiàn)該錯誤。 |
1915 | AVMP調(diào)用內(nèi)存不足,請重試。 |
1999 | 未知錯誤,請重試。 |
確認(rèn)集成效果
您可以參考以下步驟,確認(rèn)您的應(yīng)用已正確集成了爬蟲防護(hù)SDK。
將打包生成的APK文件通過修改擴(kuò)展名的方式轉(zhuǎn)換成ZIP壓縮文件,并將該壓縮文件解壓至本地。
定位到工程的lib目錄,確保文件夾中只存在armeabi、armeabi-v7a、arm64-v8a文件夾。
說明如果存在其他架構(gòu)的文件夾,請參見配置Android工程,移除其他架構(gòu)的文件夾。
定位到工程的res/drawable目錄,確認(rèn)存在yw_1222_0335_mwua.jpg文件,且文件大小不為0。
通過打印日志,確保調(diào)用avmpSign接口后能生成正確的簽名信息。
說明如果簽名信息未生成,請參見錯誤碼信息進(jìn)行排查。
常見問題
為什么指定shrinkResources后,密鑰圖片被錯誤地優(yōu)化?
在Android Studio中,如果指定shrinkResources為true,在工程編譯時可能對未在代碼中引用的資源文件進(jìn)行優(yōu)化。該操作可能導(dǎo)致爬蟲防護(hù)SDK中的.jpg文件無法正常工作。如果打包后得到APK中,yw_1222_0335.jpg配置文件的大小為0KB,則表明該圖片文件已被優(yōu)化。
解決方法
在工程的res目錄中新建raw目錄,并在raw目錄中創(chuàng)建keep.xml文件。
在keep.xml文件中,添加以下內(nèi)容。
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@drawable/yw_1222_0335.jpg,@drawable/yw_1222_0335_mwua.jpg" />
添加完成后,重新編譯工程APK即可。