56,966 blogs · [ { "id": "01a07df3-6d92-73be-b5d4-c10f3104082f", "title": "Compose & kotlinx.html", "url": "https://jakewharton.com/compose-and-kotlinx-html/", "published_at": "2026-08-26T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f310df63f", "title": "Live coding with dir stepper", "url": "https://jakewharton.com/live-coding-with-dir-stepper/", "published_at": "2026-07-16T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f3203497f", "title": "The lysine contingency", "url": "https://jakewharton.com/the-lysine-contingency/", "published_at": "2026-06-17T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f33016f88", "title": "An update on Android KTX", "url": "https://jakewharton.com/an-update-on-android-ktx/", "published_at": "2026-04-01T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f337eeb27", "title": "Let's defuse the Compose BOM", "url": "https://jakewharton.com/defuse-the-compose-bom/", "published_at": "2025-12-03T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f33b5b96c", "title": "You should use AndroidX betas", "url": "https://jakewharton.com/you-should-use-androidx-betas/", "published_at": "2025-11-19T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f34381475", "title": "Custom short-link redirector", "url": "https://jakewharton.com/custom-short-link-redirector/", "published_at": "2025-10-14T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f34bd1ff6", "title": "Fan-in to a single required GitHub Action", "url": "https://jakewharton.com/fan-in-to-a-single-required-github-action/", "published_at": "2025-05-07T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f34d1d2b2", "title": "Compile-time validation of JNI signatures", "url": "https://jakewharton.com/compile-time-validation-of-jni-signatures/", "published_at": "2025-03-12T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f35cefe5f", "title": "Deprecating idling resource libraries", "url": "https://jakewharton.com/deprecating-idling-resource-libraries/", "published_at": "2025-02-19T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f36437052", "title": "Using Renovate to update build JDK", "url": "https://jakewharton.com/using-renovate-to-update-build-jdk/", "published_at": "2025-01-08T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f364ceb57", "title": "Nonsensical Maven is still a Gradle problem", "url": "https://jakewharton.com/nonsensical-maven-is-still-a-gradle-problem/", "published_at": "2024-03-28T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f37060481", "title": "Gradle toolchains are rarely a good idea", "url": "https://jakewharton.com/gradle-toolchains-are-rarely-a-good-idea/", "published_at": "2024-03-21T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f3737c326", "title": "Kotlin's JDK release compatibility flag", "url": "https://jakewharton.com/kotlins-jdk-release-compatibility-flag/", "published_at": "2024-03-13T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f37a30428", "title": "Perils of duplicate finding", "url": "https://jakewharton.com/perils-of-duplicate-finding/", "published_at": "2024-02-14T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f3868f488", "title": "Intermediate collection avoidance", "url": "https://jakewharton.com/intermediate-collection-avoidance/", "published_at": "2024-02-07T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f38ff32ad", "title": "A stable, multiplatform Molecule 1.0", "url": "https://code.cash.app/molecule-1-0", "published_at": "2023-07-19T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f3921023c", "title": "Native UI and multiplatform Compose with Redwood", "url": "https://code.cash.app/native-ui-and-multiplatform-compose-with-redwood", "published_at": "2023-07-05T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f3991a440", "title": "Flow testing with Turbine", "url": "https://code.cash.app/flow-testing-with-turbine", "published_at": "2023-06-21T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f39cf30b2", "title": "Using jlink to cross-compile minimal JREs", "url": "https://jakewharton.com/using-jlink-to-cross-compile-minimal-jres/", "published_at": "2023-01-16T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f3a232dcc", "title": "Report card: Java 19 and the end of Kotlin", "url": "https://jakewharton.com/report-card-java-19-and-the-end-of-kotlin/", "published_at": "2022-09-20T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f3ad62424", "title": "Build on latest Java, test through lowest Java", "url": "https://jakewharton.com/build-on-latest-java-test-through-lowest-java/", "published_at": "2022-05-17T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f3b5eeb15", "title": "Slope-intercept library design", "url": "https://jakewharton.com/slope-intercept-library-design/", "published_at": "2022-04-05T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f3c318af9", "title": "The state of managing state (with Compose)", "url": "https://code.cash.app/the-state-of-managing-state-with-compose", "published_at": "2021-11-11T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f3ccc0378", "title": "Multiplatform Compose and Gradle module metadata abuse", "url": "https://jakewharton.com/multiplatform-compose-and-gradle-module-metadata-abuse/", "published_at": "2021-11-04T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f3dc298c3", "title": "Gradle dependency license validation", "url": "https://code.cash.app/gradle-dependency-license-validation", "published_at": "2021-06-08T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f3df5c8e2", "title": "Case-insensitive filesystems considered harmful (to me)", "url": "https://jakewharton.com/case-insensitive-filesystems-considered-harmful-to-me/", "published_at": "2021-06-04T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f3ed2feca", "title": "Cross-compiling static Rust binaries in Docker for Raspberry Pi", "url": "https://jakewharton.com/cross-compiling-static-rust-binaries-in-docker-for-raspberry-pi/", "published_at": "2021-05-27T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f3ef21472", "title": "Migrating from Burst to TestParameterInjector", "url": "https://code.cash.app/migrating-from-burst-to-testparameterinjector", "published_at": "2021-04-15T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f3f1f7eb5", "title": "Integration verbosity and good layering", "url": "https://jakewharton.com/integration-verbosity-and-good-layering/", "published_at": "2021-04-07T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f3f752ae9", "title": "AssistedInject is dead, long live AssistedInject!", "url": "https://code.cash.app/assisted-inject-is-dead-long-live-assisted-inject", "published_at": "2021-03-31T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f4014c9eb", "title": "A Jetpack Compose by any other name", "url": "https://jakewharton.com/a-jetpack-compose-by-any-other-name/", "published_at": "2020-12-30T00:00:00+00:00" }, { "id": "01a07df3-6d92-73be-b5d4-c10f409f301f", "title": "Treating Dockerfiles as shell scripts", "url": "https://jakewharton.com/treating-dockerfiles-as-shell-scripts/", "published_at": "2020-12-03T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec71ae4d96", "title": "Peeking at command-line ANSI escape sequences", "url": "https://jakewharton.com/peeking-at-colorful-command-line-output/", "published_at": "2020-10-28T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec71ba2843", "title": "Smaller APKs with resource optimization", "url": "https://jakewharton.com/smaller-apks-with-resource-optimization/", "published_at": "2020-09-01T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec72828de4", "title": "Shrinking a Kotlin binary by 99.2%", "url": "https://jakewharton.com/shrinking-a-kotlin-binary/", "published_at": "2020-08-24T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec72b33bb9", "title": "Wire Support For Swift, Part 1", "url": "https://code.cash.app/wire-support-for-swift-part-1", "published_at": "2020-08-19T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec732a8929", "title": "Sixteen corners", "url": "https://jakewharton.com/sixteen-corners/", "published_at": "2020-08-06T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec737a2843", "title": "R8 Optimization: Lambda Groups", "url": "https://jakewharton.com/r8-optimization-lambda-groups/", "published_at": "2020-04-30T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec746a2eb8", "title": "Which is better on Android: divide by 2 or shift by 1?", "url": "https://jakewharton.com/which-is-better-on-android-divide-by-two-or-shift-by-one/", "published_at": "2020-04-23T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec752156c1", "title": "Simple Multiplatform RPC with Kotlin Serialization", "url": "https://jakewharton.com/simple-multiplatform-rpc-with-kotlin-serialization/", "published_at": "2020-04-15T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec752b25a8", "title": "Litmus-Testing Kotlin's Many Memory Models", "url": "https://jakewharton.com/litmus-testing-kotlins-many-memory-models/", "published_at": "2020-04-08T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec75496e39", "title": "D8 Optimization: Assertions", "url": "https://jakewharton.com/d8-optimization-assertions/", "published_at": "2020-03-25T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec75de0e45", "title": "Removing Google as a Single Point of Failure Part 2: Gmail", "url": "https://jakewharton.com/removing-google-as-a-single-point-of-failure-gmail/", "published_at": "2020-03-18T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec76d05535", "title": "Removing Google as a Single Point of Failure", "url": "https://jakewharton.com/removing-google-as-a-single-point-of-failure/", "published_at": "2020-02-19T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec778f26c7", "title": "Extracting 100% of Data From a Stubborn, Dying ZFS Pool", "url": "https://jakewharton.com/extracting-100-percent-of-data-from-a-stubborn-dying-zfs-zpool/", "published_at": "2020-02-12T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec77ef4e9d", "title": "D8 Library Desugaring", "url": "https://jakewharton.com/d8-library-desugaring/", "published_at": "2019-12-18T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec78876e3f", "title": "Public API challenges in Kotlin", "url": "https://jakewharton.com/public-api-challenges-in-kotlin/", "published_at": "2019-11-21T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec79525004", "title": "D8 Optimizations", "url": "https://jakewharton.com/d8-optimizations/", "published_at": "2019-10-30T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec799eeed8", "title": "R8 Optimization: Enum Switch Maps", "url": "https://jakewharton.com/r8-optimization-enum-switch-maps/", "published_at": "2019-10-16T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec79e6a19f", "title": "R8 Optimization: Enum Ordinals and Names", "url": "https://jakewharton.com/r8-optimization-enum-ordinals-and-names/", "published_at": "2019-10-09T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec7a6c15b4", "title": "R8 Optimization: Class Reflection and Forced Inlining", "url": "https://jakewharton.com/r8-optimization-class-reflection-and-forced-inlining/", "published_at": "2019-09-25T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec7b45ec9a", "title": "Calculating the true impact of zip file entries", "url": "https://jakewharton.com/calculating-zip-file-entry-true-impact/", "published_at": "2019-09-20T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec7c2c337e", "title": "Exceptions and proxies and coroutines, oh my!", "url": "https://jakewharton.com/exceptions-and-proxies-and-coroutines-oh-my/", "published_at": "2019-07-31T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec7cf33fe5", "title": "R8 Optimization: Method Outlining", "url": "https://jakewharton.com/r8-optimization-method-outlining/", "published_at": "2019-04-11T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec7d3e52b5", "title": "Optimizing Bytecode by Manipulating Source Code", "url": "https://jakewharton.com/optimizing-bytecode-by-manipulating-source-code/", "published_at": "2019-04-02T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec7df98c5a", "title": "The Economics of Generated Code", "url": "https://jakewharton.com/the-economics-of-generated-code/", "published_at": "2019-03-26T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec7ed03ca4", "title": "R8 Optimization: Class Constant Operations", "url": "https://jakewharton.com/r8-optimization-class-constant-operations/", "published_at": "2019-02-27T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec7f6d70ba", "title": "R8 Optimization: String Constant Operations", "url": "https://jakewharton.com/r8-optimization-string-constant-operations/", "published_at": "2019-02-12T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec7f72aa25", "title": "R8 Optimization: Value Assumption", "url": "https://jakewharton.com/r8-optimization-value-assumption/", "published_at": "2019-01-22T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec806d4e30", "title": "R8 Optimization: Null Data Flow Analysis (Part 2)", "url": "https://jakewharton.com/r8-optimization-null-data-flow-analysis-part-2/", "published_at": "2019-01-15T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec80ee8206", "title": "Inline Classes Make Great Database IDs", "url": "https://jakewharton.com/inline-classes-make-great-database-ids/", "published_at": "2019-01-10T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec810698b2", "title": "R8 Optimization: Null Data Flow Analysis (Part 1)", "url": "https://jakewharton.com/r8-optimization-null-data-flow-analysis-part-1/", "published_at": "2018-12-18T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec815aa3a4", "title": "R8 Optimization: Staticization", "url": "https://jakewharton.com/r8-optimization-staticization/", "published_at": "2018-12-11T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec81d6d0a5", "title": "Avoiding Vendor- and Version-Specific VM Bugs", "url": "https://jakewharton.com/avoiding-vendor-and-version-specific-vm-bugs/", "published_at": "2018-12-04T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec8236b6dd", "title": "Android's Java 9, 10, 11, and 12 Support", "url": "https://jakewharton.com/androids-java-9-10-11-and-12-support/", "published_at": "2018-11-27T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec824e8327", "title": "Android's Java 8 Support", "url": "https://jakewharton.com/androids-java-8-support/", "published_at": "2018-11-20T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec82e762e1", "title": "Increased accuracy of aapt2 \"keep\" rules", "url": "https://jakewharton.com/increased-accuracy-of-aapt2-keep-rules/", "published_at": "2018-08-07T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec8376b520", "title": "Tracing Gradle task execution", "url": "https://jakewharton.com/tracing-gradle-task-execution/", "published_at": "2018-08-01T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec83def1f2", "title": "Introducing Android KTX: Even Sweeter Kotlin Development for Android", "url": "https://android-developers.googleblog.com/2018/02/introducing-android-ktx-even-sweeter.html", "published_at": "2018-02-05T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec865bbc21", "title": "Forcing bytes downward in Okio", "url": "https://jakewharton.com/forcing-bytes-downward-in-okio/", "published_at": "2016-09-06T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec86b77119", "title": "Just Say mNo to Hungarian Notation", "url": "https://jakewharton.com/just-say-no-to-hungarian-notation/", "published_at": "2016-01-21T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec878f6f82", "title": "Java Interoperability Policy for Major Version Updates", "url": "https://jakewharton.com/java-interoperability-policy-for-major-version-updates/", "published_at": "2015-12-11T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec882df03f", "title": "The Conference Speaker Investment", "url": "https://jakewharton.com/the-conference-speaker-investment/", "published_at": "2014-11-20T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec89183dc7", "title": "Coercing Picasso To Play With Palette", "url": "https://jakewharton.com/coercing-picasso-to-play-with-palette/", "published_at": "2014-10-24T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec893c1085", "title": "Play Services 5.0 Is A Monolith Abomination", "url": "https://jakewharton.com/play-services-is-a-monolith/", "published_at": "2014-07-03T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec89c181e2", "title": "Android Needs A Simulator, Not An Emulator", "url": "https://jakewharton.com/android-needs-a-simulator/", "published_at": "2014-06-16T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec8e034eaf", "title": "Deprecated From Inception", "url": "https://jakewharton.com/deprecated-from-inception/", "published_at": "2012-10-01T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec8ed83b09", "title": "The Android Build System Is Broken", "url": "https://jakewharton.com/the-android-build-system-is-broken/", "published_at": "2012-07-22T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec9006d8dc", "title": "Announcing ActionBarSherlock Version 4.0", "url": "https://jakewharton.com/actionbarsherlock-four-point-oh/", "published_at": "2012-03-07T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec90f4440a", "title": "Advanced Pre-Honeycomb Animation with NineOldAndroids", "url": "https://jakewharton.com/advanced-pre-honeycomb-animation/", "published_at": "2012-01-18T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec9165b18a", "title": "Something Beta This Way Comes!", "url": "https://jakewharton.com/something-beta-this-way-comes/", "published_at": "2012-01-02T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec91baa88c", "title": "ActionBarSherlock - A Love Story (Part 3)", "url": "https://jakewharton.com/actionbarsherlock-a-love-story-part-3/", "published_at": "2012-01-01T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec91e802f8", "title": "ActionBarSherlock - A Love Story (Part 2)", "url": "https://jakewharton.com/actionbarsherlock-a-love-story-part-2/", "published_at": "2011-12-19T00:00:00+00:00" }, { "id": "01a07df3-6d93-72a4-b8ee-35ec92df4b6a", "title": "ActionBarSherlock - A Love Story (Part 1)", "url": "https://jakewharton.com/actionbarsherlock-a-love-story-part-1/", "published_at": "2011-12-01T00:00:00+00:00" } ] posts Claim your blog
Back to Jake Wharton
Blog · corpus.blog/blogs/jakewharton.com/posts

Jake Wharton

jakewharton.com

2026

2025

2024

2023

2022

2021

2020

2019

2018

2016

2015

2014

2012

2011