admanagekit-mcp-server 1.2.5 → 1.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/content/README.md CHANGED
@@ -5,7 +5,9 @@
5
5
 
6
6
  AdManageKit is a comprehensive Android library designed to simplify the integration and management of Google AdMob ads, Google Play Billing, and User Messaging Platform (UMP) consent.
7
7
 
8
- **Latest Version `4.4.6`** is a **maintenance release**. No API changed and no library source file changed — the whole diff is dependencies and docs. It **downgrades** `androidx.work:work-runtime` **2.11.2 2.9.1**: WorkManager **2.10 and 2.11** call `JobScheduler.forNamespace` whenever `SDK_INT >= 34`, and modified or spoofed ROMs that report API 34 over an older framework have no such method the `NoSuchMethodError` then kills the **whole process during bind** (`Unable to get provider androidx.startup.InitializationProvider`), because `androidx.startup` builds WorkManager in a `ContentProvider` installed before `Application.onCreate` runs. 2.9.1 is the last release without that call. AdManageKit has no WorkManager code of its own; the pin only steers the version the ads SDK pulls in, and since Gradle resolves the **highest** version in the graph, an app that declares 2.10/2.11 itself keeps the crash pin `androidx.work:work-runtime:2.9.1` in your app too. Also picks up AGP **9.4.0**, Firebase BOM **34.19.0**, Compose BOM **2026.09.00** and Yandex Mobile Ads **8.4.0**. See [Release Notes v4.4.6](docs/release-notes/RELEASE_NOTES_v4.4.6.md).
8
+ **Latest Version `4.4.7`** is a **build and packaging release**. No API changed and no library source file changed — the subject is the library's **consumer ProGuard rules**, which were pinning several thousand classes as un-shrinkable in every app that depends on AdManageKit. `ad-manage-kit-compose` shipped `-keep class androidx.compose.** { *; }`, a rule R8 applies to every consuming app with no way to opt out: it retained **7221 classes, 57262 methods and 23964 fields** of the Compose runtime whether the app used them or not and even for apps that never call an AdManageKit composable. All five modules now ship a wired, **deliberately empty** `consumer-rules.pro`; the library uses no reflection, JNI or serialization, and AAPT2 already emits the view-constructor keeps each app actually needs. On the sample app this is **11.99 MB → 7.89 MB** of APK (−34%) and 21.3 MB → **12.5 MB** of dex (−41%). **If you run R8, you get this by upgrading** nothing to configure, and you can delete any defensive `-keep class com.i2hammad.admanagekit.** { *; }` you carry. See [Release Notes v4.4.7](docs/release-notes/RELEASE_NOTES_v4.4.7.md).
9
+
10
+ **Version `4.4.6`** is a **maintenance release**. No API changed and no library source file changed — the whole diff is dependencies and docs. It **downgrades** `androidx.work:work-runtime` **2.11.2 → 2.9.1**: WorkManager **2.10 and 2.11** call `JobScheduler.forNamespace` whenever `SDK_INT >= 34`, and modified or spoofed ROMs that report API 34 over an older framework have no such method — the `NoSuchMethodError` then kills the **whole process during bind** (`Unable to get provider androidx.startup.InitializationProvider`), because `androidx.startup` builds WorkManager in a `ContentProvider` installed before `Application.onCreate` runs. 2.9.1 is the last release without that call. AdManageKit has no WorkManager code of its own; the pin only steers the version the ads SDK pulls in, and since Gradle resolves the **highest** version in the graph, an app that declares 2.10/2.11 itself keeps the crash — pin `androidx.work:work-runtime:2.9.1` in your app too. Also picks up AGP **9.4.0**, Firebase BOM **34.19.0**, Compose BOM **2026.09.00** and Yandex Mobile Ads **8.4.0**. See [Release Notes v4.4.6](docs/release-notes/RELEASE_NOTES_v4.4.6.md).
9
11
 
10
12
  **Version `4.4.5`** is a **patch release**. No API changed. It fixes a `BannerAdView` bug that renders a **blank banner slot inside Jetpack Compose**: swapping the shimmer placeholder for the loaded `AdView` raises an ordinary `requestLayout()`, which cannot cross Compose's `AndroidView` interop boundary once any ancestor already carries a pending layout flag — so Compose never re-measured the subtree and the freshly attached `AdView` was left at 0×0. The ad loaded, `onAdLoaded`/`onAdImpression` fired and the impression was **logged and billed**, but the slot stayed blank until a rotation or resize forced a full traversal. Both the AdMob and `BannerWaterfall` success paths now force the measure/layout pass themselves. Also picks up the Next-Gen GMA SDK **1.4.0**, AGP **9.3.2** and Firebase BOM **34.18.0**. See [Release Notes v4.4.5](docs/release-notes/RELEASE_NOTES_v4.4.5.md).
