管理端全部功能跑通
This commit is contained in:
@@ -1,148 +1,77 @@
|
||||
# Alicloud HTTPDNS Android SDK
|
||||
# HTTPDNS Android SDK (SNI Hidden v1.0.0)
|
||||
|
||||
面向 Android 的 HTTP/HTTPS DNS 解析 SDK,提供鉴权与可选 AES 加密、IPv4/IPv6 双栈解析、缓存与调度、预解析等能力。最低支持 Android API 19(Android 4.4)。
|
||||
|
||||
## 功能特性
|
||||
|
||||
- 鉴权请求与可选 AES 传输加密
|
||||
- IPv4/IPv6 双栈解析,支持自动/同时解析
|
||||
- 内存 + 持久化缓存与 TTL 控制,可选择复用过期 IP
|
||||
- 预解析、区域路由、网络切换自动刷新
|
||||
- 可定制日志回调与会话追踪 `sessionId`
|
||||
|
||||
## 安装(Gradle)
|
||||
|
||||
在项目的 `build.gradle` 中添加:
|
||||
|
||||
```groovy
|
||||
dependencies {
|
||||
implementation 'com.aliyun.ams:alicloud-android-httpdns:2.6.7'
|
||||
}
|
||||
```
|
||||
|
||||
请访问 [Android SDK发布说明](https://help.aliyun.com/document_detail/435251.html) 查看最新版本号。
|
||||
|
||||
## 快速开始
|
||||
|
||||
### Java
|
||||
## 1. Init
|
||||
|
||||
```java
|
||||
import com.alibaba.sdk.android.httpdns.HttpDns;
|
||||
import com.alibaba.sdk.android.httpdns.HttpDnsService;
|
||||
import com.alibaba.sdk.android.httpdns.InitConfig;
|
||||
import com.alibaba.sdk.android.httpdns.RequestIpType;
|
||||
|
||||
// 初始化配置
|
||||
String appId = "app1f1ndpo9";
|
||||
|
||||
new InitConfig.Builder()
|
||||
.setContext(context)
|
||||
.setSecretKey("YOUR_SECRET_KEY")
|
||||
.setEnableExpiredIp(true) // 允许返回过期 IP
|
||||
.buildFor("YOUR_ACCOUNT_ID");
|
||||
.setPrimaryServiceHost("httpdns-a.example.com")
|
||||
.setBackupServiceHost("httpdns-b.example.com")
|
||||
.setServicePort(443)
|
||||
.setSecretKey("your-sign-secret") // optional if sign is enabled
|
||||
.setEnableHttps(true)
|
||||
.buildFor(appId);
|
||||
|
||||
// 获取实例
|
||||
HttpDnsService httpDns = HttpDns.getService("YOUR_ACCOUNT_ID");
|
||||
|
||||
// 预解析热点域名
|
||||
httpDns.setPreResolveHosts(new ArrayList<>(Arrays.asList("www.aliyun.com")));
|
||||
|
||||
// 解析域名
|
||||
HTTPDNSResult result = httpDns.getHttpDnsResultForHostSyncNonBlocking("www.aliyun.com", RequestIpType.auto);
|
||||
String[] ips = result.getIps();
|
||||
HttpDnsService httpDnsService = HttpDns.getService(appId);
|
||||
```
|
||||
|
||||
### Kotlin
|
||||
|
||||
```kotlin
|
||||
import com.alibaba.sdk.android.httpdns.HttpDns
|
||||
import com.alibaba.sdk.android.httpdns.InitConfig
|
||||
import com.alibaba.sdk.android.httpdns.RequestIpType
|
||||
|
||||
// 初始化配置
|
||||
InitConfig.Builder()
|
||||
.setContext(context)
|
||||
.setSecretKey("YOUR_SECRET_KEY")
|
||||
.setEnableExpiredIp(true) // 允许返回过期 IP
|
||||
.buildFor("YOUR_ACCOUNT_ID")
|
||||
|
||||
// 获取实例
|
||||
val httpDns = HttpDns.getService("YOUR_ACCOUNT_ID")
|
||||
|
||||
// 预解析热点域名
|
||||
httpDns.setPreResolveHosts(arrayListOf("www.aliyun.com"))
|
||||
|
||||
// 解析域名
|
||||
val result = httpDns.getHttpDnsResultForHostSyncNonBlocking("www.aliyun.com", RequestIpType.auto)
|
||||
val ips = result.ips
|
||||
```
|
||||
|
||||
### 提示
|
||||
|
||||
- 启动时通过 `setPreResolveHosts()` 预热热点域名
|
||||
- 如需在刷新期间容忍 TTL 过期,可开启 `setEnableExpiredIp(true)`
|
||||
- 使用 `getSessionId()` 并与选用 IP 一同记录,便于排障
|
||||
|
||||
## 源码构建
|
||||
|
||||
```bash
|
||||
./gradlew clean :httpdns-sdk:assembleRelease
|
||||
```
|
||||
|
||||
构建产物位于 `httpdns-sdk/build/outputs/aar/` 目录。
|
||||
|
||||
### 版本说明
|
||||
|
||||
项目使用 `productFlavors` 区分不同版本:
|
||||
- `normal`:中国大陆版本
|
||||
- `intl`:国际版本
|
||||
- `end2end`:用于单元测试
|
||||
|
||||
## 测试
|
||||
|
||||
### 运行单元测试
|
||||
|
||||
```bash
|
||||
./gradlew clean :httpdns-sdk:testEnd2endForTestUnitTest
|
||||
```
|
||||
|
||||
### Demo 应用
|
||||
|
||||
SDK 提供了两个 Demo:
|
||||
|
||||
#### 1. app module(旧版 Demo)
|
||||
|
||||
在 `MyApp.java` 中配置测试账号:
|
||||
## 2. Resolve
|
||||
|
||||
```java
|
||||
private HttpDnsHolder holderA = new HttpDnsHolder("请替换为测试用A实例的accountId", "请替换为测试用A实例的secret");
|
||||
private HttpDnsHolder holderB = new HttpDnsHolder("请替换为测试用B实例的accountId", null);
|
||||
HTTPDNSResult result = httpDnsService.getHttpDnsResultForHostSyncNonBlocking(
|
||||
"api.business.com",
|
||||
RequestIpType.auto,
|
||||
null,
|
||||
null
|
||||
);
|
||||
```
|
||||
|
||||
> 两个实例用于测试实例间互不影响,体验时只需配置一个
|
||||
## 3. Official HTTP Adapter (IP + Empty-SNI + Host)
|
||||
|
||||
#### 2. demo module(推荐)
|
||||
```java
|
||||
import com.alibaba.sdk.android.httpdns.network.HttpDnsAdapterOptions;
|
||||
import com.alibaba.sdk.android.httpdns.network.HttpDnsAdapterRequest;
|
||||
import com.alibaba.sdk.android.httpdns.network.HttpDnsAdapterResponse;
|
||||
import com.alibaba.sdk.android.httpdns.network.HttpDnsHttpAdapter;
|
||||
|
||||
使用 Kotlin + MVVM 开发,功能更丰富。在 `demo/build.gradle` 中配置测试账号:
|
||||
HttpDnsHttpAdapter adapter = HttpDns.buildHttpClientAdapter(
|
||||
httpDnsService,
|
||||
new HttpDnsAdapterOptions.Builder()
|
||||
.setConnectTimeoutMillis(3000)
|
||||
.setReadTimeoutMillis(5000)
|
||||
.setRequestIpType(RequestIpType.auto)
|
||||
.setAllowInsecureCertificatesForDebugOnly(false)
|
||||
.build()
|
||||
);
|
||||
|
||||
```groovy
|
||||
buildConfigField "String", "ACCOUNT_ID", "\"请替换为测试用实例的accountId\""
|
||||
buildConfigField "String", "SECRET_KEY", "\"请替换为测试用实例的secret\""
|
||||
buildConfigField "String", "AES_SECRET_KEY", "\"请替换为测试用实例的aes\""
|
||||
HttpDnsAdapterResponse response = adapter.execute(
|
||||
new HttpDnsAdapterRequest("GET", "https://api.business.com/v1/ping")
|
||||
);
|
||||
```
|
||||
|
||||
## 依赖与要求
|
||||
Behavior is fixed:
|
||||
- Resolve by `/resolve`.
|
||||
- Connect to resolved IP over HTTPS.
|
||||
- Keep `Host` header as business domain.
|
||||
- No fallback to domain direct request.
|
||||
|
||||
- Android API 19+(Android 4.4+)
|
||||
- 需要权限:`INTERNET`、`ACCESS_NETWORK_STATE`
|
||||
## 4. Public Errors
|
||||
|
||||
## 安全说明
|
||||
- `NO_IP_AVAILABLE`
|
||||
- `TLS_EMPTY_SNI_FAILED`
|
||||
- `HOST_ROUTE_REJECTED`
|
||||
- `RESOLVE_SIGN_INVALID`
|
||||
|
||||
- 切勿提交真实的 AccountID/SecretKey,请通过本地安全配置或 CI 注入
|
||||
- 若担心设备时间偏差影响鉴权,可使用 `setAuthCurrentTime()` 校正时间
|
||||
## 5. Removed Public Params
|
||||
|
||||
## 文档
|
||||
|
||||
官方文档:[Android SDK手册](https://help.aliyun.com/document_detail/435250.html)
|
||||
|
||||
## 感谢
|
||||
|
||||
本项目中 Inet64Util 工具类由 [Shinelw](https://github.com/Shinelw) 贡献支持,感谢。
|
||||
Do not use legacy public parameters:
|
||||
- `accountId`
|
||||
- `serviceDomain`
|
||||
- `endpoint`
|
||||
- `aesSecretKey`
|
||||
|
||||
Reference in New Issue
Block a user