Azure Communication Services: Does the ACS UI Library for Android support Android Automotive OS also?
We are building a Microsoft Teams like app for the Android Automotive OS (AAOS) environment. This app would provide its users with a similar calling/meeting experience as the MS Teams client app for Mobile and Desktop.
For this purpose, we tried making use of the Azure Communication Services SDKs for Android environment. Specifically, we tested the ACS Calling SDK and ACS UI Library for Android.
We tried creating a small sample app for launching the UI CallComposite available in ACS UI library that allows us to launch an end-to-end calling experience from our Android app, after a bit of configuration.
However, upon building and running the app on an Android emulator, we find that the app crashes upon launching when run on an Automotive emulator that runs AAOS. The same app builds and runs successfully for a Pixel Tablet emulator running Android OS API 33. So our question is: Does the ACS UI library for Android support Android Automotive environments or is it primarily built to work with Android OS specific devices like Mobile/Tablet?
Here are the exact crash logs we get in an Android automotive emulator:
---------------------------- PROCESS STARTED (4131) for package com.mohit.acsuilibraryapp ----------------------------
2026-08-24 22:58:02.173 4131-4131 acsuilibraryapp com.mohit.acsuilibraryapp E No implementation found for int io.netty.internal.tcnative.Library.aprMajorVersion() (tried Java_io_netty_internal_tcnative_Library_aprMajorVersion and Java_io_netty_internal_tcnative_Library_aprMajorVersion__)
2026-08-24 22:58:02.312 4131-4131 acsuilibraryapp com.mohit.acsuilibraryapp E No implementation found for int io.netty.channel.epoll.Native.offsetofEpollData() (tried Java_io_netty_channel_epoll_Native_offsetofEpollData and Java_io_netty_channel_epoll_Native_offsetofEpollData__)
2026-08-24 22:58:02.375 4131-4131 acsuilibraryapp com.mohit.acsuilibraryapp E No implementation found for int io.netty.channel.kqueue.Native.sizeofKEvent() (tried Java_io_netty_channel_kqueue_Native_sizeofKEvent and Java_io_netty_channel_kqueue_Native_sizeofKEvent__)
2026-08-24 22:58:08.448 4131-4131 AndroidRuntime com.mohit.acsuilibraryapp E FATAL EXCEPTION: main
Process: com.mohit.acsuilibraryapp, PID: 4131
2026-08-24 22:58:08.605 4131-4142 acsuilibraryapp com.mohit.acsuilibraryapp I Background concurrent copying GC freed
For your reference, I am also posting the MainActivity code for this small sample app:
class MainActivity : AppCompatActivity() { private var userAccessToken: String = "" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContentView(R.layout.activity_main) ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) insets } val acsIdentityClient = getCommunicationIdentityClient() userAccessToken = createAcsUserAndGetAccessToken(acsIdentityClient) val startButton: Button = findViewById(R.id.startButton) startButton.setOnClickListener { l -> startCallComposite() } } private fun startCallComposite() { val communicationTokenRefreshOptions = CommunicationTokenRefreshOptions(::fetchToken, true) val communicationTokenCredential = CommunicationTokenCredential(communicationTokenRefreshOptions) val locator: CallCompositeJoinLocator = CallCompositeTeamsMeetingLinkLocator("https://teams.live.com/meet/9316675669362?p=2PatJEdgqNhouCyMUG") val callComposite = CallCompositeBuilder() .applicationContext(this.applicationContext) .credential(communicationTokenCredential) .displayName("John Doe").build() callComposite.launch(this, locator) } private fun fetchToken(): String { return userAccessToken } private fun getCommunicationIdentityClient(): CommunicationIdentityClient { return CommunicationIdentityClientBuilder() .connectionString(CONNECTION_STRING) .buildClient() } private fun createAcsUserAndGetAccessToken(acsIdentityClient: CommunicationIdentityClient): String { val user = acsIdentityClient.createUser() Log.d(TAG, "Created a user identity in ACS with id: ${user.id}") val scopes: List<CommunicationTokenScope> = listOf(CommunicationTokenScope.VOIP) val accessToken: AccessToken = acsIdentityClient.getToken(user, scopes) val token = accessToken.token return token } companion object { private const val CONNECTION_STRING = "<MY_ACS_CONNECTION_STRING>" private const val TAG = "MainActivity" } }
createAcsUserAndGetAccessToken runs two blocking HTTP calls, createUser() and getToken(), directly inside onCreate. Android throws on network I/O on the main thread, which matches your FATAL EXCEPTION: main and the six second gap between process start and the crash.
Move it off the main thread:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val startButton: Button = findViewById(R.id.startButton)
startButton.isEnabled = false
lifecycleScope.launch {
userAccessToken = withContext(Dispatchers.IO) {
createAcsUserAndGetAccessToken(getCommunicationIdentityClient())
}
startButton.isEnabled = true
}
startButton.setOnClickListener { startCallComposite() }
}