Which of these apply to you
To find the experimental code this guide affects, search your native sources forexperimental, case-insensitively. Deprecated APIs don’t carry that word, so search for their names too. The following table maps what you find to the section that covers it.
Target Vega 2.0 in the app manifest
Update your app manifest to target 2.0. Inmanifest.toml, set [os.version] min and target to 2.0, and update the [[needs.module]] entry from /com.amazon.vega.os@IVega_1_2 to /com.amazon.vega.os@IVega_2_0.
To set the minimum and target versions from the command line, run the following command in your project directory:
[[needs.module]] entry in manifest.toml reads /com.amazon.vega.os@IVega_2_0.
A minimum of 2.0 keeps your updated app off older devices, where some of the APIs in this guide behave differently or don’t exist.
Remove local copies of SDK IDLs
The Vega SDK 2.0 now installs a full set of supported IDLs. Before SDK 2.0, some IDLs went to partners out of band. A local copy of an IDL takes precedence over the copy the SDK includes, so your app builds against the local one without a warning. Look for.idl files inside your project under a path that mirrors an SDK namespace, for example apmf/iface/com/amazon/kepler/. Delete any that SDK 2.0 provides, and build against the SDK provided IDLs.
Suggested order
Take the sections in the following order, which starts with the renames and puts messaging before the two changes that depend on it:- DHCP and input method change namespace only.
- Media control is additive, so adopt it when you want the new capabilities. It doesn’t depend on any other section.
- Graphics swaps the
IObjectFactoryentry point forIGraphicsModule, independent of the other sections. - Messaging is the largest change, and both the lifecycle management API and tasks depend on it.
- Lifecycle management API and lifecycle control move together. Stable
com.amazon.kepler.applicationinterfaces takeIComponentInstancefromcom.amazon.kepler.runtime, so you can’t move one without the other. - Tasks also needs stable
IMessage, so migrate it after messaging. - The deprecated interface sections don’t depend on the experimental sections. These are Content personalization, Subscription entitlement, Channel server, EPG program lineup, and UCC TextChunk. Their handler registration takes a
com.amazon.kepler.runtime.IComponentInstance, the same type the lifecycle management API migration uses. - UI toolkit graphics and deprecated methods are independent of everything else.
Lifecycle management API
The stable APIcom.amazon.kepler.application replaces com.amazon.kepler.experimental_mr33.app. Full definitions are in application.idl.
The stable API retains IInteractiveComponent, IServiceComponent, ITaskComponent, IComponentFactory, IMemoryWarningHandler, IMemoryWarningInfo, and MemoryLevel.
What changed
Differences beyond the namespace:IComponentInstancemoved tocom.amazon.kepler.runtime.IMessageis now stable messaging.onStartandonNewLaunchtakecom.amazon.kepler.messaging.IMessage.ITaskComponent2folded intoITaskComponent, whereonNewLaunchis now a base method.onSaveState(instance)is new onIInteractiveComponent. It fires after the component goes to the background, and gives you a final chance to save state throughIRestorationManager.onReconfigureandReconfigureReasonare removed.
What to do
- Update the imports and the namespace to
com.amazon.kepler.application. - Take
IComponentInstancefromcom.amazon.kepler.runtimeandIMessagefromcom.amazon.kepler.messaging. Migrate all three together. - If you implemented
ITaskComponent2, collapse it ontoITaskComponent. - Implement
onSaveStateand save UI state throughIRestorationManager. It runs on the main thread, so finish any cross-thread collection before you return, and don’t throw, because an exception there terminates the app.
Unresolved
Reacting to locale, timezone, and day and night changes.onReconfigure notified a component that the system had been reconfigured. Check the runtime and config APIs for a replacement, and ask your Amazon contact before you migrate.
Messaging API
The stable APIcom.amazon.kepler.messaging replaces com.amazon.kepler.experimental_mr33.messaging. This is a redesign rather than a rename, so expect many call sites to change. Full definitions are in messaging.idl.
What changed
IMessageChannel and IMessageChannel2 are removed. The entry-point interface IMessagingModule replaces IKeplerMessagingModule:
- Sending messages moves from
IMessageChanneltoIMessagingModule:send(IMessage* message, IMessageListener? listener). The listener is optional. Passnullptrand no callbacks fire for delivery, response, or error. - Registering filters moves from
IMessageChanneltoIMessagingModule:registerMessageFilter(IMessageFilter*[] filters, IMessageListener* listener)returns anIMessageFilterSubscription. To detach the listener and stop delivery, callunsubscribe(), which the subscription inherits fromISubscription. To remove specific filters and keep the listener attached, callunsubscribeFilters(filters).
IMessage accessors change name, and one changes type. The following table shows the renamed accessors.
QueryInterface on the result of getAttachmentBytes(). Deserialize the bytes with GetDoFromArray<T> instead. On the sending side, IMessageBuilder.attachment() now takes an IDataObject* instead of an IStandard*.
IMessageListener2 folded into IMessageListener, where onMessageDelivered() is now a base method.
priorityHint(MessagePriorityHint::IMMEDIATE) on IMessagePropertiesBuilder is replaced by markUrgent().
Also new. The access control methods on IMessagingModule: canSendUri, canSendUriForCredential, and canReceiveUriForCredential. They expand what IMessageChannel2.canSendUri did.
What to do
- Delete channel creation.
makeMessageChannelfollowed bychannel->send(...)becomesmodule->send(message, listener). - Replace
channel->registerMessageFilter(...)withmodule->registerMessageFilter(filters, listener), and keep the returned subscription. Dropping your references doesn’t unsubscribe. - Rename the
IMessagereads, and rewrite attachment extraction togetAttachmentBytes()withGetDoFromArray<T>. - Pass an
IDataObjecttoIMessageBuilder.attachment(). - Implement
onMessageDelivered()in everyIMessageListener. If you implementedIMessageListener2, collapse it ontoIMessageListener. - Replace
priorityHint(MessagePriorityHint::IMMEDIATE)withmarkUrgent(). - Test the send, receive, response, and filter paths.
Input method API
The stable APIcom.amazon.kepler.intl.input_method replaces com.amazon.kepler.experimental.intl.input_method. This is a promotion to stable with no redesign. Full definitions are in input_method.idl.
What changed
The[Experimental] package annotation and the com.amazon.apmf.Experimental import are removed. The namespace drops experimental., and the package version moves from 1.0 to 2.0.
What to do
Update the import path and the namespace. Recompile and confirm.Media control
The stable APIcom.amazon.kepler.media.control replaces com.amazon.kepler.media.experimental_control_2024_02. The interfaces are unchanged. After you update the namespace and includes your existing calls keep working. Full definitions are in control.idl.
What changed
The following table shows the extension types that Vega SDK 2.0 adds.What to do
Update the namespace and includes. The following extension types are optional. Adopt the matching one to add a capability:- Ratings: prefer
MediaSessionState2.ratingStatewhen it’s present. It’s null when the provider doesn’t support structured ratings for the session, so keep theMediaInfo.currentRatingfallback. - Dark theme: supply
darkLogoonMediaProviderInfo2. - Collections: populate
collectionNamewhen your content has a playlist or mix name. - Cross-system correlation: to match a session across process or device boundaries, use
MediaSessionId2.token.
Graphics
com.amazon.kepler.graphics is already stable, but 2.0 replaces the IObjectFactory entry point, which had unstable dependencies, with IGraphicsModule. Native apps use graphics, so check for it even though a search for experimental won’t find it. Full definitions are in graphics.idl.
What changed
- You acquire graphics through
IGraphicsModule, and the component path drops the interface suffix. createDisplayController(instance, nullptr)becomescreateDisplayControllerForApp(instance, nullptr), whereinstanceis acom.amazon.kepler.runtime.IComponentInstance.createMediaSurface,createGpuDeviceUsingOpenGlesApi, andcreateWindowkeep their names, now called onIGraphicsModule.
What to do
- Include
graphics/IGraphicsModule.hin place ofgraphics/IObjectFactory.h. - Change the acquisition from
getComponent("/com.amazon.kepler.graphics.IObjectFactory")queried toIObjectFactory, over togetComponent("/com.amazon.kepler.graphics")queried toIGraphicsModule. - Rename
createDisplayController(instance, nullptr)tocreateDisplayControllerForApp(instance, nullptr).
Tasks API
Thecom.amazon.kepler.tasks package is already stable, but the experimental flow inside it is removed in 2.0. Full definitions are in tasks.idl.
What changed
ITaskInput_Experimental_MR33 and ITaskRequestBuilder_Experimental_MR33 are removed. Both tied you to experimental messaging: getMessageTrigger() returned com.amazon.kepler.experimental_mr33.messaging.IMessage, and requireMessage() took an experimental IMessageFilter. Code that uses them won’t compile against 2.0.
Vega SDK 2.0 adds the stable path:
TaskExecutionInfo, a struct withuuidandnamethat identifies one task execution.ITaskManager2, withtryGetMessageTrigger(TaskExecutionInfo*)returning stableIMessage?, andsubmitResult(TaskExecutionInfo*, ITaskResult*).
onStart message, and you submit the result through ITaskManager2.
What to do
- Read the
TaskExecutionInfofrom the launch message’s attachment:GetDoFromArray<TaskExecutionInfo>(message->getAttachmentBytes()). - Get an
ITaskManager2from the tasks module’smakeTaskManager(), and submit your result withsubmitResult(taskExecutionInfo, result). - Complete a task that can’t submit a result by calling
executionCompleted()on the instance’sIComponentInstance2, not throughIAppLifecycleControl. - Migrate Messaging first, and finish both migrations together.
- Move your
ITaskComponentimplementation to stablecom.amazon.kepler.applicationat the same time. ItsonStartandonNewLaunchtake stableIMessageand theruntimeIComponentInstance.
Lifecycle control
The stable APIscom.amazon.kepler.runtime and com.amazon.kepler.app_lifecycle replace com.amazon.kepler.experimental_mr33.app_lifecycle_control. Instance-scoped control moves to runtime, and termination data stays in app_lifecycle. Full definitions are in runtime.idl and app_lifecycle.idl.
What changed
The call pattern inverts. Previously you held a separate control object and passed it the instance. Now you call the instance itself from inside your app process, through theseruntime interfaces:
IComponentInstancegainsgetComponent().IComponentInstance2hasexecutionCompleted(), which takes no argument.IInteractiveComponentInstance, which extendsIComponentInstance2, hasrequestBack(),makeInstanceConfigBuilder(), andconfigure().IInteractiveComponentConfigurationandIInteractiveComponentConfigurationBuilderare new. The builder offerstransientLifespan(),shortLifespan(),longLifespan(),permanentLifespan(),timeout(),disableTimeout(), andbuild().
IAppLifecycleControl2.tryGetLastTerminationData() still returns ITerminationInfo?, and TerminationReason stays with it. If you use last-termination information, that code doesn’t move.
IAppLifecycleControl.executionCompleted(instance) in app_lifecycle is marked Deprecated (2026-01), and so is the same method on IAppLifecycleControl2. That’s the old call pattern, and the deprecation marks the move to the instance-scoped form.
What to do
- Replace
control->executionCompleted(instance)withinstance->executionCompleted(). To getIComponentInstance2, callQueryInterfaceon the instance you were given. - For back navigation and configuration on interactive components, call
QueryInterfaceforIInteractiveComponentInstance, then callrequestBack(). - Set lifespan and timeout through
makeInstanceConfigBuilder()andconfigure(). Lifespan controls which instance a backstack walk can transition to.
DHCP
The stable APIcom.amazon.kepler.net.dhcp replaces com.amazon.kepler.experimental_vr10.net.dhcp. Full definitions are in dhcp.idl.
What changed
IDhcpModule, IDhcpServer, IDhcpSettings, and IDhcpSettingsBuilder don’t change.
What to do
Update the namespace and the import. Recompile and confirm.Content personalization
IContentPersonalizationServerComponent2 and IContentPersonalizationServer2 replace the deprecated IContentPersonalizationServerComponent and IContentPersonalizationServer in com.amazon.kepler.tv.personalization. The deprecated interfaces aren’t in Vega SDK 2.0. Full definitions are in personalization.idl.
What changed
getOrMakeServer()becomesgetOrMakeServer2(), which returnsIContentPersonalizationServer2.- Each handler setter now takes the component instance it serves, a
com.amazon.kepler.runtime.IComponentInstance. The following table shows the renamed setters. makeContentEntitlementsProvider(),makeCustomerListEntriesProvider(), andmakePlaybackEventsProvider()are removed from the server component. Your handlers receive a provider as their callback argument.- The
report*methods and themake*Buildermethods don’t change.
What to do
- Replace the deprecated types everywhere you use them, including
Ptr<>members,usingdeclarations, and mock and helper signatures. - Include
IContentPersonalizationServer2.handIContentPersonalizationServerComponent2.hfromapmf/iface/com/amazon/kepler/tv/personalization/in place of the unversioned headers. Addapmf/iface/com/amazon/kepler/runtime/IComponentInstance.h. - Call
getOrMakeServer2(). - Get the
runtimeIComponentInstancefrom the instance your component receives, by callingTryQueryInterface<com::amazon::kepler::runtime::IComponentInstance>()on it. Pass it to each...ForComponentsetter. - Stop calling the
make*Provider()methods. Use the provider your handler receives. - If you can’t get a component instance or resolve the server component, log it and continue rather than failing initialization.
Subscription entitlement
ISubscriptionEntitlementServerComponent2 and ISubscriptionEntitlementServer2 replace the deprecated ISubscriptionEntitlementServerComponent and ISubscriptionEntitlementServer in com.amazon.kepler.tv.subscription_entitlement. The deprecated interfaces aren’t in Vega SDK 2.0. Full definitions are in subscription_entitlement.idl.
What changed
getOrMakeServer()becomesgetOrMakeServer2(), which returnsISubscriptionEntitlementServer2.setSubscriptionEntitlementsHandler(handler)becomessetSubscriptionEntitlementsHandlerForComponent(handler, instance), whereinstanceis acom.amazon.kepler.runtime.IComponentInstance.makeSubscriptionEntitlementsProvider()is removed from the server component. Your handler’sgetAllSubscriptionEntitlementsreceives a provider.setSubscriptions(subscriptions)is new. It replaces the whole subscription list.reportNewSubscriptionandreportRemovedSubscriptionstill exist onISubscriptionEntitlementServer2, but they’re deprecated in favor ofsetSubscriptions.
What to do
- Replace the deprecated types and includes with the
...2versions. - Call
getOrMakeServer2(), and register your handler withsetSubscriptionEntitlementsHandlerForComponent. Get theruntimeIComponentInstancethe same way as for Content personalization. - Call
setSubscriptionEntitlementsHandlerForComponentbeforereportRefreshedSubscriptions. - Replace
reportNewSubscriptionandreportRemovedSubscriptionwithsetSubscriptions, passing the full current list. - Stop calling
makeSubscriptionEntitlementsProvider(). Use the provider your handler receives.
Channel server
The stable APIcom.amazon.kepler.tv.kepler_channel_server2 replaces the deprecated com.amazon.kepler.tv.kepler_channel_server. It covers IChannelServerComponentAsync, IChannelServerAsync, IChannelHandlerAsync, and IChangeChannelPromise. Full definitions are in kepler_channel_server2.idl.
What changed
- The component instance moves from getting the server to setting the handler.
getOrMakeServer(component)becomesgetOrMakeServer(), andsetHandler(handler)becomessetHandlerForComponent(handler, component). IChannelHandlerAsyncandIChangeChannelPromisekeep the same methods in the new namespace.
What to do
- Update the namespace to
kepler_channel_server2and the includes toapmf/iface/com/amazon/kepler/tv/kepler_channel_server2/. - Call
getOrMakeServer()with no argument, thensetHandlerForComponent(handler, component)with the component instance you were passing before. - Recompile your handler and promise code against the new namespace.
EPG program lineup
IProgramLineupProvider2 replaces the deprecated IProgramLineupProvider in com.amazon.kepler.tv.epg_provider. Full definitions are in epg_provider.idl.
What changed
- You get the provider from
IEpgProviderFactory2.makeProgramLineupProvider2()instead ofIEpgProviderFactory.makeProgramLineupProvider(). upsert(programs)returns an array ofIUpsertProgramFailureinstead of nothing. It skips programs that fail and keeps inserting the rest.clearAllPrograms()andcommit(version)don’t change.
What to do
- Query the factory for
IEpgProviderFactory2and callmakeProgramLineupProvider2(). - Check the failures
upsertreturns, and handle or log each one.
UCC TextChunk
The data objectTextChunk2 replaces the deprecated struct TextChunk in com.amazon.kepler.ucc.v1_0.common. Full definitions are in common.idl.
What changed
The following table shows the field changes.What to do
- Build
TextChunk2objects in place ofTextChunkstructs. - Convert
fontSizefrom pixels to points, and passlanguageas aLocale. - Set
interpretationTypeon every chunk. - Call
text2,addPane2, andaddCollectionInfo2onIDescribeElement2.
Unresolved
How to construct aTextChunk2. Check common.idl, and ask your Amazon contact.
UI toolkit graphics
com.amazon.kepler.uitoolkit.graphics.IGraphicsModule5 keeps its name in Vega SDK 2.0, but its definition changed. This is a different interface from the com.amazon.kepler.graphics.IGraphicsModule in Graphics.
What changed
- In SDK 0.24,
IGraphicsModule5extendsIGraphicsModule4and addsgetShareableSurfaceRegistry(). In 2.0, it extendsIGraphicsModule4and addsmakePathMeasure(IPath* path, bool forceClosed)instead. - The two versions are binary-incompatible. Code built against 0.24 that queries
IGraphicsModule5doesn’t compile against 2.0. Code built against 2.0 that queriesIGraphicsModule5works only on Vega 2.0 devices or later. - An app you already built with 0.24 that queries
IGraphicsModule5can fail at runtime on Vega 2.0 devices, with an IDL hash break exception. To keep it working, rebuild and resubmit it. IShareableSurfaceRegistry,IShareableSurfaceObserver, andShareableSurfaceHandleare removed, with no public replacement.
What to do
- If you query
IGraphicsModule5only to call methods it inherits fromIGraphicsModule4, queryIGraphicsModule4instead. You don’t need to change your minimum OS version. - If you call
makePathMeasure, queryIGraphicsModule5and set your minimum OS version to 2.0, as described in Target Vega 2.0 in the app manifest.
Unresolved
ShareableSurface. If your code callsgetShareableSurfaceRegistry(), ask your Amazon contact before you migrate.
Deprecated methods
These methods are deprecated, but their interfaces aren’t, so migrate the call and keep the interface.digestAlgorithm names crypto3.IHmacContextBuilder2. That namespace isn’t in the SDK. Use IHmacContextBuilder2 in com.amazon.kepler.crypto.
For keystore MAC keys, build the key with IKeystore2.makeMacKeyBuilder() instead of makeSymmetricKeyBuilder(). IKeystoreMacKeyBuilder inherits macAlgorithm from com.amazon.kepler.crypto.IHmacKeyBuilder, so you won’t find it on the keystore interface itself. The algorithm parameter changes type from IDigestAlgorithm to IMessageAuthenticationCode.
