[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-7507":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":19,"compositeScore":20,"rankGlobal":10,"rankLanguage":10,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":22,"hasPages":22,"topics":24,"createdAt":10,"pushedAt":10,"updatedAt":25,"readmeContent":26,"aiSummary":27,"trendingCount":16,"starSnapshotCount":16,"syncStatus":28,"lastSyncTime":29,"discoverSource":30},7507,"diffuse","JakeWharton\u002Fdiffuse","JakeWharton","Diffuse is a tool for diffing APKs, AABs, AARs, and JARs","",null,"Kotlin",2182,118,35,17,0,1,6,3,61.33,"Apache License 2.0",false,"trunk",[],"2026-06-12 04:00:34","# Diffuse\n\nDiffuse is a tool for diffing APKs, AABs, AARs, and JARs in a way that aims to provide both a\nhigh-level view of what changes along with important detailed output.\n\nIt is meant to be used on small changes, such as those that occur in a single PR or git SHA. Here\nis an example of updating the [Dagger](https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fdagger\u002F) library in the\n[SDK Search](https:\u002F\u002Fgithub.com\u002FJakeWharton\u002FSdkSearch\u002F) app:\n\n```\n$ diffuse diff sdk-search-release-1.apk sdk-search-release-2.apk\n\nOLD: sdk-search-release-1.apk (signature: V2)\nNEW: sdk-search-release-2.apk (signature: V2)\n\n\n          │          compressed           │          uncompressed\n          ├───────────┬───────────┬───────┼───────────┬───────────┬────────\n APK      │ old       │ new       │ diff  │ old       │ new       │ diff\n──────────┼───────────┼───────────┼───────┼───────────┼───────────┼────────\n      dex │ 664.8 KiB │ 664.8 KiB │ -25 B │   1.5 MiB │   1.5 MiB │ -112 B\n     arsc │ 201.7 KiB │ 201.7 KiB │   0 B │ 201.6 KiB │ 201.6 KiB │    0 B\n manifest │   1.4 KiB │   1.4 KiB │   0 B │   4.2 KiB │   4.2 KiB │    0 B\n      res │ 418.2 KiB │ 418.2 KiB │ -14 B │ 488.3 KiB │ 488.3 KiB │    0 B\n    asset │       0 B │       0 B │   0 B │       0 B │       0 B │    0 B\n    other │  37.1 KiB │  37.1 KiB │   0 B │  36.3 KiB │  36.3 KiB │    0 B\n──────────┼───────────┼───────────┼───────┼───────────┼───────────┼────────\n    total │   1.3 MiB │   1.3 MiB │ -39 B │   2.2 MiB │   2.2 MiB │ -112 B\n\n\n DEX     │ old   │ new   │ diff\n─────────┼───────┼───────┼────────────\n   count │     1 │     1 │  0\n strings │ 14220 │ 14218 │ -2 (+6 -8)\n   types │  2258 │  2257 │ -1 (+0 -1)\n classes │  1580 │  1579 │ -1 (+0 -1)\n methods │ 11640 │ 11641 │ +1 (+6 -5)\n  fields │  4369 │  4369 │  0 (+0 -0)\n\n\n ARSC    │ old  │ new  │ diff\n─────────┼──────┼──────┼──────\n configs │   51 │   51 │  0\n entries │ 1950 │ 1950 │  0\n\n\n=================\n====   APK   ====\n=================\n\n    compressed     │   uncompressed   │\n───────────┬───────┼─────────┬────────┤\n size      │ diff  │ size    │ diff   │ path\n───────────┼───────┼─────────┼────────┼───────────────────────────────────────────────────────────\n 664.8 KiB │ -25 B │ 1.5 MiB │ -112 B │ ∆ classes.dex\n     458 B │ -14 B │   272 B │    0 B │ ∆ res\u002Fdrawable-hdpi-v4\u002Fabc_ab_share_pack_mtrl_alpha.9.png\n───────────┼───────┼─────────┼────────┼───────────────────────────────────────────────────────────\n 665.2 KiB │ -39 B │ 1.5 MiB │ -112 B │ (total)\n\n\n\n=================\n====   DEX   ====\n=================\n\nSTRINGS:\n\n   old   │ new   │ diff\n  ───────┼───────┼────────────\n   14220 │ 14218 │ -2 (+6 -8)\n\n  + %s does not implement %s\n  + %s.androidInjector() returned null\n  + androidInjector\n  + b1b69b7d0f149276095d82b6e0b884f82ac4d3f4\n  + getAndroidInjector\n  + ~~R8{\"compilation-mode\":\"release\",\"min-api\":24,\"pg-map-id\":\"5362c3b\",\"version\":\"1.5.59\"}\n\n  - %s does not implement %s or %s\n  - %s.activityInjector() returned null\n  - 0e95da1111e6daf6172ec76c544c88764db28334\n  - HasActivityInjector.java\n  - Ldagger\u002Fandroid\u002FHasActivityInjector;\n  - activityInjector\n  - getActivityInjector\n  - ~~R8{\"compilation-mode\":\"release\",\"min-api\":24,\"pg-map-id\":\"3041c7f\",\"version\":\"1.5.59\"}\n\n\nTYPES:\n\n   old  │ new  │ diff\n  ──────┼──────┼────────────\n   2258 │ 2257 │ -1 (+0 -1)\n\n  - Ldagger\u002Fandroid\u002FHasActivityInjector;\n\n\nMETHODS:\n\n   old   │ new   │ diff\n  ───────┼───────┼────────────\n   11640 │ 11641 │ +1 (+6 -5)\n\n  + com.jakewharton.sdksearch.AppComponent getAndroidInjector() → DispatchingAndroidInjector\n  + com.jakewharton.sdksearch.DaggerReleaseAppComponent getAndroidInjector() → DispatchingAndroidInjector\n  + com.jakewharton.sdksearch.SdkSearchApplication androidInjector() → AndroidInjector\n  + com.jakewharton.sdksearch.SdkSearchApplication androidInjector() → DispatchingAndroidInjector\n  + dagger.android.AndroidInjection inject(Object, HasAndroidInjector)\n  + dagger.android.HasAndroidInjector androidInjector() → AndroidInjector\n\n  - com.jakewharton.sdksearch.AppComponent getActivityInjector() → DispatchingAndroidInjector\n  - com.jakewharton.sdksearch.DaggerReleaseAppComponent getActivityInjector() → DispatchingAndroidInjector\n  - com.jakewharton.sdksearch.SdkSearchApplication activityInjector() → AndroidInjector\n  - com.jakewharton.sdksearch.SdkSearchApplication activityInjector() → DispatchingAndroidInjector\n  - dagger.android.HasActivityInjector activityInjector() → AndroidInjector\n```\n\n\n## Usage\n\n`diffuse` has multiple subcommands. The primary one is `diff` which takes two binaries and displays\na summary and detailed listing of changes between them.\n\n```\n$ diffuse diff old.apk new.apk\n\n$ diffuse diff --aab old.aab new.aab\n\n$ diffuse diff --aar old.aar new.aar\n\n$ diffuse diff --jar old.jar new.jar\n```\n\nFor a single binary, the `info` subcommand will show a summary table of the binary contents.\n\n```\n$ diffuse info my.apk\n\n$ diffuse info --aab my.aab\n\n$ diffuse info --aar my.aar\n\n$ diffuse info --jar my.jar\n```\n\nFinally, the `members` subcommand lists the methods, fields, or both of a binary. This mimics\nthe behavior of `dex-member-list`, the tool from which Diffuse is derived.\n\n```\n$ diffuse members my.apk\n\n$ diffuse members --methods my.apk\n\n$ diffuse members --aar --fields my.aar\n```\n\nSee more information about the subcommands and their options\u002Farguments by running with `--help`.\n\n\n## Install\n\n**Mac OS**\n\n```\n$ brew install JakeWharton\u002Frepo\u002Fdiffuse\n```\n\n**Other**\n\nDownload ZIP from\n[latest release](https:\u002F\u002Fgithub.com\u002FJakeWharton\u002Fdiffuse\u002Freleases\u002Flatest).\n\n\n## More info\n\n### Presentations\n\n* \u003Ca href=\"https:\u002F\u002Fjakewharton.com\u002Fdiffusing-changes-in-your-apk\u002F\">Diffusing Change in Your APK – Droidcon Toronto\u003Cbr>\n![](.github\u002Ftalk.jpg)\n\u003C\u002Fa>\n\n### Blog posts\n\n* [Calculating the true impact of zip file entries](https:\u002F\u002Fjakewharton.com\u002Fcalculating-zip-file-entry-true-impact\u002F)\n\n\n## License\n\n    Copyright 2015 Jake Wharton\n\n    Licensed under the Apache License, Version 2.0 (the \"License\");\n    you may not use this file except in compliance with the License.\n    You may obtain a copy of the License at\n\n       http:\u002F\u002Fwww.apache.org\u002Flicenses\u002FLICENSE-2.0\n\n    Unless required by applicable law or agreed to in writing, software\n    distributed under the License is distributed on an \"AS IS\" BASIS,\n    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n    See the License for the specific language governing permissions and\n    limitations under the License.\n","Diffuse 是一个用于对比 APKs、AABs、AARs 和 JARs 文件差异的工具，旨在提供高层次的变化概览以及重要的详细输出。它支持对压缩和未压缩文件大小进行比较，并能展示 DEX、ARSC 等组件的具体差异。该工具特别适用于小范围修改（如单个 PR 或 git SHA 的变更）时使用，帮助开发者快速定位和理解代码更新前后的影响。基于 Kotlin 语言开发，遵循 Apache License 2.0 开源协议。",2,"2026-06-11 03:12:47","top_language"]