AppFunctions, the Jetpack library that lets AI agents discover and call functions in your app, reached 1.0.0-rc01 on Nov 4, 2026. The release itself is tiny: the release notes say only that it is a version bump to RC and that the legacy aggregation compiler option is removed. The real story is the five releases before it. If you followed my earlier AppFunctions post, written against alpha10, a good part of that code no longer compiles. This is the checklist, built from the AndroidX release notes.
Why rc matters: per the AndroidX stage definitions, a release candidate has a final API surface and may only receive critical last-minute fixes. If you were waiting to start, the churn below is the reason to wait no longer.
1. The annotation was renamed
In alpha13 (Oct 7, 2026) the AppFunction annotation became AppFunctionDeclaration. The same release renamed ObserveAppFunctionsEvent to AppFunctionsChangeEvent and surfaced AppFunctionMetadata in AppFunctionService.
Then beta01 (Oct 21, 2026) removed the default value of isDescribedByKDoc from AppFunctionDeclaration, AppFunctionSerializable and AppFunctionSignature. You must now say explicitly whether the KDoc is the description the agent sees:
// alpha10
@AppFunction(isDescribedByKDoc = true)
suspend fun listNotes(appFunctionContext: AppFunctionContext): List<Note>?
// rc01: new name, and the flag has no default so it must stay explicit
@AppFunctionDeclaration(isDescribedByKDoc = true)
suspend fun listNotes(/* see section 2 for the context parameter */): List<Note>?
Do the same for every @AppFunctionSerializable class, otherwise the build fails.
2. AppFunctionContext and AppFunctionConfiguration are gone
Alpha12 (Sep 23, 2026) removed both AppFunctionContext and AppFunctionConfiguration. That is why the first-parameter-must-be-context rule from my alpha10 post is obsolete. The release notes do not spell out the replacement for execution info, so check the 1.0 reference for your signatures instead of guessing. The alpha10 notes had already flagged AppFunctionConfiguration for removal in favor of @AppFunctionServiceEntryPoint, which stays: declarations still live inside an AppFunctionService annotated with it.
3. Gradle setup changed
The rc01 dependency snippet on the release page lists two lines: the runtime artifact and the KSP compiler. The separate appfunctions-service artifact I used in the alpha10 post does not appear in it, while appfunctions-testing is released alongside.
dependencies {
implementation("androidx.appfunctions:appfunctions:1.0.0-rc01")
ksp("androidx.appfunctions:appfunctions-compiler:1.0.0-rc01")
androidTestImplementation("androidx.appfunctions:appfunctions-testing:1.0.0-rc01")
}
rc01 also removes the legacy aggregation compiler option. If your build passes a KSP argument for aggregation, delete it and rebuild.
4. Other renames and type moves in beta01
AppFunctionNamemoved fromandroidx.appfunctions.metadatatoandroidx.appfunctions. Fix your imports.AppFunctionAppMetadata.descriptionis nowinstructions, and the matching XML attribute changed the same way, to align with MCP naming.- The regex pattern in
@AppFunctionStringValueConstraintwas replaced bypatternMatchers, backed byandroid.os.PatternMatcher. Regexes need rewriting as prefix, literal or simple-glob matchers. AppFunctionResourceContainerandAppFunctionTextResourceare now@ExperimentalAppFunctionsApi.AppFunctionTestRulenow supportsAppFunctionServiceEntryPoint, so your Robolectric tests can exercise the real entry point.
5. State is no longer part of metadata
Alpha11 (Aug 26, 2026) added AppFunctionState and AppFunctionManager#getAppFunctionStates, replacing AppFunctionMetadata#isEnabled. Metadata is now purely descriptive. If a settings screen reads isEnabled to show a toggle, switch it to the states API:
// alpha10 style, no longer available
val on = metadata.isEnabled
// since alpha11: ask the manager for state, keyed to the function
val states = appFunctionManager.getAppFunctionStates(/* search spec or ids */)
I am leaving the call arguments as a placeholder because the release notes name the method but not its signature. Alpha11 also added getAppFunctionActivityStates and changed observeAppFunctions to match the platform API.
6. New in the alphas, mostly experimental
- Access control (alpha13):
@AppFunctionAccessLevelsupports an access restriction setting per function. - Dynamic registration (alpha11 to alpha12):
@AppFunctionSignatureplusregisterAppFunction,registerAppFunctions,RegisterAppFunctionRequestandCallbackAppFunction, all marked@ExperimentalAppFunctionsApi. Useful when the available functions depend on runtime state. - Constraints (alpha12):
AppFunctionUriValueConstraintis public, andscopewas added toAppFunctionMetadataandAppFunctionSearchSpec. - Requests (alpha12):
ExecuteAppFunctionRequestgainedactivityId; earlier, alpha09 addedAppInteractionAttribution. - Sidecar apps (alpha11):
ExtensionsAppFunctionService.
7. Bug fixes worth knowing
- Beta01:
java.timeparameter types now deserialize in apps with Java library desugaring enabled, previously they failed. - Beta01: on SDK 37 and above, URI permissions were being granted twice; fixed.
- Beta01: the generated file name could contain symbols invalid on some operating systems; fixed.
- Alpha13:
AppFunctionDatasupports all built-in proxy types:LocalDate,LocalTime,Instant,ZoneId.
Migration checklist
- Bump all three artifacts to
1.0.0-rc01and dropappfunctions-servicefrom your build file if you still have it. - Rename
@AppFunctionto@AppFunctionDeclarationand setisDescribedByKDocexplicitly everywhere it is used. - Remove
AppFunctionContextandAppFunctionConfigurationusage; keep@AppFunctionServiceEntryPoint. - Replace
isEnabledreads withgetAppFunctionStates, andmetadata.descriptionwithinstructions. - Rewrite any regex in
@AppFunctionStringValueConstraintusingpatternMatchers. - Delete the legacy aggregation KSP option and run your
AppFunctionTestRuletests.
Sources: the AndroidX release notes for androidx.appfunctions (versions alpha09 through 1.0.0-rc01, retrieved Nov 5, 2026) and the AndroidX all-channel release page listing Nov 4, 2026.
No comments yet. Be the first to leave one!