11
13
 
@@ -39,7 +41,7 @@ Since **4.2.0** the library runs on the Google Mobile Ads **Next-Gen SDK** (`ads
39
41
 
40
42
  ## Next-Gen GMA SDK
41
43
 
42
- As of v4.2.0, AdManageKit runs on Google's **Next-Gen Google Mobile Ads SDK** (`com.google.android.libraries.ads.mobile.sdk`, stable `1.4.0` as of 4.4.6) instead of the legacy `com.google.android.gms:play-services-ads`. This isn't a branch or an opt-in — it's the only version of AdManageKit going forward.
44
+ As of v4.2.0, AdManageKit runs on Google's **Next-Gen Google Mobile Ads SDK** (`com.google.android.libraries.ads.mobile.sdk`, stable `1.4.0` as of 4.4.7) instead of the legacy `com.google.android.gms:play-services-ads`. This isn't a branch or an opt-in — it's the only version of AdManageKit going forward.
43
45
 
44
46
  ### Why the move
45
47
 
@@ -203,15 +205,15 @@ dependencyResolutionManagement {
203
205
  **Step 2:** Add dependencies to your app's `build.gradle`:
204
206
 
205
207
  ```groovy
206
- implementation 'com.github.i2hammad.AdManageKit:ad-manage-kit:v4.4.6'
207
- implementation 'com.github.i2hammad.AdManageKit:ad-manage-kit-billing:v4.4.6'
208
- implementation 'com.github.i2hammad.AdManageKit:ad-manage-kit-core:v4.4.6'
208
+ implementation 'com.github.i2hammad.AdManageKit:ad-manage-kit:v4.4.7'
209
+ implementation 'com.github.i2hammad.AdManageKit:ad-manage-kit-billing:v4.4.7'
210
+ implementation 'com.github.i2hammad.AdManageKit:ad-manage-kit-core:v4.4.7'
209
211
 
210
212
  // For Jetpack Compose support
211
- implementation 'com.github.i2hammad.AdManageKit:ad-manage-kit-compose:v4.4.6'
213
+ implementation 'com.github.i2hammad.AdManageKit:ad-manage-kit-compose:v4.4.7'
212
214
 
213
215
  // For Yandex Ads multi-provider support
214
- implementation 'com.github.i2hammad.AdManageKit:ad-manage-kit-yandex:v4.4.6'
216
+ implementation 'com.github.i2hammad.AdManageKit:ad-manage-kit-yandex:v4.4.7'
215
217
  ```
216
218
 
217
219
  **Step 3:** Ensure your app's `compileSdk` is **37 or higher** (required transitively as of 4.2.0).
@@ -785,6 +787,7 @@ Register it **before** `initBilling`. Products land in `unfetched` when the id i
785
787
  - [Multi-Provider Waterfall](docs/MULTI_PROVIDER_WATERFALL.md)
786
788
  - [Yandex Integration](docs/YANDEX_INTEGRATION.md)
787
789
  - [Billing Integration Guide](docs/APP_PURCHASE_GUIDE.md)
790
+ - [Release Notes v4.4.7](docs/release-notes/RELEASE_NOTES_v4.4.7.md)
788
791
  - [Release Notes v4.4.6](docs/release-notes/RELEASE_NOTES_v4.4.6.md)
789
792
  - [Release Notes v4.4.5](docs/release-notes/RELEASE_NOTES_v4.4.5.md)
790
793
  - [Release Notes v4.4.4](docs/release-notes/RELEASE_NOTES_v4.4.4.md)
@@ -0,0 +1,133 @@
1
+ # Release Notes — v4.4.7
2
+
3
+ **Release Date:** 2026-09-22
4
+
5
+ ## Overview
6
+
7
+ v4.4.7 is a **build and packaging release**. No API was added, removed or changed, and **no library source file changed** — the diff is the five modules' ProGuard rule files, their build scripts, `gradle.properties`, the sample app's release build type, and documentation.
8
+
9
+ The subject is the library's **consumer ProGuard rules**. A consumer rule is not advice: AGP appends it to the R8 configuration of every app that depends on the module, and the app has no way to opt out. `ad-manage-kit-compose` shipped `-keep class androidx.compose.** { *; }`, which meant every consuming app kept the entire Compose runtime un-shrinkable, un-optimizable and un-obfuscatable — including apps that never call a single AdManageKit composable.
10
+
11
+ All five modules now ship a wired, **deliberately empty** `consumer-rules.pro`. On the sample app the result is **11.99 MB → 7.89 MB** of APK and **21.3 MB → 12.5 MB** of uncompressed dex.
12
+
13
+ **If your app runs R8, you get this by upgrading.** There is nothing to configure and nothing to migrate.
14
+
15
+ ---
16
+
17
+ ## Changed
18
+
19
+ ### `ad-manage-kit-compose` no longer pins the Compose runtime in consuming apps
20
+
21
+ The module's `consumer-rules.pro` contained three package-wide keeps. Measured with the AGP 9 R8 configuration analyzer against the sample app, their keep radius was:
22
+
23
+ | Rule | Classes | Methods | Fields |
24
+ |---|---:|---:|---:|
25
+ | `-keep class androidx.compose.** { *; }` | 7221 | 57262 | 23964 |
26
+ | `-keep class com.google.android.gms.ads.** { *; }` | 97 | 506 | 329 |
27
+ | `-keep class com.i2hammad.admanagekit.compose.** { *; }` | 47 | 446 | 168 |
28
+
29
+ R8 reads each as `DONT_SHRINK, DONT_OPTIMIZE, DONT_OBFUSCATE`. The first alone retained Compose runtime, foundation, UI and Material3 in their entirety — and it also **defeated Compose's own consumer rules**, which deliberately grant R8 latitude it can no longer use once the package is pinned wholesale:
30
+
31
+ ```
32
+ -keep,allowobfuscation,allowshrinking class * extends androidx.compose.ui.node.ModifierNodeElement
33
+ ```
34
+
35
+ None of the three rules was load-bearing. The module's composables are ordinary Kotlin functions that reach the view layer through `AndroidView` factory lambdas. There is no reflection, no `Class.forName`, no resource-name lookup and no serialization anywhere in the module, so R8 already resolves every edge from the consuming app's own call sites.
36
+
37
+ ### All five modules now ship a wired, empty `consumer-rules.pro`
38
+
39
+ `ad-manage-kit-core`, `ad-manage-kit-billing` and `ad-manage-kit-yandex` previously declared no `consumerProguardFiles` at all, and `ad-manage-kit`'s file existed but was blank — so the contract was accidental rather than stated. Each file now carries the reasoning for why it holds no rules, so the next person to hit an R8 problem has something to read rather than a blank file to guess at.
40
+
41
+ No module in the library uses reflection, `Class.forName`, JNI, `Parcelable`, `Serializable` or reflective serialization.
42
+
43
+ **The ad views need no keep rule.** `BannerAdView`, `NativeBannerSmall`/`Medium`, `NativeLarge` and `NativeTemplateView` are inflated from XML, but AAPT2 already emits the matching rule into the generated `aapt_rules.txt` for exactly the views each app's own layouts reference:
44
+
45
+ ```
46
+ -keep class com.i2hammad.admanagekit.admob.BannerAdView { <init>(android.content.Context, android.util.AttributeSet); }
47
+ -keep class com.i2hammad.admanagekit.admob.NativeTemplateView { <init>(android.content.Context, android.util.AttributeSet); }
48
+ ```
49
+
50
+ That is strictly better than a library rule, which would pin all five views in all apps regardless of use.
51
+
52
+ **The native templates survive resource shrinking.** All 38 are referenced statically as `R.layout.*` constants from `NativeAdTemplate`, so R8 and the resource shrinker both keep them — along with the `ad_headline` / `ad_media` / `ad_body` / `ad_call_to_action` / `ad_app_icon` ids inside them, which `YandexNativeProvider` resolves by name through `Resources.getIdentifier`. Verified against the shrunk `resources.arsc`.
53
+
54
+ If you add a new template asset id that is reached **only** by name, it needs a `tools:keep` entry in `res/raw/keep.xml` — that is the one case in this library where shrinking can outrun the code.
55
+
56
+ ### The sample app now builds release with R8 on
57
+
58
+ `isMinifyEnabled` and `isShrinkResources` were both `false`. That is why none of the above was noticed: R8 had **never run anywhere in this repository**, so the rules shipped to consumers were never once exercised by the project that ships them. They now are, on every release build.
59
+
60
+ Measured on the sample app, which depends on all five modules, Yandex included:
61
+
62
+ | | Before | After | |
63
+ |---|---:|---:|---:|
64
+ | APK | 11.99 MB | **7.89 MB** | −34% |
65
+ | dex (uncompressed) | 21.3 MB / 3 files | **12.5 MB / 2 files** | −41% |
66
+ | Live classes | 37713 | **29297** | −22% |
67
+ | Live methods | 186338 | **131255** | −30% |
68
+ | Live fields | 106589 | **76004** | −29% |
69
+ | Classes pinned by keep rules | 19307 | **11856** | −39% |
70
+
71
+ Your own numbers will differ — the sample app is not a typical consumer, and an app that does not depend on `ad-manage-kit-yandex` starts from a very different baseline.
72
+
73
+ ### Two AGP 9 migration flags returned to their defaults
74
+
75
+ `gradle.properties` carried:
76
+
77
+ ```properties
78
+ android.r8.strictFullModeForKeepRules=false
79
+ android.r8.optimizedResourceShrinking=false
80
+ ```
81
+
82
+ Both were set in **v3.5.6**, the release that moved the project from AGP 8.13.1 to 9.0.1, described in that commit as being "for improved build stability during the transition". Nothing ever exercised them, because minification was off — the transition they were guarding was over before R8 ran for the first time. Both are now left at their AGP 9 defaults: strict full mode stops a member-less `-keep class X` from silently pinning X's members, and optimized resource shrinking lets unreachable resources actually go.
83
+
84
+ These are project-local build settings and do not affect consuming apps.
85
+
86
+ ### The library modules still publish unminified AARs
87
+
88
+ `isMinifyEnabled = false` remains set on all five modules, deliberately — a published AAR must keep its public API under its real names or consumers cannot compile against it, and shrinking there would only remove code the consuming app's R8 removes anyway, with far better whole-program information. Each module's `proguard-rules.pro` now says so.
89
+
90
+ The one in `ad-manage-kit` previously ended with:
91
+
92
+ ```
93
+ -keep class * {
94
+ *;
95
+ }
96
+ ```
97
+
98
+ Inert while minification was off, but a rule that would have disabled shrinking, optimization and obfuscation for the **entire program** the moment anyone switched it on. It is gone.
99
+
100
+ ## Notes
101
+
102
+ - **Nothing to migrate.** An app that already enables R8 simply builds smaller after the upgrade. An app carrying its own defensive `-keep class com.i2hammad.admanagekit.** { *; }` can delete it — the library never needed it — though leaving it costs only size
103
+ - **Verification boundary.** The removals are backed by a full R8 configuration-analyzer pass (no keep rule in the minified sample app now traces back to a project file — only AGP's own `proguard-android-optimize.txt` defaults), by confirming the shrunk `resources.arsc` still carries every native template layout and every dynamically-resolved `ad_*` id, and by the AAPT2-generated constructor keeps being present as described. The existing **176 tests pass unchanged**, but they run on the unminified debug variant and therefore do not cover R8 output. On-device verification of a minified release build is recommended, particularly for Yandex native templates — the only place in the library that resolves resources by name
104
+ - **`ad-manage-kit-yandex` remains the dominant cost in a minified build**, and it is not the library's to remove. The Yandex Mobile Ads SDK's own consumer rules pin 5788 distinct classes (5631 under `-keepnames class yads.**` alone), and the AppMetrica tree it pulls in pins a further 2297. Apps using only the AdMob providers avoid all of it by not depending on the module
105
+ - No dependency versions changed in this release
106
+
107
+ ### Checking your own build
108
+
109
+ To see which rules dominate your app's keep radius (AGP 9.3+):
110
+
111
+ ```bash
112
+ ./gradlew :app:analyzeReleaseR8Config
113
+ ```
114
+
115
+ The report lands in `app/build/reports/r8/`. Rules are ranked by how many classes, methods and fields each one pins, with the originating dependency or file named — which is how the Compose rule above was found.
116
+
117
+ ---
118
+
119
+ ## Upgrading
120
+
121
+ ```gradle
122
+ implementation 'com.github.i2hammad.AdManageKit:ad-manage-kit:v4.4.7'
123
+ implementation 'com.github.i2hammad.AdManageKit:ad-manage-kit-billing:v4.4.7'
124
+ implementation 'com.github.i2hammad.AdManageKit:ad-manage-kit-core:v4.4.7'
125
+
126
+ // For Jetpack Compose support
127
+ implementation 'com.github.i2hammad.AdManageKit:ad-manage-kit-compose:v4.4.7'
128
+
129
+ // For Yandex Ads multi-provider support
130
+ implementation 'com.github.i2hammad.AdManageKit:ad-manage-kit-yandex:v4.4.7'
131
+ ```
132
+
133
+ No code changes are required.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "admanagekit-mcp-server",
3
- "version": "1.2.5",
3
+ "version": "1.2.6",
4
4
  "description": "MCP server for AdManageKit Android library - documentation lookup and code generation",
5
5
  "main": "dist/index.js",
6
6
  "bin": {