{"id":15220301,"date":"2026-07-21T13:00:00","date_gmt":"2026-07-21T17:00:00","guid":{"rendered":"https:\/\/www.inthacity.com\/news\/build-intelligent-android-apps-on-device-inference\/"},"modified":"2026-07-22T03:34:35","modified_gmt":"2026-07-22T07:34:35","slug":"build-intelligent-android-apps-on-device-inference","status":"publish","type":"post","link":"https:\/\/www.inthacity.com\/news\/build-intelligent-android-apps-on-device-inference\/","title":{"rendered":"Build intelligent Android apps: On-device inference"},"content":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEhd7g4aJ0ZhzVcuPr3SzBJIVQ_MZT3hIXb1Ff8SVjjrvRjYzZwhgoE7IbHryS6Ds7u7if1_tmVmMdkFNAtPADXoeuRQ_64Pxfnp3oq2aHR8hbS3fDExGxE0nSiOvXPw7SonhNdjFNI2eDJfasEEMs0xjh2gZlyPq6ToimvFlaMv2-nVDz_XLnSXK1iCn4U\/s2469\/0625%20Building%20JetPacker%20with%20Intelligent%20On-Device%20features_Meta%20v02.png\" style=\"display: none\" \/><\/p>\n<div><i>Posted by Caren Chang, Developer Relations Engineer, Android Developer Relations<\/i><\/div>\n<div>\n<div class=\"separator\" style=\"clear: both;text-align: center\"><a href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgIU-6haqWEXnugbhG5is8t1TU0tN3EkfSc7GwvHMRsMSU14k-P7q4il_nJlGk-qNP_PG3aKs1LDWNgWKqhFsG6Q16v2zeoHMvqY_PesC5ddxHRjTGgtiQ33uvOrUIPkSdUgFfBIYSkqBhcuZJTY8jbW0mOjKs8XF8DLxfyD7CjJ1Sd4FM7AUrufTnSEVw\/s8582\/0625%20Building%20JetPacker%20with%20Intelligent%20On-Device%20features_Blog%20v02.png\" style=\"clear: left;float: left;margin-bottom: 1em;margin-right: 1em\"><img decoding=\"async\" border=\"0\" data-original-height=\"2601\" data-original-width=\"8582\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgIU-6haqWEXnugbhG5is8t1TU0tN3EkfSc7GwvHMRsMSU14k-P7q4il_nJlGk-qNP_PG3aKs1LDWNgWKqhFsG6Q16v2zeoHMvqY_PesC5ddxHRjTGgtiQ33uvOrUIPkSdUgFfBIYSkqBhcuZJTY8jbW0mOjKs8XF8DLxfyD7CjJ1Sd4FM7AUrufTnSEVw\/s1600\/0625%20Building%20JetPacker%20with%20Intelligent%20On-Device%20features_Blog%20v02.png\" \/><\/a><\/div>\n<p><i><br \/><\/i><\/p>\n<div><i><br \/><\/i><\/p>\n<p>Welcome back to the blog post series &#8220;<a href=\"http:\/\/android-developers.googleblog.com\/2026\/07\/build-intelligent-android-apps-introduction-jetpack.html\" target=\"_blank\">Build intelligent Android apps<\/a>&#8221; where we take a basic Android app and transform it into a <b>personalized, intelligent, <\/b>and <b>agentic <\/b>experience. In our <a href=\"http:\/\/android-developers.googleblog.com\/2026\/07\/build-intelligent-android-apps-introduction-jetpack.html\" target=\"_blank\">previous post we introduced Jetpacker<\/a>, the demo app we&#8217;ll use throughout this series.<\/p>\n<p>In this blog post, we will share how you can use Gemini Nano through <a href=\"https:\/\/developers.google.com\/ml-kit\/genai\/prompt\/android\">ML Kit\u2019s Prompt API<\/a> to build intelligent on-device features.<\/p>\n<div style=\"height: 0px;margin: 0px auto;max-width: 853px;overflow: hidden;padding-bottom: 56.25%;position: relative\">\n<\/div>\n<p>Building intelligent on-device features refers to the ability to process prompts and data directly on a device without sending data to a server. This offers a few advantages:<\/p>\n<ul>\n<li>User data can be processed <b>locally<\/b> on the device, preserving user privacy<\/li>\n<li>Functionality of the model is <b>reliable<\/b> even with spotty or no internet connection<\/li>\n<li>No additional cloud inference <b>cost<\/b>, since everything runs on the user\u2019s hardware<\/li>\n<\/ul>\n<p>With the benefits of on-device in mind, we identified three features to add in Jetpacker that can improve the user experience: summarizing trip itineraries, managing expenses, and capturing voice notes.<\/p>\n<h2>\n<div class=\"separator\" style=\"clear: both;text-align: center\"><a href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEg3FDrGSpGJqSapXXQ7052s1NR8rzvmmW-xbyOaAcg8bdTA6ZH7p6ZWE664FjlaoDLfREd-RlQil7gV-VjnCoq76o06haLoSxBzlIDAvM-dKvm_TCgPvqHU3ZlzBTXZ9XtAyMk26QWB8PvU5aUmzO0RBuMxqxJdC1wk7xl_1PXd1KHvuMCeHeAP9zhgSjg\/s1848\/Screenshot%202026-07-02%20at%2012.57.08%E2%80%AFPM.png\" style=\"margin-left: 1em;margin-right: 1em\"><img loading=\"lazy\" decoding=\"async\" border=\"0\" data-original-height=\"1256\" data-original-width=\"1848\" height=\"434\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEg3FDrGSpGJqSapXXQ7052s1NR8rzvmmW-xbyOaAcg8bdTA6ZH7p6ZWE664FjlaoDLfREd-RlQil7gV-VjnCoq76o06haLoSxBzlIDAvM-dKvm_TCgPvqHU3ZlzBTXZ9XtAyMk26QWB8PvU5aUmzO0RBuMxqxJdC1wk7xl_1PXd1KHvuMCeHeAP9zhgSjg\/w640-h434\/Screenshot%202026-07-02%20at%2012.57.08%E2%80%AFPM.png\" width=\"640\" \/><\/a><\/div>\n<div style=\"text-align: center\"><span style=\"font-weight: normal\"><span style=\"font-size: small\"><i>On-device features in Jetpacker: Summarizing trip itineraries, managing expenses, and voice notes<\/i><\/span><\/span><\/div>\n<div class=\"separator\" style=\"clear: both;text-align: center\"><\/div>\n<p>High quality tailored summarization of short texts<\/h2>\n<p>The itinerary screen gives users a quick overview of all activities for a given trip. Since this screen contains a lot of information, it can quickly become overwhelming. To help users prepare without feeling overwhelmed, we can add a \u2018<b>Get ready for your trip<\/b>\u2019 section at the top.<\/p>\n<p style=\"text-align: center\"><em><\/em><\/p>\n<div class=\"separator\" style=\"clear: both;text-align: center\"><em><a href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgtWrJplvxl7ymB4kMN_Tg4tYYkL7G1Ory0hSptzqsbw_xCu4I9l_4SQPQ9CUXs_Jc7qtT1KcpltBds0aYgIvXiK_-qp6fnoX3QmYnGyqGgr2d5f2uzQkyMK-_Iebwp9Ap0aJA4c8Pz4Zy01O5AM6kk_qZ4Blx_bY-_2xIxSA8DMva2LWBbCN_Hb_c37KE\/s2499\/Screenshot_20260702_111934.png\" style=\"margin-left: 1em;margin-right: 1em\"><img loading=\"lazy\" decoding=\"async\" border=\"0\" data-original-height=\"2499\" data-original-width=\"1183\" height=\"400\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgtWrJplvxl7ymB4kMN_Tg4tYYkL7G1Ory0hSptzqsbw_xCu4I9l_4SQPQ9CUXs_Jc7qtT1KcpltBds0aYgIvXiK_-qp6fnoX3QmYnGyqGgr2d5f2uzQkyMK-_Iebwp9Ap0aJA4c8Pz4Zy01O5AM6kk_qZ4Blx_bY-_2xIxSA8DMva2LWBbCN_Hb_c37KE\/w189-h400\/Screenshot_20260702_111934.png\" width=\"189\" \/><\/a><\/em><\/div>\n<div style=\"text-align: center\"><span style=\"font-weight: normal\"><span style=\"font-size: small\"><i>The romantic Paris trip is summarized as a classic Parisian adventure blending art, sights, and delicious food. A tip and some useful phrases are also added.<\/i><\/span><\/span><\/div>\n<\/p>\n<p>By inputting a trip itinerary and asking an LLM to summarize it, we can generate a quick summary of the trip along with packing tips and useful local phrases. This is a great use case for an on-device model for several reasons:<\/p>\n<ul>\n<li><b>Performance and quality<\/b>: Both the input and output text are relatively short. With that, we can expect the performance and quality of an on-device solution to be on par with more powerful cloud models.<\/li>\n<li><b>Scalability<\/b>: Shifting inference on-device allows us to scale this feature from a few users to millions without worrying about managing increasing cloud inference costs.<\/li>\n<li><b>Low latency and reliability<\/b>: On-device inference guarantees low latency, providing a reliable experience even when users are offline.<\/li>\n<\/ul>\n<p>To build with on-device, we use <b>Gemini Nano<\/b>, Google\u2019s most efficient model optimized for mobile devices. Gemini Nano was first introduced a few years ago, and is now running on over 140 million devices. The latest version of the model, <a href=\"https:\/\/android-developers.googleblog.com\/2026\/04\/AI-Core-Developer-Preview.html\">Gemini Nano 4, is built on the architecture foundation of the recently released Gemma 4 model<\/a>, and is further optimized for maximum battery and performance efficiency.<\/p>\n<p>Using ML Kit\u2019s <b>Prompt API<\/b>, we can take advantage of Gemini Nano 4\u2019s new model capabilities to prototype our on-device features. We\u2019ll create a prompt that includes the itinerary of a trip and ask the model to generate a summary along with any preparation tips.<\/p>\n<pre><code>\/\/ implementation(\"com.google.mlkit:genai-prompt:1.0.0-beta3\") \n\n\/\/ Define the configuration for Gemini Nano 4 E2B preview model\nval previewFastConfig = generationConfig {\n    modelConfig = modelConfig {\n        releaseStage = ModelReleaseStage.PREVIEW\n        preference = ModelPreference.FAST\n    }\n}\n\nval geminiNano2BPreviewModel = Generation.getClient(previewFastConfig)\n\nval tripItinerary = ...\n\nval getReadyForYourTripSummary = geminiNano2BPreviewModel\n .generateContent(\"Given this trip itinerary: $tripItinerary, \n     generate the following: overall vibe, tips on how to prepare for this\n     trip, and common short phrases to learn for the trip.\")<\/code><\/pre>\n<p>Finding the optimal prompt usually requires some iteration, and the AICore app is perfect for this step in the process. After opting into the <a href=\"https:\/\/developers.google.com\/ml-kit\/genai\/aicore-dev-preview\">developer preview option for AICore<\/a>, we can download preview models such as Gemini Nano 4 to test prompts and see the model\u2019s expected outputs. With a few iterations on the prompt, we were able to improve the speed of the response from 13 seconds to under 2 seconds! Check out the final code implementation and prompt <a href=\"https:\/\/github.com\/android\/ai-samples\/blob\/40b999ef0e85693eac4de06e58335f0f5f125fa6\/jetpacker\/android\/feature\/trip\/itinerary\/enrichment\/src\/main\/kotlin\/com\/example\/jetpacker\/feature\/itinerary_enrichment\/TripSummaryAndTipsProviderImpl.kt#L100\" target=\"_blank\">here<\/a>.<\/p>\n<div class=\"separator\" style=\"clear: both;text-align: center\"><a href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEiaY2Q7rzlrAj2i410lc3qqtKwI3m6ufAi27R5S94LVFJKEJPnxmvShIcAWdD_Cx9lhTz9tmKW_DVcmNg0rZFBKpqYj0M9niFJwa-AurlyV2SHuErI7Z9H59Q9S936I4ErUQ_NFRNSJpUBXwDVmw6vKNVpIkBrYPJNUpCIyNXl5Z17x7jEl5Kn9BGgFuLg\/s553\/Screen%20Recording%202026-07-02%20at%2012.28.51%E2%80%AFPM.gif\" style=\"margin-left: 1em;margin-right: 1em\"><img loading=\"lazy\" decoding=\"async\" border=\"0\" data-original-height=\"553\" data-original-width=\"496\" height=\"400\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEiaY2Q7rzlrAj2i410lc3qqtKwI3m6ufAi27R5S94LVFJKEJPnxmvShIcAWdD_Cx9lhTz9tmKW_DVcmNg0rZFBKpqYj0M9niFJwa-AurlyV2SHuErI7Z9H59Q9S936I4ErUQ_NFRNSJpUBXwDVmw6vKNVpIkBrYPJNUpCIyNXl5Z17x7jEl5Kn9BGgFuLg\/w359-h400\/Screen%20Recording%202026-07-02%20at%2012.28.51%E2%80%AFPM.gif\" width=\"359\" \/><\/a><\/div>\n<div style=\"text-align: center\"><span style=\"font-weight: normal\"><span style=\"font-size: small\"><i>The first iteration of our prompt generated way too many tokens, and optimizing it helped keep responses quick and to the point.<\/i><\/span><\/span><\/div>\n<h2>Local processing for sensitive user input<\/h2>\n<p>Next, to help users enjoy their trip even more, we\u2019ll build a simple expense manager that takes the manual work out of sorting through receipts and calculating budgets.<\/p>\n<div class=\"separator\" style=\"clear: both;text-align: center\"><a href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgsHCjYJhDefKk1_FHnyB8mXO6XGrVWPrWkkxUikHNrWly2YqLjD8GyN-qGXOBlZCJPug-VbVgBr8awg8I-TEl6d9udKhq_zKem9Xcdb7FzFlA4B77Iko2Rbf8R0XIPB30owcMoh-7KJ1paQnzDrNHSdvwYotNxt166QqJdNAf1d8wEwIFkL9qIEYUKmoQ\/s1282\/7.13_BlogGif_Transparent.gif\" style=\"margin-left: 1em;margin-right: 1em\"><img loading=\"lazy\" decoding=\"async\" border=\"0\" data-original-height=\"1282\" data-original-width=\"613\" height=\"400\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgsHCjYJhDefKk1_FHnyB8mXO6XGrVWPrWkkxUikHNrWly2YqLjD8GyN-qGXOBlZCJPug-VbVgBr8awg8I-TEl6d9udKhq_zKem9Xcdb7FzFlA4B77Iko2Rbf8R0XIPB30owcMoh-7KJ1paQnzDrNHSdvwYotNxt166QqJdNAf1d8wEwIFkL9qIEYUKmoQ\/w191-h400\/7.13_BlogGif_Transparent.gif\" width=\"191\" \/><\/a><\/div>\n<p><\/p>\n<div style=\"text-align: center\"><span style=\"font-weight: normal\"><span style=\"font-size: small\"><i>Taking a photo of a restaurant bill, data is parsed and shown in the expense overview screen of the app.<\/i><\/span><\/span><\/div>\n<p>Since receipts might contain sensitive information like credit card number and addresses, this is another great use case for an on-device solution. With on-device, users can be confident that private information will be processed locally on the device without any of their data being sent to the cloud.<\/p>\n<p>In addition, Gemini Nano 4 has improved model capabilities for multimodality, especially for image understanding tasks like OCR and visual data extraction, making it a great solution for tasks like extracting information from receipts.<\/p>\n<p>For this use case, the prompt will analyze an image of the receipt, and output information such as: a generated title, amount spent and category of the expense. To ensure the model outputs the information in the preferred format, we can use <a href=\"https:\/\/developers.google.com\/ml-kit\/genai\/prompt\/android\/structured-output\">ML Kit\u2019s Structured Output API<\/a> to seamlessly output a Kotlin data object that we define.<\/p>\n<pre><code>\/\/ implementation(\"com.google.mlkit:genai-prompt:1.0.0-beta3\")\n\/\/ ksp(\"com.google.mlkit:genai-schema-compiler:1.0.0-alpha1\")\n\n@Generable(\"Information extracted from an expense receipt\")\ndata class ParsedReceipt(\n  @Guide(\"Generated title for the expense less than 6 words. Based on restaurant or activity name.\")\n  val title: String,\n  @Guide(\"Total amount of the expense. Look for values at the bottom and words like total or balance due.\")\n  val amount: Double,\n  @Guide(\"Type of expense\", enumValues = [\"travel\", \"food\", \"shopping\", \"entertainment\", \"other\"])\n  val category: String,\n)\n\nval prompt = \"Determine if the image is a receipt or expense. \n    If it is NOT a receipt or expense, output the text 'NOT_A_RECEIPT'.\n    Otherwise, parse the receipt information.\"\n\nval request = generateContentRequest(ImagePart(bitmap), TextPart(prompt)) {}\nval requestWithStructuredOutput = generateTypedContentRequest(request, ParsedReceipt::class)\n\n\/\/ Define the configuration for Gemini Nano 4 E4B preview model  \n\/\/ When selecting models, you can specify which performance charactertists are most important\n\/\/  for your use case. Use ModelPreference.FULL when you want to prioritize reasoning power over speed. \n\/\/  Use ModelPreference.FAST when complex logic is not required and latency is a priority.\nval previewFullConfig = generationConfig {\n    modelConfig = modelConfig {\n        releaseStage = ModelReleaseStage.PREVIEW\n        preference = ModelPreference.FULL\n    }\n}\n\nval geminiNano4BPreviewModel = Generation.getClient(previewFullConfig)\nval response = geminiNano4BPreviewModel.generateContent(requestWithStructuredOutput)\nval parsedReceipt: ParsedReceipt? = response.candidates.firstOrNull()?.response<\/code><\/pre>\n<h2>Multimodal input<\/h2>\n<p>Lastly, to help users record audio memos during the trip, let\u2019s build a fully on-device voice notes feature. Using <a href=\"https:\/\/developers.google.com\/ml-kit\/genai\/speech-recognition\/android\">ML Kit\u2019s Speech Recognition API<\/a>, we\u2019ll enable users to record short voice notes that are automatically transcribed to text. With the transcribed text, we\u2019ll use ML Kit\u2019s Prompt API to identify which trip activity is associated with the recorded voice note, letting users easily recap their trip as they scroll through the trip\u2019s itinerary.<\/p>\n<div class=\"separator\" style=\"clear: both;text-align: center\"><a href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEjnAm4XPVEJkfPmRFKJWh2sS-4rVz_eFollYxU5DWb7kAkSQdP4xhAEosziS_vpxv6yoAkvHiSp6SGYOp2_qp_cJWgfbJGnDOadaMP6Bc30a6rYnSP34sEubNAWXqsmd3cpYOoL8rCUhQn0_4GT3165aSFinlnHZjVnXYNYBAw8AdVtJpuRG2gDbi-uRII\/s2499\/Screenshot_20260702_115529.png\" style=\"margin-left: 1em;margin-right: 1em\"><img loading=\"lazy\" decoding=\"async\" border=\"0\" data-original-height=\"2499\" data-original-width=\"1183\" height=\"400\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEjnAm4XPVEJkfPmRFKJWh2sS-4rVz_eFollYxU5DWb7kAkSQdP4xhAEosziS_vpxv6yoAkvHiSp6SGYOp2_qp_cJWgfbJGnDOadaMP6Bc30a6rYnSP34sEubNAWXqsmd3cpYOoL8rCUhQn0_4GT3165aSFinlnHZjVnXYNYBAw8AdVtJpuRG2gDbi-uRII\/w189-h400\/Screenshot_20260702_115529.png\" width=\"189\" \/><\/a><\/div>\n<p style=\"text-align: center\"><em>The Roman holiday itinerary shows voice note extracts.<\/em><\/p>\n<p>The <a href=\"https:\/\/developers.google.com\/ml-kit\/genai\/speech-recognition\/android\">ML Kit GenAI Speech Recognition API <\/a>allows you to transcribe audio content to text fully on-device using two distinct modes. <b>Basic mode<\/b> uses a traditional on-device speech recognition model and is available on most Android devices with API level 31 and higher. <b>Advanced mode<\/b> uses Gemini Nano to offer broader language coverage and better quality, and is currently supported on Pixel 10 devices.<\/p>\n<p>For our feature we combine the Speech Recognition API with the ML Kit GenAI Prompt API:<\/p>\n<pre><code>\/\/ implementation(\"com.google.mlkit:genai-prompt:1.0.0-beta3\")\n\/\/ implementation(\"com.google.mlkit:genai-speech-recognition:1.0.0-alpha1\")\n\nval tripEvents = ... \n\n\/\/ Set up speech recognition\nval speechRecognizerOptions =\n    speechRecognizerOptions {\n        locale = Locale.US\n        preferredMode = SpeechRecognizerOptions.Mode.MODE_ADVANCED\n    }\nval speechRecognizer: SpeechRecognizer = SpeechRecognition.getClient(speechRecognizerOptions)\n\nsuspend fun transcribeVoiceNote(recognizer: SpeechRecognizer) {\n    \/\/ Display partial text as the user is recording audio\n    var partialTextResponse = \"\"\n\n    \/\/ Display the full text once user is finished recording audio\n    var transcription = \"\"\n\n    val request: SpeechRecognizerRequest\n        = speechRecognizerRequest { audioSource = AudioSource.fromMic() }\n    recognizer.startRecognition(request).collect { response -&gt;\n        when (response) {\n            is SpeechRecognizerResponse.PartialTextResponse -&gt; {\n                partialTextResponse = response.text\n            }\n            is SpeechRecognizerResponse.FinalTextResponse -&gt; {\n                transcription = response.text\n                processAndCategorizeVoiceNote(transcription, tripEvents)\n            }\n        }\n    }\n}\n\nfun processAndCategorizeVoiceNote(transcribedVoiceNote: String, events: List) {\n    val prompt = \"Given the voice note $transcribedVoiceNote\n     and the following events for this trip: $events, rewrite this transcription\n     to remove filler words. Then, identify which events from the\n     list this rewritten transcription matches to.\"\n\n     \/\/ Utilize ML Kit's Prompt API to process voice note and tag it with the relevant trip activities\n     Generation.getClient().generateContent(prompt)\n}<\/code><\/pre>\n<h2>Conclusion<\/h2>\n<p>Using ML Kit\u2019s GenAI APIs, we were able to take advantage of Gemini Nano to develop fully on-device intelligent features for the JetPacker app, and provide an improved user experience without any additional cloud costs.<\/p>\n<p>Check out the full source code for <a href=\"https:\/\/github.com\/android\/ai-samples\/tree\/main\/jetpacker\" target=\"_blank\">Jetpacker on Github<\/a>, and watch the video <a href=\"https:\/\/www.youtube.com\/watch?v=_iuXykdlTkk\">Build Intelligent Android apps with Google\u2019s AI<\/a> to learn more about how to integrate intelligent features directly into your app using on-device models, cloud-powered reasoning, and the latest agentic frameworks.<\/p>\n<h2>Learn more<\/h2>\n<p>Check out the other parts of this blog post series:<\/p>\n<p><a href=\"http:\/\/android-developers.googleblog.com\/2026\/07\/build-intelligent-android-apps-introduction-jetpack.html\"><b>Part 1:<\/b><\/a> Introduction of the app and a high-level overview.<br \/><a href=\"http:\/\/android-developers.googleblog.com\/2026\/07\/android-on-device-inference.html\"><b>Part 2 (this post!):<\/b><\/a>&nbsp;On-device intelligence. Deep-dive into ML Kit\u2019s GenAI APIs and Gemini Nano to build privacy-first features like itinerary summarization, receipt parsing, and local audio processing.<br \/><a href=\"http:\/\/android-developers.googleblog.com\/2026\/07\/build-intelligent-android-apps-cloud-hybrid-inference.html\"><b>Part 3:<\/b> <\/a>Hybrid and cloud reasoning. Explore how to use Firebase AI Logic to ground LLM answers in real-world data like Google Maps and web context.<br \/><a href=\"http:\/\/android-developers.googleblog.com\/2026\/07\/build-intelligent-android-apps-appfunctions.html\"><b>Part 4:<\/b><\/a> System integration. Integrating with the Android intelligence system using AppFunctions.<br \/>Part 5 (coming soon): In-app agentic workflows. Extend the app with an end-to-end booking assistant powered by A2UI and ADK.<\/p>\n<p>Interested in more on Android Development? Follow Android Developers on <a href=\"https:\/\/www.youtube.com\/@AndroidDevelopers\">YouTube<\/a> or <a href=\"https:\/\/www.linkedin.com\/showcase\/androiddev\/\">LinkedIn<\/a>!<\/p>\n<p>All code snippets in this blog post follow the following copyright notice:\n<\/p>\n<pre><code>Copyright 2026 Google LLC.\nSPDX-License-Identifier: Apache-2.0<\/code><\/pre>\n<\/p>\n<\/div>\n<\/div>\n<p class=\"inmi-source\">Source: <a href=\"http:\/\/android-developers.googleblog.com\/2026\/07\/android-on-device-inference.html\" target=\"_blank\" rel=\"noopener nofollow\">Tech \u2013 Android \u2013 Android Developers Blog<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Posted by Caren Chang, Developer Relations Engineer, Android Developer RelationsWelcome back to the blog post series &#8220;Build intelligent Android apps&#8221; where we take a basic Android app and transform it into a personalized, intelligent, and agentic experience. In our previous\u2026<\/p>\n","protected":false},"author":1,"featured_media":15220303,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[281],"tags":[],"class_list":["post-15220301","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-android"],"featured_image_urls":{"full":["https:\/\/www.inthacity.com\/news\/wp-content\/uploads\/2026\/07\/15220301-0625-building-jetpacker-with-intelligent-on-device-features_meta-v02.png",72,72,false],"thumbnail":["https:\/\/www.inthacity.com\/news\/wp-content\/uploads\/2026\/07\/15220301-0625-building-jetpacker-with-intelligent-on-device-features_meta-v02.png",72,72,false],"medium":["https:\/\/www.inthacity.com\/news\/wp-content\/uploads\/2026\/07\/15220301-0625-building-jetpacker-with-intelligent-on-device-features_meta-v02.png",72,72,false],"medium_large":["https:\/\/www.inthacity.com\/news\/wp-content\/uploads\/2026\/07\/15220301-0625-building-jetpacker-with-intelligent-on-device-features_meta-v02.png",72,72,false],"large":["https:\/\/www.inthacity.com\/news\/wp-content\/uploads\/2026\/07\/15220301-0625-building-jetpacker-with-intelligent-on-device-features_meta-v02.png",72,72,false],"1536x1536":["https:\/\/www.inthacity.com\/news\/wp-content\/uploads\/2026\/07\/15220301-0625-building-jetpacker-with-intelligent-on-device-features_meta-v02.png",72,72,false],"2048x2048":["https:\/\/www.inthacity.com\/news\/wp-content\/uploads\/2026\/07\/15220301-0625-building-jetpacker-with-intelligent-on-device-features_meta-v02.png",72,72,false],"post-thumbnail":["https:\/\/www.inthacity.com\/news\/wp-content\/uploads\/2026\/07\/15220301-0625-building-jetpacker-with-intelligent-on-device-features_meta-v02.png",72,72,false],"ignition_item":["https:\/\/www.inthacity.com\/news\/wp-content\/uploads\/2026\/07\/15220301-0625-building-jetpacker-with-intelligent-on-device-features_meta-v02.png",72,72,false],"ignition_item_lg":["https:\/\/www.inthacity.com\/news\/wp-content\/uploads\/2026\/07\/15220301-0625-building-jetpacker-with-intelligent-on-device-features_meta-v02.png",72,72,false],"ignition_article_media":["https:\/\/www.inthacity.com\/news\/wp-content\/uploads\/2026\/07\/15220301-0625-building-jetpacker-with-intelligent-on-device-features_meta-v02.png",72,72,false],"ignition_minicart_item":["https:\/\/www.inthacity.com\/news\/wp-content\/uploads\/2026\/07\/15220301-0625-building-jetpacker-with-intelligent-on-device-features_meta-v02.png",72,72,false],"profile_24":["https:\/\/www.inthacity.com\/news\/wp-content\/uploads\/2026\/07\/15220301-0625-building-jetpacker-with-intelligent-on-device-features_meta-v02-24x24.png",24,24,true],"profile_48":["https:\/\/www.inthacity.com\/news\/wp-content\/uploads\/2026\/07\/15220301-0625-building-jetpacker-with-intelligent-on-device-features_meta-v02-48x48.png",48,48,true],"profile_96":["https:\/\/www.inthacity.com\/news\/wp-content\/uploads\/2026\/07\/15220301-0625-building-jetpacker-with-intelligent-on-device-features_meta-v02.png",72,72,false],"profile_150":["https:\/\/www.inthacity.com\/news\/wp-content\/uploads\/2026\/07\/15220301-0625-building-jetpacker-with-intelligent-on-device-features_meta-v02.png",72,72,false],"profile_300":["https:\/\/www.inthacity.com\/news\/wp-content\/uploads\/2026\/07\/15220301-0625-building-jetpacker-with-intelligent-on-device-features_meta-v02.png",72,72,false]},"author_info":{"display_name":"news.iNthacity","author_link":"https:\/\/www.inthacity.com\/news\/author\/atombo\/"},"category_info":"<a href=\"https:\/\/www.inthacity.com\/news\/articles\/tech\/android\/\" rel=\"category tag\">Android<\/a>","tag_info":"Android","comment_count":"0","_links":{"self":[{"href":"https:\/\/www.inthacity.com\/news\/wp-json\/wp\/v2\/posts\/15220301","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.inthacity.com\/news\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.inthacity.com\/news\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.inthacity.com\/news\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.inthacity.com\/news\/wp-json\/wp\/v2\/comments?post=15220301"}],"version-history":[{"count":1,"href":"https:\/\/www.inthacity.com\/news\/wp-json\/wp\/v2\/posts\/15220301\/revisions"}],"predecessor-version":[{"id":15220302,"href":"https:\/\/www.inthacity.com\/news\/wp-json\/wp\/v2\/posts\/15220301\/revisions\/15220302"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.inthacity.com\/news\/wp-json\/wp\/v2\/media\/15220303"}],"wp:attachment":[{"href":"https:\/\/www.inthacity.com\/news\/wp-json\/wp\/v2\/media?parent=15220301"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.inthacity.com\/news\/wp-json\/wp\/v2\/categories?post=15220301"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.inthacity.com\/news\/wp-json\/wp\/v2\/tags?post=15220301"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}