クイックスタート
このクイックスタートガイドでNetFUNNEL 4 Androidエージェントを5-10分以内に実行してください。
このガイドでできること
- コードベース統合: AndroidコードからNetFUNNEL関数を呼び出してトラフィック制御を適用
- 基本コントロール: Activity進入、ボタンクリック、API呼び出しに対する進入速度制限
- 区間コントロール: 特定のアプリケーション区間内の同時ユーザー制御
制御タイプの選択
どの制御タイプを使用すべきか確信がありませんか?統合方法概要を確認して基本コントロールと区間コントロール方式を比較し、ユースケースに最も適した方法を見つけてください。
事前要件
- NetFUNNELコンソールへのアクセス
- Android Studio環境
- Android開発の基本理解 (Java/Kotlin)
- Android API Level 22 (Lollipop 5.1) 以上
練習プロジェクト提供
練習用の基本プロジェクトが必要ですか?NetFUNNEL SDK統合の練習用に**Androidアプリケーション(単一Activity)**テンプレートを含むサンプルプロジェクトを確認してください。
ステップ1: SDKインストールおよびエージェントの初期化
1.1 NetFUNNELコンソールからSDKをダウンロード
- NetFUNNELコンソールにログインします
- エージェント → モバイルエージェント → Androidに移動します
- ZIPファイルをダウンロードします:
netfunnel-android-agent-{{version}}.zip - AARファイルを取得するために解凍します:
netfunnel-android-agent-debug-{{version}}.aar(開発用)netfunnel-android-agent-release-{{version}}.aar(プロダクション用)
1.2 依存関係の追加
1. AARファイルの配置:
app/libs/ディレクトリを作成- AARファイルを
app/libs/にコピー
2. app/build.gradleの構成:
- Kotlin DSL (build.gradle.kts)
- Groovy DSL (build.gradle)
dependencies {
// NetFUNNEL Androidエージェント
implementation(files("libs/netfunnel-android-agent-debug-{{version}}.aar"))
// 外部依存関係
val ktorVersion = "2.3.12"
val serializationVersion = "1.6.3"
implementation("io.ktor:ktor-client-core:$ktorVersion")
implementation("io.ktor:ktor-client-okhttp:$ktorVersion")
implementation("io.ktor:ktor-client-content-negotiation:$ktorVersion")
implementation("io.ktor:ktor-serialization-gson:$ktorVersion")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$serializationVersion")
}
android {
compileSdk = 34
defaultConfig {
minSdk = 22
targetSdk = 34
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
}
dependencies {
// NetFUNNEL Androidエージェント
implementation files("libs/netfunnel-android-agent-debug-{{version}}.aar")
// 外部依存関係
implementation "io.ktor:ktor-client-core:2.3.12"
implementation "io.ktor:ktor-client-okhttp:2.3.12"
implementation "io.ktor:ktor-client-content-negotiation:2.3.12"
implementation "io.ktor:ktor-serialization-gson:2.3.12"
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3"
}
android {
compileSdk 34
defaultConfig {
minSdk 22
targetSdk 34
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
3. AndroidManifest.xmlにインターネット権限を追加:
<uses-permission android:name="android.permission.INTERNET" />
1.3 エージェントの初期化
NetFUNNELコンソールから初期化コードを取得:
- エージェント → モバイルエージェント → Androidに移動
- 実際のクライアントIDが含まれた初期化コードをコピー
Applicationクラスに追加:
重要: 最初に初期化する必要があります
Application.onCreate()でsuper.onCreate()より前に初期化します。この手順を省略すると = バイパスモード(保護なし)です。
- Kotlin
- Java
class YourAppNameApplication : Application() {
override fun onCreate() {
super.onCreate()
Netfunnel.initialize(
clientId = "{{CLIENT_ID}}"
)
}
}
public class YourAppNameApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Netfunnel.INSTANCE.initialize(
"{{CLIENT_ID}}"
);
}
}
AndroidManifest.xmlにApplicationクラスを登録:
<application android:name=".YourAppNameApplication">
<!-- Your activities -->
</application>
実際のコードを使用
サンプルクライアントIDをコンソールの実際のクライアントIDに置き換えてください。
ステップ2: 制御タイプの選択
オプションA: 基本コントロール (5分)
最適な用途: Activity進入、ボタンクリック、API呼び出し
- プロジェクトにSDKを追加 (詳細はインストールおよび初期化を参照)
- NetFUNNELコンソールでセグメントを作成:
プロジェクト→セグメント→セグメント作成に移動- 基本コントロールを選択
- 進入許容数を
0に設定 (テスト用)
- Activityにこのコードを追加:
- Kotlin
- Java
import com.nf4.Netfunnel
import com.nf4.NetfunnelCallback
import com.nf4.NetfunnelCompleteCallback
// ユーザーがActivityに進入するとき
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Netfunnel.nfStart("{{PROJECT_KEY}}", "{{SEGMENT_KEY}}", callback, this)
}
private val callback = object : NetfunnelCallback() {
override fun onSuccess(statusCode: Int, message: String) {
// ユーザーが進行できる - 元のロジックを実行
setupUI()
}
override fun onError(statusCode: Int, message: String) {
// システムエラー - サービス可用性のために元のロジックを進行
setupUI()
}
override fun onNetworkError(statusCode: Int, message: String) {
// ネットワークエラー - ログのみ記録、ネットワーク回復モードに依存
Log.d("NetFUNNEL", "Network error: $message")
}
override fun onBlock(statusCode: Int, message: String) {
// ユーザーがブロックされた - 適切なメッセージを表示
Log.d("NetFUNNEL", "User blocked: $message")
}
override fun onClose(statusCode: Int, message: String) {
// ユーザーが待合室を閉じた - 適切に処理
Log.d("NetFUNNEL", "User closed waiting room: $message")
}
override fun onContinue(
statusCode: Int,
message: String,
aheadWait: Int,
behindWait: Int,
waitTime: String,
progressRate: Int
) {
Log.d("NetFUNNEL", "Continue: $message, waitTime: $waitTime")
}
}
// ユーザーが離れるときにキーを返却
override fun onDestroy() {
super.onDestroy()
Netfunnel.nfStop("{{PROJECT_KEY}}", "{{SEGMENT_KEY}}", completeCallback)
}
import com.nf4.Netfunnel;
import com.nf4.NetfunnelCallback;
import com.nf4.NetfunnelCompleteCallback;
import androidx.annotation.NonNull;
// ユーザーがActivityに進入するとき
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Netfunnel.INSTANCE.nfStart("{{PROJECT_KEY}}", "{{SEGMENT_KEY}}", callback, this);
}
private final NetfunnelCallback callback = new NetfunnelCallback() {
@Override
public void onSuccess(int statusCode, @NonNull String message) {
// ユーザーが進行できる - 元のロジックを実行
setupUI();
}
@Override
public void onError(int statusCode, @NonNull String message) {
// システムエラー - サービス可用性のために元のロジックを進行
setupUI();
}
@Override
public void onNetworkError(int statusCode, @NonNull String message) {
// ネットワークエラー - ログのみ記録、ネットワーク回復モードに依存
Log.d("NetFUNNEL", "Network error: " + message);
}
@Override
public void onBlock(int statusCode, @NonNull String message) {
// ユーザーがブロックされた - 適切なメッセージを表示
Log.d("NetFUNNEL", "User blocked: " + message);
}
@Override
public void onClose(int statusCode, @NonNull String message) {
// ユーザーが待合室を閉じた - 適切に処理
Log.d("NetFUNNEL", "User closed waiting room: " + message);
}
@Override
public void onContinue(int statusCode, @NonNull String message, int aheadWait, int behindWait, @NonNull String waitTime, int progressRate) {
Log.d("NetFUNNEL", "Continue: " + message + ", waitTime: " + waitTime);
}
};
private final NetfunnelCompleteCallback completeCallback = new NetfunnelCompleteCallback() {
@Override
public void onComplete(int statusCode, @NonNull String message) {
// キー返却完了
Log.d("NetFUNNEL", "Key returned successfully");
}
};
// ユーザーが離れるときにキーを返却
@Override
protected void onDestroy() {
super.onDestroy();
Netfunnel.INSTANCE.nfStop("{{PROJECT_KEY}}", "{{SEGMENT_KEY}}", completeCallback);
}
結果: ユーザーがActivityに進入するときに待合室が表示されます。
オプションB: 区間コントロール (10分)
最適な用途: マルチステッププロセス、同時ユーザー制限の維持
- プロジェクトにSDKを追加 (オプションAと同じ)
- NetFUNNELコンソールでセグメントを作成 (区間コントロールを選択)
- チェックアウト/決済フローにこのコードを追加:
- Kotlin
- Java
import com.nf4.Netfunnel
import com.nf4.NetfunnelCallback
import com.nf4.NetfunnelCompleteCallback
// 区間開始 (例: 決済プロセス)
fun startCheckout() {
Netfunnel.nfStartSection("{{PROJECT_KEY}}", "{{SEGMENT_KEY}}", callback, this)
}
private val callback = object : NetfunnelCallback() {
override fun onSuccess(statusCode: Int, message: String) {
// ユーザーが区間に進入した
showCheckoutForm()
}
override fun onError(statusCode: Int, message: String) {
// システムエラー - サービス可用性のために元のロジックを進行
showCheckoutForm()
}
override fun onNetworkError(statusCode: Int, message: String) {
// ネットワークエラー - ログのみ記録、ネットワーク回復モードに依存
Log.d("NetFUNNEL", "Network error: $message")
}
override fun onBlock(statusCode: Int, message: String) {
// ユーザーがブロックされた - 適切なメッセージを表示
Log.d("NetFUNNEL", "User blocked: $message")
}
override fun onClose(statusCode: Int, message: String) {
// ユーザーが待合室を閉じた - 適切に処理
Log.d("NetFUNNEL", "User closed waiting room: $message")
}
override fun onContinue(
statusCode: Int,
message: String,
aheadWait: Int,
behindWait: Int,
waitTime: String,
progressRate: Int
) {
Log.d("NetFUNNEL", "Continue: $message, waitTime: $waitTime")
}
}
// 区間終了 (例: 決済完了後)
fun completeCheckout() {
// 決済完了ロジック
processPayment()
// 成功した完了後にキーを返却
Netfunnel.nfStopSection("{{PROJECT_KEY}}", "{{SEGMENT_KEY}}", completeCallback)
}
import com.nf4.Netfunnel;
import com.nf4.NetfunnelCallback;
import com.nf4.NetfunnelCompleteCallback;
import androidx.annotation.NonNull;
// 区間開始 (例: 決済プロセス)
public void startCheckout() {
Netfunnel.INSTANCE.nfStartSection("{{PROJECT_KEY}}", "{{SEGMENT_KEY}}", callback, this);
}
private final NetfunnelCallback callback = new NetfunnelCallback() {
@Override
public void onSuccess(int statusCode, @NonNull String message) {
// ユーザーが区間に進入した
showCheckoutForm();
}
@Override
public void onError(int statusCode, @NonNull String message) {
// システムエラー - サービス可用性のために元のロジックを進行
showCheckoutForm();
}
@Override
public void onNetworkError(int statusCode, @NonNull String message) {
// ネットワークエラー - ログのみ記録、ネットワーク回復モードに依存
Log.d("NetFUNNEL", "Network error: " + message);
}
@Override
public void onBlock(int statusCode, @NonNull String message) {
// ユーザーがブロックされた - 適切なメッセージを表示
Log.d("NetFUNNEL", "User blocked: " + message);
}
@Override
public void onClose(int statusCode, @NonNull String message) {
// ユーザーが待合室を閉じた - 適切に処理
Log.d("NetFUNNEL", "User closed waiting room: " + message);
}
@Override
public void onContinue(int statusCode, @NonNull String message, int aheadWait, int behindWait, @NonNull String waitTime, int progressRate) {
Log.d("NetFUNNEL", "Continue: " + message + ", waitTime: " + waitTime);
}
};
private final NetfunnelCompleteCallback completeCallback = new NetfunnelCompleteCallback() {
@Override
public void onComplete(int statusCode, @NonNull String message) {
// キー返却完了
Log.d("NetFUNNEL", "Section key returned successfully");
}
};
// 区間終了 (例: 決済完了後)
public void completeCheckout() {
// 決済完了ロジック
processPayment();
// 成功した完了後にキーを返却
Netfunnel.INSTANCE.nfStopSection("{{PROJECT_KEY}}", "{{SEGMENT_KEY}}", completeCallback);
}
結果: ユーザーがチェックアウト区間に進入する前にキューで待機し、制御された同時性を維持します。
ステップ3: 動作確認
基本コントロールの場合:
- セグメントで進入許容数を0に設定 (待合室が表示される必要があります)
- 待合室が正しく表示されることを確認 (予想待機時間が表示される)
- 進入許容数を1に設定 (即座に進入する必要があります)
- ログまたはネットワーク監視でキー返却を確認
区間コントロールの場合:
- セグメントで進入許容数を0に設定 (待合室が表示される必要があります)
- 待合室が正しく表示されることを確認 (予想待機時間は表示されません)
- 進入許容数を1に設定 (即座に区間に進入する必要があります)
- 区間を通過してナビゲート (Section1 → Section2 → End)
- ログでキータイムアウト延長を確認 (5003リクエストを探す)
- 区間完了時にキー返却を確認
ヘルプが必要ですか?
- トラブルシューティング: 一般的な問題および解決方法
- NetFUNNELメッセージのAndroidログを確認 (
printLog = trueを有効化) - プロジェクト/セグメントキーがコンソールと正確に一致していることを確認