droidmap について
droidmapは、Room、Navigation、依存性注入、Gradleモジュールの関係を含むAndroidプロジェクトのグラフを構築します。開発者、コードレビュー、コーディングエージェント向けに変更影響やルールを分析し、ソースを読むだけでプロジェクトをコンパイルしません。
主な機能
- 01Androidのコンポーネントとモジュール依存の可視化
- 02Room、Navigation、注入ルールの検査
- 03変更影響と対象テストの分析
- 04プロジェクトレポートと図の生成
- 05プルリクエストへの影響概要の投稿
活用シーン
- 01マージ前にデータベース移行とルートを確認
- 02変更影響を調べて実行するテストを選定
- 03プルリクエストで影響を受けるモジュールを提示
- 04コーディングエージェントから依存関係を照会
MCP 対応
stdioのMCPサーバーとして動作し、影響分析、差分、ルール検査、ノード参照、検索、レポート、ルール説明をクライアントに提供します。ファイル変更に応じてグラフを更新し、エージェントが編集状況に沿った分析を取得できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
docker run -i --rm ghcr.io/hussainshirazi/droidmap:0.3.0ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ghcr.io/hussainshirazi/droidmap:0.3.0stdioツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
droidmap
あなたのプロジェクトを、あなた自身やプルリクエスト、AI コーディングエージェントのためにマップ化します。Android を理解したマップです。
汎用的なコードグラフはクラスや呼び出しを認識します。しかし、次のようなことは認識できません。
- Room データベースのバージョン 4 からバージョン 5 へのマイグレーションがないため、バージョン 4 を使っているユーザーが更新時にクラッシュすること。
- エンティティに列を追加したのにデータベースのバージョンを更新していないため、これも更新時にクラッシュすること。
- マイグレーションテストの名前は
migrationFrom1To4ですが、実際には 1→2→3→4 を実行している一方、バージョン 1 のユーザーにはMIGRATION_1_4が適用され、どのテストもそれを実行しないこと。 navigate("settings")が、どのNavHostにも登録されていないルートを指していること。- ViewModel が、Hilt でも Koin でも何もバインドしていないリポジトリをインジェクトすること(Koin では実行時にクラッシュします)。
- ライブラリがマージ済みマニフェストに
ACCESS_NETWORK_STATEを追加したこと。 - モジュールルールで禁止されているにもかかわらず、機能モジュールが
build-logicのコンベンションプラグインを介して:core:dataを取得していること。
droidmap は Android の配線を直接読み取ります(Gradle、Room、Navigation、Hilt、Koin、マニフェストを、Kotlin と Java から読み取ります)。それをグラフに変換します。CI でルールを実行し、各プルリクエストに変更の影響範囲を知らせるコメントを付け、変更前にクラスの依存先を確認し、MCP 経由で AI エージェントに渡せます。
ソースファイルのみを読み取ります。Gradle の実行やコードのコンパイルは行わず、データをどこかに送信することもありません。(GitHub Action は、依頼された場合に限り、マージ済みマニフェスト用の Gradle タスクを 1 つ実行します。)
実際のアプリでの使用例
Now in Android(35 モジュール、Hilt、Room、Navigation 3)で、ノート PC 上にて、それぞれ約 1.5 秒で実行できます。
$ droidmap check
warning room-migration-untested core/database/src/main/kotlin/com/google/samples/apps/nowinandroid/core/database/NiaDatabase.kt:66
NiaDatabase: 13 of 13 migration steps have no MigrationTestHelper test (1->2, 2->3, 3->4,
4->5, 5->6, 6->7, 7->8, 8->9, 9->10, 10->11, 11->12, 12->13, 13->14)
1 warning
OfflineFirstTopicsRepository.syncWith を 1 行変更した後の結果です(出力を短縮しています)。
$ droidmap diff
Changed (1): OfflineFirstTopicsRepository (injectable)
Affected (what depends on the changed code):
Screens: ForYouScreen, InterestsScreen, TopicScreen
Navigation destinations: ForYouNavKey, InterestsNavKey, TopicNavKey
ViewModels: ForYouViewModel, InterestsViewModel, TopicViewModel
Dependency injection: DataModule.bindsTopicRepository, GetFollowableTopicsUseCase, SyncWorker
Modules: :app, :app-nia-catalog, :core:data, :core:data-test, :core:domain, ... and 12 more
Tests that cover it (1): OfflineFirstTopicsRepositoryTest
$ droidmap diff --format tests
:core:data:test --tests com.google.samples.apps.nowinandroid.core.data.repository.OfflineFirstTopicsRepositoryTest
最後の行を CI で ./gradlew にそのまま渡せます。テストスイート全体ではなく、テストクラス 1 つだけを実行します(変更によって失敗する可能性のあるテストだけを実行するを参照)。
インストール
macOS または Linux:
curl -fsSL https://raw.githubusercontent.com/hussainshirazi/droidmap/main/install.sh | sh
Windows(PowerShell):
irm https://raw.githubusercontent.com/hussainshirazi/droidmap/main/install.ps1 | iex
Homebrew:brew tap hussainshirazi/droidmap https://github.com/hussainshirazi/droidmap を実行してから、brew install droidmap を実行します。Scoop:scoop bucket add droidmap https://github.com/hussainshirazi/droidmap を実行してから、scoop install droidmap/droidmap を実行します。
GitHub Actions 以外の CI システム(GitLab、Bitbucket、Jenkins、Bitrise)で使う Docker:docker run --rm -v "$PWD":/project ghcr.io/hussainshirazi/droidmap check(バージョン 0.2.0 以降)。
Gradle(バージョン 0.3.0 以降。Gradle Plugin Portal への公開後に利用可能)では、ルートの build.gradle.kts に追加します。./gradlew droidmapCheck を実行すると、エラーがある場合にビルドが失敗します。
plugins { id("io.github.hussainshirazi.droidmap") version "0.3.0" }
droidmap {
failOn.set("warning") // error (the default), warning, info or never
mergedManifest.set(true) // run each processReleaseMainManifest first: library permissions are checked too
}
または、最新リリースから droidmap.jar をダウンロードし、java -jar droidmap.jar を実行します。droidmap には Java 17 以降が必要です。droidmap コマンドは JAVA_HOME、PATH 上の java、または Android Studio に付属する Java を使用します。そのため、Android Studio がインストールされていれば、追加の設定は不要です。Kotlin コンパイラーのパーサーを同梱しているため、jar のサイズは約 65 MB です。
クイックスタート
プロジェクト内のどこからでも実行できます。
droidmap init # once: the GitHub workflow and the MCP config for AI agents
droidmap check # run the rules; exit code 1 on errors
droidmap impact TopicEntity # what depends on it, transitively
droidmap diff # what your uncommitted changes touch
droidmap diff --base main # what your branch touches
droidmap report -o REPORT.md # an overview, with module and screen-flow diagrams
プルリクエスト時(GitHub Action)
droidmap init はこのワークフローを .github/workflows/droidmap.yml に書き込みます。
name: droidmap
on: [push, pull_request]
jobs:
droidmap:
runs-on: ubuntu-latest
permissions:
contents: read
security-events: write # findings as code scanning alerts
pull-requests: write # the comment that says what the pull request touches
steps:
- uses: actions/checkout@v7
- uses: hussainshirazi/droidmap@v0
プルリクエストごとに、Action は変更が影響する内容をコメントし、プッシュのたびにそのコメントを更新します。
droidmap:この変更が影響する内容
origin/mainとの比較:変更されたファイルは 1 件で、そのうち 1 件を droidmap が読み取りました。変更済み(1):
ItemEntityroom_entity影響を受けるもの(変更されたコードに依存するもの):
画面 HomeScreenViewModel HomeViewModelRoom AppDatabase、ItemDao依存関係の注入 DataModule.bindItems、OfflineItemRepositoryモジュール :app、:core:data、:core:database、:feature:detail-screen、:feature:home
変更によって宣言(遷移先、バインディング、DAO メソッド)が削除されると、コメントには 削除済み としてその宣言が記載され、まだそれに依存しているものは 影響を受けるもの として記載されます。
検出結果はコードスキャンのアラート、変更行の注記、ジョブの概要に表示され、エラーがある場合はステップが失敗します。Action に Java のセットアップは不要です。GitHub のランナーにすでにある JDK を使用します。ライブラリがマージ後のマニフェストに追加する権限も確認するには、merge-manifest: true を設定します。最初に ./gradlew processReleaseMainManifest を実行するため、そのジョブにはビルドで使用する JDK が必要です(actions/setup-java)。
| 入力 | デフォルト | |
|---|---|---|
path | . | Android プロジェクトのフォルダーがリポジトリのルートではない場合に指定します |
fail-on | error | より厳しくするには warning または info、レポートのみを行うには never を指定します |
comment | true | プルリクエストのコメントに影響の概要を表示しない場合は false を指定します(ジョブの概要には表示されます) |
upload-sarif | true | GitHub Advanced Security がないプライベートリポジトリでは false を指定します(公開リポジトリではコードスキャンを無料で利用できます) |
args | --config tools/droidmap.toml など、droidmap check に追加する引数 | |
base | auto | 比較対象の Git ref:auto はプルリクエストのベースブランチ、none は比較を無効にします。それ以外の ref は取得する必要があります(例:fetch-depth: 0 を指定) |
merge-manifest | off | true を指定すると、最初に processReleaseMainManifest を実行し、ライブラリが追加する権限も確認します。プロダクトフレーバーがある場合は、processProdReleaseMainManifest など、バリアントに対応するタスクを指定します。ビルドを実行するため、pull_request_target ワークフローでは絶対に使用しないでください |
version | 固定されたリリース | 0.2.0 などの droidmap リリース |
変更によって失敗する可能性のあるテストだけを実行する
droidmap diff --format tasks は、変更によって失敗する可能性のある各モジュールのテストタスクを一覧表示します。対象は、変更されたファイルを含むモジュールと、それらに依存するすべてのモジュールです(テスト内でのみ使用するモジュールは、そのテストだけが実行されます)。ビルド設定(settings、ルートのビルドファイル、gradle/、build-logic)に変更がある場合は、すべてのモジュールが一覧表示されます。Gradle ファイルのみを読み取るため、Gradle を実行せずに少しの時間で完了します。
- uses: actions/checkout@v7
with:
fetch-depth: 0 # the base branch, to compare with
- run: curl -fsSL https://raw.githubusercontent.com/hussainshirazi/droidmap/main/install.sh | sh
- run: |
tasks=$(~/.local/bin/droidmap diff --base origin/${{ github.base_ref }} --format tasks --task testDebugUnitTest)
if [ -n "$tasks" ]; then ./gradlew $tasks; else echo "No module affected"; fi
--format modules は代わりにモジュールのパスを 1 行ずつ出力します。
--format tests はさらに絞り込み、呼び出しが変更された関数に到達するテストクラスだけを Gradle の引数として出力します(:core:data:testDebugUnitTest --tests com.example.OfflineRepositoryTest ...)。そのため、./gradlew $(droidmap diff --base origin/main --format tests --task testDebugUnitTest) を実行すると、対象のテストだけが実行されます。呼び出しは、コードで宣言された内容(プロパティやパラメーターの型、コンストラクター、関数の戻り値の型)をたどります。また、インターフェースへの呼び出しはすべての実装に到達するため、テストを多めに実行する方向に判定されます。テキストレポートと impact には、同じテストが「このコードをカバーするテスト」として表示されます。
AI エージェントで使用する(MCP)
droidmap mcp は、stdio を介して動作するModel Context Protocol サーバーです。ファイルが変更されるとグラフを再構築するため(変更されたファイルのみを解析します)、エージェントが編集するコードに沿った回答が得られます。
Claude Code プラグイン(サーバーと、Claude に使うタイミングを伝えるスキルを含みます。エンティティ、ルート、バインディングを変更する前の影響確認、変更後のチェックと実行すべきテストを案内します)。Java 以外にインストールするものはありません。また、Android Studio に付属する Java を自動で見つけます。初回起動時に、プラグインに対応する droidmap のリリースをダウンロードし、SHA-256 を検証します。
/plugin install droidmap --marketplace hussainshirazi/droidmap
Claude Code 2.1.275 より前のバージョンでは、まずマーケットプレイスを追加します:/plugin marketplace add hussainshirazi/droidmap。次に、/plugin install droidmap@droidmap を実行します。スキルは通常の SKILL.md ファイルです。スキルを読み込める他のエージェントも、同じファイルを使用できます。
任意の MCP クライアント。 droidmap init は .mcp.json(Claude Code)を作成し、該当するフォルダーが存在する場合は .cursor/mcp.json または .vscode/mcp.json も作成します。これらをコミットすれば、チーム全員がサーバーを利用できます。既存のファイルは変更せず、代わりに追加すべき内容を表示します。手動で設定する場合:
claude mcp add droidmap -- droidmap mcp .
{ "mcpServers": { "droidmap": { "command": "droidmap", "args": ["mcp", "."] } } }
Java 以外にインストールしない場合:"command": "java", "args": ["-jar", "/path/to/droidmap.jar", "mcp", "."]。Docker を使用する場合:"command": "docker", "args": ["run", "--rm", "-i", "-v", "/path/to/project:/project", "ghcr.io/hussainshirazi/droidmap", "mcp"]。droidmap は MCP Registry に io.github.hussainshirazi/droidmap として掲載されています(バージョン 0.2.0 以降)。
| ツール | 用途 |
|---|---|
droidmap_impact | エンティティ、ルート、ViewModel、バインディング、モジュールを変更する前に、何が依存しているかを確認します |
droidmap_diff | 未コミットの変更(またはブランチ)が影響する範囲と、それらを対象とするテストを確認します |
droidmap_check | 変更後にルールを実行します |
droidmap_show | 1 つのノードの属性、依存関係、利用元を確認します |
droidmap_find | 名前でノードを検索します |
droidmap_report | プロジェクトの概要を Markdown 形式で取得します |
droidmap_explain | ルールが重要な理由と、検出された問題の修正方法を確認します |
droidmap が理解する内容
| 分野 | 読み取る内容 |
|---|---|
| Gradle | settings.gradle(.kts) に記載されたモジュール、Kotlin DSL と Groovy における project(":x") および型安全な projects.x.y の依存関係、バージョンカタログのプラグイン、インクルードビルド(build-logic)の慣例プラグインが、それを適用する各モジュールに追加するプロジェクト依存関係、Kotlin Multiplatform のソースセット(commonTest の依存関係はテスト依存関係です)。 |
| Room | データベース、エンティティ、DAO(各 @Query が使用するテーブルと、各 @Insert、@Update、@Delete、@Upsert が書き込むエンティティ。継承されたものも含みます)、手動マイグレーションと自動マイグレーション、エクスポートされたスキーマ JSON、各エンティティの列とその JSON の比較、どの MigrationTestHelper テストがどのマイグレーション手順を対象にしているか。 |
| ナビゲーション | 文字列ルート(定数、テンプレート、ヘルパー関数から構築)または型安全なルートを使う Compose Navigation、Navigation 3(entry<Key> と、キーに対する when 内の NavEntry(key))、XML ナビゲーショングラフ(ファイルをまたぐもの、ディープリンク、メニュー項目、戻る操作のみを行うアクションを含む)、Kotlin と Java の navigate(...) 呼び出し:ルート、R.id アクション、Safe Args の方向指定(HomeFragmentDirections.actionHomeToDetail(id))、および navigateToTab(route) などの独自ヘルパー経由の呼び出し(最大5段階のヘルパーまで)。 |
| Hilt | @HiltViewModel、@Inject コンストラクターとフィールド、修飾子付きの @Provides と @Binds、エントリーポイント、および各画面、アクティビティ、フラグメントが使用する ViewModel。 |
| Koin | モジュールと定義(single、factory、viewModel、singleOf(::X)、bind)、Koin Annotations(JSR-330 対応。アノテーション付きクラスが対象となるのは、モジュールの @ComponentScan がそのクラスのパッケージをカバーする場合のみです)、各定義が get() で取得するもの、koinViewModel、koinInject、by inject() の使用箇所。 |
| マニフェスト | ソースマニフェストの権限(tools:node="remove" を含む)とコンポーネント、およびビルドによって生成されている場合は、統合マニフェストの権限と、それぞれを追加したライブラリ。 |
Kotlin と Java は、Kotlin コンパイラー自身のパーサー(detekt と ktlint が使用するもの)を使って、複数のスレッドで読み取られます。
コマンド
droidmap init [path] # write the GitHub workflow and MCP config (never overwrites)
droidmap check [path] [--format text|json|sarif] [--fail-on error|warning|info|never] [--sarif FILE] [--base REF]
droidmap impact <node> [path] [--depth N] [--json] # what depends on a node
droidmap diff [path] [--base REF] [--depth N] [--format text|markdown|json|modules|tasks|tests] [--task NAME] # what a change touches
droidmap show <node> [path] [--json] # a node, its dependencies and its users
droidmap find <text> [path] [--limit N] [--json] # search nodes
droidmap report [path] [-o FILE] # the Markdown report, with Mermaid diagrams
droidmap build [path] [-o DIR] [--node-link] # write droidmap-out/graph.json and REPORT.md
droidmap rules # list the rules and their default severities
droidmap explain <rule> # why a rule matters and how to fix what it finds
droidmap mcp [path] # run the MCP server over stdio
[path] を指定しない場合、droidmap は現在のフォルダーを基準に Gradle プロジェクト(そのフォルダー以上の階層で最も近い settings.gradle(.kts))を対象にします。ターミナルでは出力がカラー表示されます。NO_COLOR=1 でカラー表示を無効にし、FORCE_COLOR=1 で有効にできます。
<node> には、ID、名前、または名前の一部を指定できます。例:TopicEntity、:core:data、"editor?id={id}"、HomeViewModel。check、impact、show、find、report では --config FILE と --graph FILE も指定できます(スキャンの代わりに、保存済みの graph.json を使用します)。build、diff、mcp では --config FILE を指定できます。
diff は、作業ツリー(コミット済みかどうかを問わず、新規ファイルも含む)を、ブランチが --base から分岐した時点(デフォルトは HEAD。つまり未コミットの変更)と比較します。変更された行は、その行を囲む最も内側の宣言に対してカウントされるため、関数を1つ編集してもクラス全体が変更扱いにはなりません。
check --sarif FILE を指定すると、検出結果も SARIF 形式で書き出されます。check --base REF を指定すると、Room のスキーマファイルもそのコミットと比較されます。リリース済みのスキーマのみ変更してはならないため、最後のリリースタグを指定するのが最も正確です。build を使用する場合は、.gitignore に droidmap-out/ を追加してください。
終了コード:処理が完了した場合は 0、check で --fail-on 以上の問題が見つかった場合(または find で一致するものがなかった場合)は 1、使用方法または設定のエラーは 2、内部エラーは 3 です。
ルール
| ルール | デフォルト | 検出内容 |
|---|---|---|
room-migration-path | error | 現在のバージョンへのマイグレーションパスがない既知のスキーマバージョン |
room-schema-missing | warning | 現在のバージョンまたはそれ以前のバージョンのエクスポート済みスキーマ JSON がない |
room-schema-stale | warning | 現在のバージョンのスキーマ JSON と一致しなくなったエンティティ:バージョンを上げずにエンティティを変更すると、更新時にクラッシュします |
room-schema-changed | warning | --base REF を指定した場合:REF 時点ですでに存在していたバージョンのスキーマ JSON が変更されています。そのバージョンがリリース済みの場合、同じクラッシュが発生します |
room-migration-untested | warning | MigrationTestHelper のテストが実行されていないマイグレーションステップ |
room-migration-unused | warning | アプリコードで使用されていない手動の Migration(addMigrations に渡されていないなど)。テストで実行されていても検出します |
room-destructive-fallback | warning | ユーザーデータを削除する fallbackToDestructiveMigration() |
room-insert-replace | off | 行を削除して再挿入する @Insert(onConflict = REPLACE) |
nav-unknown-target | error | どのデスティネーションも登録していないルートまたはキーへの navigate() |
nav-unreachable | warning | どこからも遷移、開始、参照されず、ディープリンクやメニュー項目からも開かれないデスティネーション |
nav-deeplink-not-in-manifest | warning | スキームとホストを受け入れるアクティビティのインテントフィルターがないディープリンク(navDeepLink、<deepLink>)。そのため、リンクからアプリを開けません |
hilt-missing-binding | warning | @Inject コンストラクター、@Provides、@Binds のいずれもない、インジェクション対象のプロジェクト型 |
hilt-duplicate-binding | error | 同一の型と修飾子が、1 つのソースセット内で重複してバインドされています |
hilt-app-not-registered | error | @AndroidEntryPoint クラスがある一方で、マニフェストの <application android:name> が @HiltAndroidApp クラスを指していない(または該当クラスがない)状態です。これらのクラスを開くとクラッシュします |
hilt-fragment-host | error | @AndroidEntryPoint フラグメントが、@AndroidEntryPoint ではないアクティビティにホストされています(ナビゲーショングラフ、レイアウト、フラグメントトランザクション経由)。フラグメントがアタッチされるとクラッシュします |
workmanager-setup | warning | HiltWorkerFactory を渡すものがない @HiltWorker、またはデフォルトのイニシャライザーがまだマニフェストにあるため WorkManager が呼び出さない Configuration.Provider |
koin-missing-definition | warning | Koin が要求する型(get()、inject()、koinInject())を提供する Koin 定義がありません。実行時に NoDefinitionFoundException が発生します |
gradle-unknown-project | error | settings に含まれていないモジュールへのプロジェクト依存関係 |
gradle-forbidden-dependency | error | [[gradle.forbid]] ルールで禁止されている依存関係 |
gradle-cycle | error | 相互に依存する循環依存モジュール |
manifest-permission | error | allowed_permissions にない権限。ソースマニフェスト内にある場合、またはライブラリによってマージ後のマニフェストに追加された場合を検出します |
gson-model-not-kept | warning | Gson がリフレクション(fromJson、TypeToken、GsonConverterFactory を使う Retrofit API)で読み込むクラスのフィールドが、難読化されたリリースビルドで R8 によって名前変更されます。@SerializedName、@Keep、keep ルールがありません。デバッグビルドでは動作しますが、リリースビルドでは空のフィールドが読み込まれます |
設定
プロジェクトのルートに .droidmap.toml を配置します(すべて省略可能です)。
[rules]
"room-migration-untested" = "error" # error | warning | info | off
"room-insert-replace" = "error"
[manifest]
allowed_permissions = ["android.permission.INTERNET", "android.permission.POST_NOTIFICATIONS"]
[[gradle.forbid]]
from = ":feature:*"
to = ":feature:*"
reason = "features talk to each other through :core modules"
[ignore]
paths = ["benchmarks/**"]
不明なルール名や重大度はエラーになるため、入力ミスによってルールが変更されないままになることはありません。from、to、ignore.paths は glob パターンで、* は : と / にも一致します。禁止ルールは tests = true を指定しない限り、テストの依存関係をスキップします。allow_same_parent = true を指定すると、:feature:a:impl と :feature:a:api のような兄弟モジュールが相互に依存できます。allowed_permissions を使うと、ライブラリがマージ済みマニフェストに追加する権限がライブラリ名とともに報告されるため、その権限を削除する(tools:node="remove")か、許可できます。
グラフ
droidmap build は、次の3つのリストを含む droidmap-out/graph.json(スキーマ droidmap/1)を書き出します。
nodes:id、kind、label、file、line、module、attrs。edges:source、target、kind、file、line、attrs。unresolved:静的解析で追跡できなかった内容と、その理由。
エッジは常に source が target に依存することを表すため、影響範囲は逆方向にたどります。パスはプロジェクトルートからの相対パスで、出力は決定的なため、差分を簡単に確認できます。--node-link を指定すると、graphify などのツールが読み込める networkx の node-link 形式も書き出します。
ノードの種類:module、room_database、room_entity、room_dao、room_migration、room_schema、test、nav_destination、nav_route、screen、function、viewmodel、injectable、hilt_module、hilt_provider、koin_module、koin_definition、entry_point、component、permission、class。
エッジの種類:depends_on、contains_entity、contains_dao、queries、writes、has_schema、migrates、tests、registers、shows、navigates_to、starts_at、uses_viewmodel、injects、bound_by、requires、declared_in、uses_permission、declares。
制限事項
droidmap はソースを読み取りますが、Gradle は実行しません。そのため、数秒で処理でき、ビルドされていないチェックアウトでも動作し、プロジェクトのビルドスクリプトを実行することもありません。一方で、ビルドによってのみ生成されるものは扱えません。また、意図的に保守的な動作をします。解決できないもの(変数に格納されたルート、定数ではないバージョン、型を特定できない Koin 定義など)は推測せず、unresolved に記録し、その項目に対してルールは適用されません。推測に基づくルールは、実際には存在しない問題を報告してしまいます。
- ビルドで生成されるコード(KSP、kapt)は読み取りません。Safe Args では生成コードを必要としません。
HomeFragmentDirections.actionHomeToDetail()は、Safe Args が生成コードに付ける名前を使って対応するアクションと照合されます。 - ライブラリが追加する権限は解決済みの依存関係から取得するため、ビルドによって生成済みの場合に限り、マージ済みマニフェストを読み取ります(
<module>/build/intermediates/merged_manifests/、または Action のmerge-manifest入力)。マージ済みマニフェストがビルドファイルより古い場合は、その旨が示されます。 - 名前は Kotlin と Java のルール(インポート、パッケージ、囲んでいるクラスとそのスーパータイプ)に従って解決されますが、型推論は行いません。型推論にはコンパイラーとすべての依存関係が必要です。
repo.load()のような変数に対する呼び出しは、変数の型が宣言されている場合、またはコンストラクターや関数の宣言済み戻り値の型から分かる場合に追跡されます。ラムダのit、ジェネリックの型引数、ライブラリ呼び出しの連鎖など、型推論が必要な場合は追跡されません。 - 実行時に構築される値は追跡されません。たとえば、
varから読み取るルートや、ループ内で構築されるルートは対象外です。定数、文字列テンプレート、それらを返す関数、および最大5階層までのヘルパー関数は追跡されます。
貢献
./gradlew test fatJar を実行すると、テストを実行し、build/libs/droidmap.jar をビルドします。CONTRIBUTING.md には、コードの場所、新しいルールや修正に必要なこと、CI での実プロジェクトを使ったチェックが記載されています。誤った検出や見逃しを報告する場合は、False positive or missed problem の Issue フォームを使用してください。セキュリティ上の問題は、SECURITY.md の説明に従って非公開で報告してください。
ライセンス
Apache-2.0。LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。