{"id":23762412,"url":"https://github.com/fairydevicesrd/thinklet.app.sdk","last_synced_at":"2025-09-26T15:13:24.006Z","repository":{"id":152800640,"uuid":"550593131","full_name":"FairyDevicesRD/thinklet.app.sdk","owner":"FairyDevicesRD","description":"SDK for THINKLET application ","archived":false,"fork":false,"pushed_at":"2024-12-09T08:28:23.000Z","size":268,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-04-06T00:51:07.795Z","etag":null,"topics":["android","kotlin-android","sdk","sdk-android","thinklet"],"latest_commit_sha":null,"homepage":"https://fairydevices.jp/cws","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/FairyDevicesRD.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-10-13T02:39:55.000Z","updated_at":"2024-12-09T08:28:27.000Z","dependencies_parsed_at":"2024-02-28T06:43:37.493Z","dependency_job_id":null,"html_url":"https://github.com/FairyDevicesRD/thinklet.app.sdk","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/FairyDevicesRD/thinklet.app.sdk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FairyDevicesRD%2Fthinklet.app.sdk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FairyDevicesRD%2Fthinklet.app.sdk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FairyDevicesRD%2Fthinklet.app.sdk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FairyDevicesRD%2Fthinklet.app.sdk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FairyDevicesRD","download_url":"https://codeload.github.com/FairyDevicesRD/thinklet.app.sdk/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FairyDevicesRD%2Fthinklet.app.sdk/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273722729,"owners_count":25156300,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-05T02:00:09.113Z","response_time":402,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","kotlin-android","sdk","sdk-android","thinklet"],"created_at":"2024-12-31T21:19:11.854Z","updated_at":"2025-09-26T15:13:18.969Z","avatar_url":"https://github.com/FairyDevicesRD.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"- [THINKLET App SDK](#thinklet-app-sdk)\n- [ご利用にあたって](#ご利用にあたって)\n  - [thinklet/sdk (documents)](#thinkletsdk-documents)\n  - [sample](#sample)\n- [機能一覧](#機能一覧)\n  - [Audio](#audio)\n    - [API Document](#api-document)\n    - [MultiChannelAudioRecord](#multichannelaudiorecord)\n    - [RawAudioRecordWrapper](#rawaudiorecordwrapper)\n    - [MicGainControl](#micgaincontrol)\n    - [VolumeControl](#volumecontrol)\n    - [Suppress SystemSound](#suppress-systemsound)\n    - [(試験的機能) 音声処理](#試験的機能-音声処理)\n  - [Camera](#camera)\n    - [API Document](#api-document-1)\n    - [Angle](#angle)\n  - [CameraX拡張機能](#camerax拡張機能)\n    - [CameraX + ThinkletMic](#camerax--thinkletmic)\n  - [Gesture](#gesture)\n    - [API Document](#api-document-2)\n    - [GestureSensorEventCallback](#gesturesensoreventcallback)\n    - [GestureSensorManager](#gesturesensormanager)\n    - [(試験的機能) WearSensorManager](#試験的機能-wearsensormanager)\n  - [Launcher Extension](#launcher-extension)\n    - [API Document](#api-document-3)\n    - [Extension](#extension)\n  - [LED](#led)\n    - [API Document](#api-document-4)\n    - [LedClient](#ledclient)\n  - [Power](#power)\n    - [API Document](#api-document-5)\n    - [Power](#power-1)\n  - [Language](#language)\n    - [API Document](#api-document-6)\n    - [Language](#language-1)\n  - [開発者モード](#開発者モード)\n    - [API Document](#api-document-7)\n    - [adb](#adb)\n- [プロジェクトでの利用方法](#プロジェクトでの利用方法)\n  - [GitHub Packages経由](#github-packages経由)\n  - [更新方法](#更新方法)\n- [Tips](#tips)\n  - [AARのバージョンの確認](#aarのバージョンの確認)\n  - [プロジェクトを難読化する場合](#プロジェクトを難読化する場合)\n    - [minifyEnabled](#minifyenabled)\n- [開発ロードマップ](#開発ロードマップ)\n\n# THINKLET App SDK\nTHINKLET本体にインストールするアプリケーションに使用することができるSDKを提供します．\n\n# ご利用にあたって\n- このライブラリ（AARファイル）を許可なく再配布・再利用はしてはいけません．\n- 本レポジトリに含まれるドキュメントに明示的に許可されている用途以外の利用を禁止します．\n- 当社は、お客様による本ライブラリの利用に関しては保証しません．\n- ライブラリおよびこれを利用するサンプルソースコードは、THINKLET実機でのみ動作します．\n\n## thinklet/sdk (documents)\n- ドキュメントは[CC BY-SA 4.0](./thinklet/LICENSE)の元で公開します\n## sample\n- サンプルソースコードは[MITライセンス](./sample/LICENSE)の元で公開します\n\n# 機能一覧\n## Audio\n- 必須：`android.Manifest.permission.RECORD_AUDIO`\n### API Document\n- [API](./thinklet/sdk/audio/dokka/index.md)\n### MultiChannelAudioRecord\n- THINKLET本体の5chマイクへアクセスを行う `AudioRecord` を提供します．\n- オプションで，バッファサイズ，チャンネル数の指定，サンプリングレートの指定が可能です．\n\n```.kt\n# 6ch(5ch + 1ch(=empty)), SamplingRate 48kHz\nval audioRecord = MultiChannelAudioRecord().get(Channel.CHANNEL_SIX, SampleRate.SAMPLING_RATE_48000).audioRecord\n```\n\n### RawAudioRecordWrapper\n- `AudioRecord`を簡易的に扱うためのクラス．\n- 録音結果を出力する `OutputStream`，結果を受け取る `IRawAudioRecorder` を提供します．\n- オプションで，参照音ありの6ch，参照音なしの5chで録音，サンプリングレートを指定，出力チャンネル数をモノラル(1ch)，ステレオ(2ch)に変換できます．\n\n```.kt\nprivate val randomFileName: String\n    get() = \"6ch_48kHz_${SimpleDateFormat(\"yyyy-MM-dd-hh-mm-ss\", Locale.getDefault()).format(Date())}.raw\"\nprivate val rawFileOutputStream: FileOutputStream\n    get() = FileOutputStream(File(activity.getExternalFilesDir(null), randomFileName))\nprivate val rawRecorder = RawAudioRecordWrapper(\n    channel = MultiChannelAudioRecord.Channel.CHANNEL_SIX,\n    sampleRate = MultiChannelAudioRecord.SampleRate.SAMPLING_RATE_48000,\n    outputChannel =  RawAudioRecordWrapper.RawAudioOutputChannel.ORIGINAL\n)\nprivate val rawRecorderCallback = object : RawAudioRecordWrapper.IRawAudioRecorder {\n    override fun onReceivedPcmData(pcmData: ByteArray) {\n        Log.i(TAG, pcmData.size.toString())\n    }\n\n    override fun onFailed(throwable: Throwable) {\n        Log.w(TAG, throwable.message.toString())\n    }\n}\n\n//----\n\nfun do() {\n    if (!rawRecorder.prepare(context)) {\n        return\n    }\n    rawRecorder.start(rawFileOutputStream, rawRecorderCallback)\n}\n```\n\n### MicGainControl\n- マイクのゲインを調整する機能を提供します．\n- ゲインレベルはアプリごとではなく，全てのアプリで共有されます．したがって，他のアプリへ悪影響が出ないように，アプリ終了時には，`resetMicGain()` を呼び出すようにしてください．\n\n```\nprivate val micGainControl = MicGainControl(context)\n\n// increase gain\nmicGainControl.micGain(18)\n\n// reset gain. (default:12)\nmicGainControl.resetMicGain()\n```\n\n### VolumeControl\n- 音量を段階的に変更する機能を提供します．\n- 変更するストリームについては，APIドキュメントを参照ください．\n\n\u003e [!TIP]\n\u003e この機能はFW 7.000.0以降で，利用可能です．\n\n```\nprivate val volumeCtrl = VolumeControl(context, lifecycle)\nvolumeCtrl.enable()\n\n// enabled loop: stepUp volume. 0-\u003e1-\u003e2-\u003e3-\u003e0-\u003e1-\u003e...\nvolumeCtrl.stepUp()\n// enabled loop: stepDown volume. 3-\u003e2-\u003e1-\u003e0-\u003e3-\u003e2-\u003e...\nvolumeCtrl.stepDown()\n\n// disabled loop: stepUp volume. 0-\u003e1-\u003e2-\u003e3-\u003e3-\u003e3-\u003e...\nvolumeCtrl.stepUp(enableLoop = false)\n// disabled loop: stepDown volume. 3-\u003e2-\u003e1-\u003e0-\u003e0-\u003e0-\u003e...\nvolumeCtrl.stepDown(enableLoop = false)\n```\n\n### Suppress SystemSound\n- THINKLET固有のシステム音の再生を抑制します．\n  - e.g. 「オンラインになりました」を抑えます．\n\n\u003e [!TIP]\n\u003e この機能はFW 11.000.0以降で，利用可能です．\n\n```\nprivate val soundCtrl = SystemSound(context)\n\n// Suppress THINKLET's system sound\nsoundCtrl.muteMild()\n// Minimize THINKLET's system sound\nsoundCtrl.muteMinimum()\n// Remove suppress THINKLET system sound\nsoundCtrl.reset()\n```\n\n### (試験的機能) 音声処理\n- 弊社の音声処理技術を活用した装着者の音声を強調するようにマイクの設定を行います．\n\n| ![音声強調のイメージ](https://mimi.fairydevices.jp/img/technology/edge/xfe/bf/img_01.png) |\n| :---------------------------------------------------------------------------------------: |\n|                                    音声強調のイメージ                                     |\n\n\u003e [!NOTE]\n\u003e FairyDevicesの音声処理技術については，[こちら](https://mimi.fairydevices.jp/technology/edge/xfe/)をご参照ください．  \n\u003e 本機能では，[ビームフォーマ](https://mimi.fairydevices.jp/technology/edge/xfe/bf/) のみ提供し，装着者方向の音声のみを強調，その他の周辺の音声を抑えます．\n\n\u003e [!TIP]\n\u003e この機能はFW 11.000.0以降で，利用可能です．\n\n\u003e [!IMPORTANT]\n\u003e この機能は，試験的機能です．予期せぬエラー，APIの変更が発生することがあります．  \n\u003e また，THINKLET cube モデルはサポートしていません．\n\n```\nprivate val am = context.getSystemService(AudioManager::class.java)\nprivate val xfeCtl = ThinkletXfe()\n\n// enable xfe\nif (!xfeCtl.configureXfe(audioManager = am, xfeEnable = true)) {\n    return\n}\nval audioRecord = AudioRecord.Builder()\n    .setAudioSource(AudioSource.MIC)\n    .setAudioFormat(\n        AudioFormat.Builder()\n            .setEncoding(AudioFormat.ENCODING_PCM_16BIT)\n            .setSampleRate(48000) // or 16000\n            .setChannelMask(AudioFormat.CHANNEL_IN_MONO)\n            .build()\n    )\n    .setBufferSizeInBytes(1920)\n    .build()\n// check xfe mode.\nif (!audioRecord.canXfeRecord()) {\n    audioRecord.release()\n    return\n}\n\naudioRecord.startRecording()\n// do something\n\naudioRecord.stop()\naudioRecord.release()\nxfeCtl.configureXfe(audioManager = am, xfeEnable = false)\n```\n\n## Camera\n### API Document\n- [API](./thinklet/sdk/maintenance/dokka/index.md)\n### Angle\n- `CameraCharacteristics.SENSOR_ORIENTATION` で取得できる Cameraデバイスの角度の取得，変更できます．\n- デフォルトは `90` です．\n- 回転すると，CameraHalが一度再起動しますので，カメラ使用中には実行しないでください．予期せぬ動作をします．\n\n```\nval camAngle = Angle()\nif (camAngle.current() != 90) {\n    val ret = camAngle.rotate_90()\n}\n```\n\n- また，角度を意識しない場合は，`setLandscape`, `isLandscape`, `setPortrait`, `isPortrait` をご利用ください．\n\n## CameraX拡張機能\n### CameraX + ThinkletMic\n- CameraX の [androidx.camera.video](https://developer.android.com/reference/kotlin/androidx/camera/video/package-summary) をフォークし，音声周りをカスタマイズできるようにしました．\n\n\u003e [!NOTE]\n\u003e 本機能は，THINKLET App SDKに含みません．サンプルやご利用方法については，[thinklet.camerax.mic](https://github.com/FairyDevicesRD/thinklet.camerax.mic) をご確認ください．\n\n- 通常のCameraXの [Recorder](https://developer.android.com/reference/kotlin/androidx/camera/video/Recorder) では，マイクに関する機能は，CameraX内部に隠蔽されており，開発者が選ぶことはできません．  \nこの機能により，例えば，THINKLETの５つのマイクをすべて使い，装着者の音声を強調して録音できます．  \nまた，次のような音を使用するケースも理論上実現可能です．\n    - 「人の声を検出しているときの音」（サンプルあり）  \n    - 「音声認識し，それを合成音声した音」  \n    - 「BGMを追加した音」\n- 利用するには，すでにCameraXのRecorderを利用している場合は，ライブラリの導入と，`Recorder.Builder` に `setThinkletMic` を追加します．\n  - 5chマイクで録音する\n  ```diff\n  val recorder = Recorder.Builder()\n      .setExecutor(recorderExecutor)\n      .setQualitySelector(QualitySelector.from(Quality.FHD))\n  +   .setThinkletMic(ThinkletMics.FiveCh)\n      .build()\n  ```\n  - また，[本SDKの音声処理機能](#試験的機能-音声処理) にも対応しています．\n  ```diff\n  val recorder = Recorder.Builder()\n      .setExecutor(recorderExecutor)\n      .setQualitySelector(QualitySelector.from(Quality.FHD))\n  +   .setThinkletMic(ThinkletMics.Xfe(audioManager))\n      .build()\n  ```\n\n\u003e [!TIP]\n\u003e 一部機能については，一般的なAndroidデバイスでも動作できることを確認していますが，積極的なサポートはしておりません．\n\n## Gesture\n### API Document\n- [API](./thinklet/sdk/gesture/dokka/index.md)\n### GestureSensorEventCallback\n- 手を使ったジェスチャを取得，ジェスチャーセンサからのイベントコールバックを提供します．\n- 関数のそれぞれは，THINKLETを装着したときの向きに合わせて，定義し，上下，左右の４つのイベントを取得できます．\n\n### GestureSensorManager\n- ジェスチャセンサを簡易的に扱うためのクラス．`GestureSensorEventCallback`のイベントを受け取れます．\n\n```.kt\nprivate val gestureSensorManager =\n    GestureSensorManager(object : GestureSensorEventCallback {\n        override fun onGestureUpToDown() {\n            Log.i(TAG, \"onGestureUpToDown\")\n        }\n\n        override fun onGestureDownToUp() {\n            Log.i(TAG, \"onGestureDownToUp\")\n        }\n\n        override fun onGestureRightToLeft() {\n            Log.i(TAG, \"onGestureRightToLeft\")\n        }\n\n        override fun onGestureLeftToRight() {\n            Log.i(TAG, \"onGestureLeftToRight\")\n        }\n    })\n\nfun start() {\n    gestureSensorManager.startTracking(context)\n}\n\nfun stop() {\n    gestureSensorManager.stopTracking()\n}\n```\n\n### (試験的機能) WearSensorManager\n- THINKLETの装着状態のセンサーイベントを簡易的に扱うためのクラス．\n- 試験的機能となります．利用時には，`@OptIn(ExperimentalFeature::class)` を付与してください．\n- `WearSensorManager.IGyroscopeEvent` で，ジャイロセンサーをもとにしたイベントコールバックを提供します．\n  - 注意：`onSideBlurred` は，使い方によっては高頻度で通知されます．\n- `WearSensorManager.IProximityEvent` で，近接センサーをもとにしたイベントコールバックを提供します．\n\n```\nprivate val wearSensorManager = WearSensorManager(context)\nprivate val proximityEvent = object: WearSensorManager.IProximityEvent {\n    override fun onMounted() {\n        Log.i(TAG, \"onMounted\")\n    }\n\n    override fun onRemoved() {\n        Log.i(TAG, \"onRemoved\")\n    }\n\n}\nprivate val gyroscopeEvent = object: WearSensorManager.IGyroscopeEvent {\n    override fun onUpDownBlurred() {\n        Log.i(TAG, \"onUpDownBlurred\")\n    }\n\n    override fun onSideBlurred() {\n        Log.i(TAG, \"onSideBlurred\")\n    }\n}\n\nfun start() {\n    wearSensorManager.startTracking(proximityEvent, gyroscopeEvent)\n}\n\nfun stop() {\n    wearSensorManager.stopTracking()\n}\n```\n\n## Launcher Extension\n### API Document\n- [API](./thinklet/sdk/maintenance/dokka/index.md)\n### Extension\n- THINKLET 標準搭載のLauncherが，`onResume` 実行時に，Launcherの代わりにアプリケーションを起動する機能です．（以降，自動起動モード）\n- Launcherから起動するアプリケーションの設定，取得，自動起動モードの無効化，再有効化する機能を提供します．\n- 自動起動モードは，端末自体が再起動すると，自動的に有効化されます．起動対象の設定は不揮発として保存されますので，端末自体が再起動しても再設定は不要です．\n\n```\nval ext = Extension()\nval current = ext.configure() // Pair\u003cString, String\u003e PackageName, className\nif (current.first != \"com.android.deskclock\" || current.second != \"com.android.deskclock.DeskClock\") {\n    ext.configure(\"com.android.deskclock\", \"com.android.deskclock.DeskClock\")\n}\n\nif (!ext.isAutoLaunchMode()) {\n    // 再度有効化\n    ext.enableAutoLaunchMode()\n} else {\n    // 無効化\n    ext.disableAutoLaunchMode()\n}\n```\n\n## LED\n### API Document\n- [API](./thinklet/sdk/led/dokka/index.md)\n### LedClient\n- カメラと反対，ジェスチャセンサ側の腕部に搭載する緑LEDのON/OFFを切り替える機能を提供します．\n\n```\n// ON\nLedClient(context).updateCameraLed(true)\n\n// OFF\nLedClient(context).updateCameraLed(false)\n```\n\n## Power\n### API Document\n- [API](./thinklet/sdk/maintenance/dokka/index.md)\n### Power\n- 端末自体をシャットダウン，再起動するための機能を提供します．\n- このAPIを介して，シャットダウン，再起動を行うと，`自動起動モード`は，無効化され，自動起動モードの対象に設定したアプリは呼び出しされなくなります．上述した通り，端末自体が再起動すると，自動起動モードは，自動的に有効化されます．\n\n```\nPower().shutdown(context, wait = 30000 /* max wait 30s */)\nPower().reboot(context, wait = 100 /* soon reboot */)\n```\n\n## Language\n### API Document\n- [API](./thinklet/sdk/maintenance/dokka/index.md)\n### Language\n- 端末の言語設定を変更する機能を提供します．\n- 本機能で，切り替え可能な一覧は，`getAvailableLocales` より取得できます．\n\n```\nval lang = Language(context)\nlang.updateRequest(Locale.GERMAN)\n```\n\n## 開発者モード\n### API Document\n- [API](./thinklet/sdk/maintenance/dokka/index.md)\n### adb\n- adbを有効，無効に切り替える機能を提供します．\n- **開発時などで，一時的に無効にする際は，再度有効にする手段を先に用意してください．**\n\n```\nLog.v(TAG, \"adb disable -\u003e enable\")\nval adbClient = AdbClient(context)\nadbClient.disableAsync().thenAccept { disableResult -\u003e\n    Log.v(TAG, \"adb disable $disableResult\")\n    adbClient.enableAsync().thenAccept { enableResult -\u003e\n        Log.v(TAG, \"adb enable $enableResult\")\n    }\n}\n```\n\n# プロジェクトでの利用方法\n## GitHub Packages経由\n- 詳細な設定は，[GitHub 公開されたパッケージの利用](https://docs.github.com/ja/packages/working-with-a-github-packages-registry/working-with-the-gradle-registry#using-a-published-package) を参照ください．\n- また，バージョンの指定や依存ライブラリの追加が必要な場合は，`Release` に記載しておりますので，適宜ご確認ください．\n- 以下に，サンプルを記載します．\n  - root `build.gradle`\n\n    ```\n    maven {\n        name = \"GitHubPackages\"\n        url = uri(\"https://maven.pkg.github.com/FairyDevicesRD/thinklet.app.sdk\")\n        credentials {\n            Properties properties = new Properties()\n            properties.load(project.rootProject.file('local.properties').newDataInputStream())\n            username = properties.getProperty(\"username\") ?: System.getenv(\"USERNAME\")\n            password = properties.getProperty(\"token\") ?: System.getenv(\"TOKEN\")\n        }\n    }\n    ```\n\n  - `app/build.gradle`\n\n    ```\n    dependencies {\n        implementation 'ai.fd.thinklet:sdk-audio:XXX'\n        implementation 'ai.fd.thinklet:sdk-gesture:XXX'\n        implementation 'ai.fd.thinklet:sdk-led:XXX'\n        implementation 'ai.fd.thinklet:sdk-maintenance:XXX'\n    }\n    // XXX にはVersionを指定ください．とにかく最新を使用する場合は，`+` に置き換えてください．\n    ```\n\n## 更新方法\n- implementation で指定するVersionを変更してください．\n- その後，プロジェクトをクリーン＆ビルドしてください．\n\n# Tips\n## AARのバージョンの確認\n- 各種AARの `BuildConfig.VERSION` を参照してください．\n```\nval msg =\n    \"${ai.fd.thinklet.sdk.audio.BuildConfig.LIBRARY_PACKAGE_NAME}: ${ai.fd.thinklet.sdk.audio.BuildConfig.VERSION}\" + \"\\n\" +\n    \"${ai.fd.thinklet.sdk.gesture.BuildConfig.LIBRARY_PACKAGE_NAME}: ${ai.fd.thinklet.sdk.gesture.BuildConfig.VERSION}\" + \"\\n\" +\n    \"${ai.fd.thinklet.sdk.led.BuildConfig.LIBRARY_PACKAGE_NAME}: ${ai.fd.thinklet.sdk.led.BuildConfig.VERSION}\" + \"\\n\" +\n    \"${ai.fd.thinklet.sdk.maintenance.BuildConfig.LIBRARY_PACKAGE_NAME}: ${ai.fd.thinklet.sdk.maintenance.BuildConfig.VERSION}\"\nLog.v(TAG, msg);\n```\n\n## プロジェクトを難読化する場合\n### minifyEnabled\n- `minifyEnabled` を用いて，SDKに依存するライブラリまで難読化すると，期待する動作をしなくなります．`proguard-rules.pro` に以下を追記ください．\n\n```.diff\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile\n+ -keep class  ai.fd.thinklet.syspropmanager.**{ public *;}\n```\n\n# 開発ロードマップ\n- 開発中・または開発計画をしている機能です．なお，リリースを保証するものではありません．予告なく中止される可能性があります．\n\n  - ネットワーク(Wi-Fi/APN) CRUD API\n    - THINKLETのWi-Fi，APNのCRUD（追加・取得・更新・削除）\n  - Bluetooth CRUD API\n    - THINKLETと接続するBluetooth機器とのペアリング機能\n  - (汎用Android向けライブラリ) ローカルTHINKLET操作API\n    - THINKLETがオフラインでも，AndroidスマートフォンからTHINKLETを操作するライブラリ\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffairydevicesrd%2Fthinklet.app.sdk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffairydevicesrd%2Fthinklet.app.sdk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffairydevicesrd%2Fthinklet.app.sdk/lists"}