「Android SDK の統合プロセス」のトピックでは、Android SDK のインポートと構成、IP アドレスの解決、SDK のネットワークライブラリへの適用、および統合の検証方法について説明します。このトピックでは、Android クライアントで Alibaba Cloud OSS SDK と HTTPDNS を統合するための特定のソリューションについて説明します。
1. 背景
Alibaba Cloud Object Storage Service (OSS) は、開発者がさまざまなアプリケーションでプロフィール写真、イメージ、オーディオ、ビデオなどのファイルを保存およびアクセスできるようにするユニバーサルクラウドストレージサービスです。Android では、OSS Android SDK を統合してこのサービスを使用できます。
ファイル転送の安定性と速度を向上させるために、HTTPDNS SDK と OSS Android SDK を組み合わせて OSS ドメイン名を解析できます。このメソッドは、ドメイン名のハイジャックを防ぎ、DNS 解析を高速化します。これにより、アプリケーションが OSS にアクセスするときのネットワークエクスペリエンスが最適化されます。
2. OkHttp に基づいて HTTPDNS SDK を統合する
HTTPDNS を統合するために、OkHttp のカスタム DNS インターフェースを実装できます。 詳細については、「Android 上の OkHttp で HTTPDNS を使用する際のベストプラクティス」をご参照ください。
class OkHttpDns constructor(context: Context): Dns {
private var mContext: Context
init {
mContext = context
}
@Throws(UnknownHostException::class)
override fun lookup(host: String): List<InetAddress> {
val httpdnsResult: HTTPDNSResult = HttpDns.getService(accountID)
.getHttpDnsResultForHostSync(host, RequestIpType.both)
val inetAddresses: MutableList<InetAddress> = ArrayList()
var address: InetAddress
try {
if (httpdnsResult.ips != null) {
// IPv4 アドレスを処理する
for (ipv4 in httpdnsResult.ips) {
address = InetAddress.getByName(ipv4)
inetAddresses.add(address)
}
}
if (httpdnsResult.ipv6s != null) {
// IPv6 アドレスを処理する
for (ipv6 in httpdnsResult.ipv6s) {
address = InetAddress.getByName(ipv6)
inetAddresses.add(address)
}
}
} catch (e: UnknownHostException) {
}
return if (!inetAddresses.isEmpty()) {
inetAddresses
} else Dns.SYSTEM.lookup(host)
}
}public class OkHttpDns implements Dns {
private Context mContext;
public OkHttpDns(Context context) {
mContext = context;
}
@Overridepublic List<InetAddress> lookup(String host) throws UnknownHostException {
HTTPDNSResult httpdnsResult = HttpDns.getService(accountID).getHttpDnsResultForHostSync(host, RequestIpType.both);
List<InetAddress> inetAddresses = new ArrayList<>();
InetAddress address;
try {
if (httpdnsResult.getIps() != null) {
// IPv4 アドレスを処理する
for (String ipv4 : httpdnsResult.getIps()) {
address = InetAddress.getByName(ipv4);
inetAddresses.add(address);
}
}
if (httpdnsResult.getIpv6s() != null) {
// IPv6 アドレスを処理する
for (String ipv6 : httpdnsResult.getIpv6s()) {
address = InetAddress.getByName(ipv6);
inetAddresses.add(address);
}
}
} catch (UnknownHostException e) {
}
if (!inetAddresses.isEmpty()) {
return inetAddresses;
}
return okhttp3.Dns.SYSTEM.lookup(host);
}
}3. OSS SDK を統合し、HTTPDNS を使用する
OKHttpClient インスタンスを作成し、デフォルトの DNS サービスを置き換えるように OSS 用に構成できます。 OSS SDK の統合と使用方法の詳細については、「OSS Android SDK」をご参照ください。
// OSS クライアント構成を作成します。
val conf = ClientConfiguration()
conf.connectionTimeout = 15 * 1000 // 接続タイムアウト。デフォルト値:15 秒。
conf.socketTimeout = 15 * 1000 // ソケットタイムアウト。デフォルト値:15 秒。
conf.maxConcurrentRequest = 5 // 同時リクエストの最大数。デフォルト値:5。
conf.maxErrorRetry = 2 // 失敗時の再試行の最大数。デフォルト値:2。
val builder = OkHttpClient.Builder()
.dns(OkHttpDns(applicationContext))
// カスタム okHttpClient を設定すると、ClientConfiguration の一部の設定が無効になります。 builder で手動で設定する必要があります。
if (conf != null) {
val dispatcher = Dispatcher()
dispatcher.maxRequests = conf.maxConcurrentRequest
builder.connectTimeout(conf.connectionTimeout.toLong(), TimeUnit.MILLISECONDS)
.readTimeout(conf.socketTimeout.toLong(), TimeUnit.MILLISECONDS)
.writeTimeout(conf.socketTimeout.toLong(), TimeUnit.MILLISECONDS)
.followRedirects(conf.isFollowRedirectsEnable)
.followSslRedirects(conf.isFollowRedirectsEnable)
.dispatcher(dispatcher)
if (conf.proxyHost != null && conf.proxyPort != 0) {
builder.proxy(Proxy(Proxy.Type.HTTP, InetSocketAddress(conf.proxyHost, conf.proxyPort)))
}
}
// Android OSS SDK 2.9.12 以降のみ conf.setOkHttpClient() メソッドをサポートしています。
conf.okHttpClient = builder.build()
val oss = OSSClient(applicationContext, endpoint, credentialProvider, conf)
// OSS クライアント構成を作成します。
ClientConfiguration conf = new ClientConfiguration();
conf.setConnectionTimeout(15 * 1000); // 接続タイムアウト。デフォルト値:15 秒。
conf.setSocketTimeout(15 * 1000); // ソケットタイムアウト。デフォルト値:15 秒。
conf.setMaxConcurrentRequest(5); // 同時リクエストの最大数。デフォルト値:5。
conf.setMaxErrorRetry(2); // 失敗時の再試行の最大数。デフォルト値:2。
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.dns(new OkHttpDns(getApplicationContext()));
// カスタム okHttpClient を設定すると、ClientConfiguration の一部の設定が無効になります。 builder で手動で設定する必要があります。
if (conf != null) {
Dispatcher dispatcher = new Dispatcher();
dispatcher.setMaxRequests(conf.getMaxConcurrentRequest());
builder.connectTimeout(conf.getConnectionTimeout(), TimeUnit.MILLISECONDS)
.readTimeout(conf.getSocketTimeout(), TimeUnit.MILLISECONDS)
.writeTimeout(conf.getSocketTimeout(), TimeUnit.MILLISECONDS)
.followRedirects(conf.isFollowRedirectsEnable())
.followSslRedirects(conf.isFollowRedirectsEnable())
.dispatcher(dispatcher);
if (conf.getProxyHost() != null && conf.getProxyPort() != 0) {
builder.proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(conf.getProxyHost(), conf.getProxyPort())));
}
}
// Android OSS SDK 2.9.12 以降のみ conf.setOkHttpClient() メソッドをサポートしています。
conf.setOkHttpClient(builder.build());
OSS oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider, conf);OSS SDK を初期化する前に、HTTPDNS SDK を初期化する必要があります。
4. まとめ
HTTPDNS SDK と OSS SDK を組み合わせることで、DNS ハイジャックを防ぎ、ファイル転送を高速化します。これにより、アクセスの安定性とセキュリティが向上します。
この実装の中核は、OSS の HTTPDNS 解析ロジックを使用するカスタム OkHttpClient を構成することです。
キーポイント:
OkHttpClientをカスタマイズした後、タイムアウトや同時実行性などの構成をClientConfigurationからOkHttpClient.Builderに手動で転送する必要があります。 そうしないと、元の構成が無効になります。OSS SDK のバージョンが 2.9.12 以降であることを確認し、OSS を初期化する前に HTTPDNS を初期化してください。