メインコンテンツまでスキップ

既知の制限事項

SDKの使用前に以下の要件と制限事項をご確認ください。

デバイス要件

項目OpenCL最小OpenCL推奨
Androidバージョン8.0 (API 26)12+ (API 31)
RAM4GB6GB以上
ストレージ500MB1GB以上
GPUOpenGL ES 2.0 / OpenCL 1.2OpenGL ES 3.0+ / OpenCL 2.0+

サポートアーキテクチャ (ABI)

ABIサポート備考
arm64-v8aサポート大半の最新デバイス
armeabi-v7aサポート旧型32ビットデバイス
x86_64非サポートエミュレータ
x86非サポートエミュレータ
エミュレータに関する注意事項

x86/x86_64エミュレータではSDKは動作しません。

テスト方法:

  • 実際のAndroidデバイスを使用(推奨)
  • ARMベースのエミュレータを使用(例:Apple Silicon Macのデフォルトエミュレータ)

ネットワーク要件

必須条件

  • インターネット接続: リアルタイムWebSocket通信に必須
  • プロトコル: HTTPS / WSS (TLS 1.2以上)
  • ポート: 443

ファイアウォール設定

# 許可が必要なドメイン
*.klleon.io

ネットワーク権限

<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

オーディオ関連の制限事項

USBマイク互換性

  • MMAPポリシー: MMAPはSDK内部で管理され、デフォルトで無効化されています。MMAP有効化時に一部のUSBマイクでストリームオープンに失敗する場合があります。
  • USBデバイス選択: USBマイクが接続されると自動的に検出・選択されます。
  • 互換性のないデバイス: 一部のMediaTekベースのTVでUSB複合デバイス(例:DM30RGB)のオーディオストリームオープンに失敗する場合があります。

エコー防止

  • アバター発話中は音声認識が自動的にブロックされます。

既知の問題

1. メモリ使用量

ビデオ処理およびAI推論中にメモリ使用量が高くなる場合があります。特に ResourceManager.init() 呼び出し時にYUVフレームバッファとして約1GBのネイティブメモリが割り当てられます。

バッファライフサイクル

finish() はバッファを維持して同一アバター再進入時に即座に再利用します(0ms)。完全なメモリ解放には deinit() を明示的に呼び出す必要があります。

シナリオ動作
同じアバター再進入init(同一avatarId) → バッファ再利用 (0ms)
異なるアバター切り替えinit(新avatarId) → 自動で以前のバッファ解放 + 新規割り当て
アプリバックグラウンド遷移onTrimMemorydeinit() → バッファ解放
アプリ終了CharacterActivity.onDestroydeinit() → 完全解放
プロセス強制終了OSカーネルが自動回収(コード不要)

必須実装パターン

Applicationクラス — バックグラウンドメモリ自動解放:

class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
registerComponentCallbacks(object : ComponentCallbacks2 {
override fun onTrimMemory(level: Int) {
if (level >= ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) {
ResourceManager.deinit()
}
}
override fun onConfigurationChanged(newConfig: Configuration) {}
override fun onLowMemory() { ResourceManager.deinit() }
})
}
}

SDK play画面(ChatActivityなど):

override fun onDestroy() {
super.onDestroy()
// finish()はsuspend関数のためコルーチンで実行
CoroutineScope(Dispatchers.Default).launch {
klleonOndeviceSdk.finish() // バッファ維持(再利用待機)
}
}

アバター選択画面(CharacterActivityなど):

override fun onDestroy() {
super.onDestroy()
// SDKが再生中でなければ(play前の離脱)手動でメモリ解放
if (!KlleonOndeviceSdk.playing) {
ResourceManager.deinit()
}
}
重複呼び出しの安全性
  • init(): 同一アバター(avatarId)の再呼び出し時に既存バッファを再利用(重複割り当てなし)
  • deinit(): 複数回呼び出しても安全(冪等性保証)
  • finish(): 内部のplaying状態チェックにより重複呼び出しが安全

2. バックグラウンド制限

アプリがバックグラウンドに遷移すると、ビデオ処理が一時停止されます。

3. 単一インスタンス制限

KlleonOndeviceSdk インスタンスはアプリあたり1つのみ作成する必要があります。 内部コルーチンスコープとスレッドプールがインスタンスごとに割り当てられるため、複数インスタンスを作成するとリソース競合およびメモリリークが発生します。

推奨:objectシングルトンで管理

// アプリ全体で単一インスタンスを共有
object SdkConfig {
val sdk = KlleonOndeviceSdk()
}

// Activityでの使用
class ChatActivity : ComponentActivity() {
private val klleonOndeviceSdk = SdkConfig.sdk // 同一インスタンスを再利用
}

class AnotherActivity : ComponentActivity() {
private val klleonOndeviceSdk = SdkConfig.sdk // 同一インスタンスを再利用
}
注意

Activityフィールドで KlleonOndeviceSdk() を直接生成すると、Activity再生成(画面回転、メモリ不足など)のたびに新しいインスタンスが作成され、以前のインスタンスのスレッドプールが蓄積されます。

// 間違った使い方 - 複数インスタンス
class MainActivity : Activity() {
val sdk1 = KlleonOndeviceSdk() // インスタンス1
val sdk2 = KlleonOndeviceSdk() // インスタンス2 - 競合発生!
}

4. 画面回転

画面回転時にActivityが再生成されると、SDK状態が初期化される場合があります。

解決方法:

<!-- AndroidManifest.xml - 画面回転を直接処理 -->
<activity
android:name=".MainActivity"
android:configChanges="orientation|screenSize|screenLayout" />

5. Android TVの特記事項

  • TVプラットフォームではレイアウト変更時に自動フォーカスが最初のfocusable要素に付与され、キーボードが自動表示される場合があります。
  • focusProperties { canFocus = false } で根本的にブロックし、クリック時にのみ有効化してください。
  • MediaTekベースのTVで一部USBオーディオデバイスの互換性に問題がある場合があります。

パフォーマンス最適化のヒント

GPUアクセラレーション

SDKは基本的にGPUアクセラレーションを使用します。一部のローエンドデバイスで問題が発生した場合:

// GPU問題発生時のログ確認
adb logcat | grep "Klleon_"

バッテリー最適化

長時間使用時にバッテリー消費が大きくなる場合があります:

  • 使用しない時は finish() を呼び出し
  • 画面オフ時の処理停止を推奨
  • enterStandby() / exitStandby() で待機画面モードを活用

サポートへのお問い合わせ

上記の制限事項で解決できない問題は、Klleon Studio を通じてお問い合わせください。