From d36a75ed0268cd05f1d836c422ea3222fca071e6 Mon Sep 17 00:00:00 2001 From: Natalie Bunduwongse Date: Tue, 16 Jun 2026 11:25:50 +1200 Subject: [PATCH 1/2] feat(audience): resolve install referrer via Maven instead of bundling the AAR Bundled AARs can't be de-duplicated by Gradle, so shipping installreferrer-2.2.aar directly caused class/version conflicts when a game pulled the same library in via another SDK. Declare it as a Maven dependency through EDM4U (Editor/ImmutableAudienceDependencies.xml) and document a manual mainTemplate.gradle fallback for projects without EDM4U. The AUDIENCE_MOBILE_ATTRIBUTION define still gates the C# JNI code; the defensive proguard keep-rules are retained. Co-Authored-By: Claude Opus 4.8 --- .../Editor/ImmutableAudienceDependencies.xml | 25 +++++++++++++ .../ImmutableAudienceDependencies.xml.meta | 7 ++++ src/Packages/Audience/README.md | 26 ++++++++++---- .../Plugins/Android/installreferrer-2.2.aar | Bin 7948 -> 0 bytes .../Android/installreferrer-2.2.aar.meta | 33 ------------------ .../Runtime/Plugins/Android/proguard-user.txt | 3 +- 6 files changed, 53 insertions(+), 41 deletions(-) create mode 100644 src/Packages/Audience/Editor/ImmutableAudienceDependencies.xml create mode 100644 src/Packages/Audience/Editor/ImmutableAudienceDependencies.xml.meta delete mode 100644 src/Packages/Audience/Runtime/Plugins/Android/installreferrer-2.2.aar delete mode 100644 src/Packages/Audience/Runtime/Plugins/Android/installreferrer-2.2.aar.meta diff --git a/src/Packages/Audience/Editor/ImmutableAudienceDependencies.xml b/src/Packages/Audience/Editor/ImmutableAudienceDependencies.xml new file mode 100644 index 000000000..795855d1d --- /dev/null +++ b/src/Packages/Audience/Editor/ImmutableAudienceDependencies.xml @@ -0,0 +1,25 @@ + + + + + + + https://maven.google.com + + + + diff --git a/src/Packages/Audience/Editor/ImmutableAudienceDependencies.xml.meta b/src/Packages/Audience/Editor/ImmutableAudienceDependencies.xml.meta new file mode 100644 index 000000000..cc144bdd1 --- /dev/null +++ b/src/Packages/Audience/Editor/ImmutableAudienceDependencies.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9d07b68218d6495c87d75e4db65d7b7b +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/Packages/Audience/README.md b/src/Packages/Audience/README.md index 936bdb801..57fa92b71 100644 --- a/src/Packages/Audience/README.md +++ b/src/Packages/Audience/README.md @@ -47,17 +47,29 @@ Press Play; `ImmutableAudience.Initialized` returns `true` and `AnonymousId` bec - Integration guide and API reference: - Sample Unity project: [`examples/audience`](https://github.com/immutable/unity-immutable-sdk/tree/main/examples/audience) -## Vendored dependencies +## Android dependencies -The package vendors prebuilt third-party AARs for mobile attribution. They are only included in your build when the corresponding scripting define is set; without the define they're stripped via `defineConstraints` on the plugin meta files. +Mobile install attribution (the `AUDIENCE_MOBILE_ATTRIBUTION` define) needs the Google Play Install Referrer Library. The package does **not** bundle it as a prebuilt `.aar` — bundled AARs can't be de-duplicated by Gradle, so shipping `installreferrer-2.2.aar` directly caused class/version conflicts when a game already pulled in the same library via another SDK. Instead it's resolved from Maven: -| File | Version | Source | Required define | -| --- | --- | --- | --- | -| `Runtime/Plugins/Android/installreferrer-2.2.aar` | 2.2 | [maven.google.com](https://maven.google.com/web/index.html#com.android.installreferrer:installreferrer:2.2) | `AUDIENCE_MOBILE_ATTRIBUTION` | +| Dependency | Version | Source | +| --- | --- | --- | +| `com.android.installreferrer:installreferrer` | 2.2 | [maven.google.com](https://maven.google.com/web/index.html#com.android.installreferrer:installreferrer:2.2) | -`Runtime/Plugins/Android/proguard-user.txt` ships explicit R8 keep rules for the Install Referrer Library. Unity's gradle build merges it automatically when the AAR is included. +**With [EDM4U](https://github.com/googlesamples/unity-jar-resolver) (recommended):** no action needed. `Editor/ImmutableAudienceDependencies.xml` declares the dependency and EDM4U's Android Resolver fetches it, resolving any version conflict with other SDKs to a single highest version. Install EDM4U as a project prerequisite — do not embed a second copy. -Before tagging a release, check `maven.google.com` for newer versions of any vendored dependency and bump the pinned filename if needed. +**Without EDM4U:** add the dependency to your `Assets/Plugins/Android/mainTemplate.gradle`: + +```gradle +dependencies { + implementation 'com.android.installreferrer:installreferrer:2.2' +} +``` + +`Runtime/Plugins/Android/proguard-user.txt` ships explicit R8 keep rules for the Install Referrer Library; Unity's gradle build merges them regardless of how the dependency is resolved. + +`play-services-ads-identifier` (GAID) is intentionally left for the studio to add, so games that don't collect the advertising ID never declare the `AD_ID` permission. + +Before tagging a release, check `maven.google.com` for a newer version and bump the pinned version above and in `ImmutableAudienceDependencies.xml` if needed. ## License diff --git a/src/Packages/Audience/Runtime/Plugins/Android/installreferrer-2.2.aar b/src/Packages/Audience/Runtime/Plugins/Android/installreferrer-2.2.aar deleted file mode 100644 index ea4f702e58e265f9007a3a6270392b41cdee3f14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7948 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

~Yed6O+^Jl5 zW;OH8N=jOL6sPW_q?Mah_<+!i*Kexl(v9n}?ho}ltis*yRT6~Gz}^?#S=-t3I%}^& z33f4|xVoJTTUDSs!zO}t zHM^1*U0ma7kgmD?YHf2>oD$DMPv(OQ@lieHbZ(Bku_Ycf+B(ibzk%K0(|S@ z#1(Oi&>f5CV?@Q6p}mD*GqobrOHbV(U%JZ}!ClW0Ode3Y4T%_9TP^F6Ba1G8I#h!H z2_m+S{wWtDE2s6Ev9YW{j|^()(|3eq(2st)1+y~Hgqa=!3(}+pnx$kkm~xIbL53xM zdoA)ihL(ze3uZAPwuq)J=J<-}HKMFm|3QixJWH*8#3VwHlsG|s5l&(8Z~;R|$t=1# z&o<+hkAjki5;-HqyP&-P&CRk3XLYfluqI}q^1$ZQwU&>-N(`lS38*$yLy!z}y?9r8 z-Zs)(Ui=bQ*2kVHUUH~U7W@A4jVR{5{LiM5u|W4Kit-T40hn3REIzc=) zNN>V8(wJiV&69Glm7SdIJ9;ux$+bd5Gx|{Evduj`xcZ4K+6pqoLs5YpdmMS*=Na>E zF&N8`gd9nr6zR>4Qf^cBkymcqB}zK#yecRS=6G&y8x-z;;)~ssCCc~mY)3gD`nwIn z_V6$oUdvoIFO~MhP9RJdyCbEKS`>|b7Kd%1GfNu$EzDs~=MGx7kR5Kf=7WX@r&@q@26w zyB7Nzja=!ADNXGIN#&yDn=&kZTpUble5AX#c#SWP>4%2HP)m2xhO;8uB7}A(OTQ_Z zigB4SqtF*WqlmX0q?DlXrR#H~)s^mE@}B#rXU6V`4dZVZ=I^t4ds5F~5O3Is&|bs2 zot_wCOes26pIQ+=4vBT)8xPB9zcxE?Q9iU9k9=G^Rcv(3ywV3GYMiewduG)&V0>Ux zZCc6^$!-z^OA`JmHDCl!SiACL2Kk+q*% zjzkk=jIZRNLRGX7jUQYEWQg$KmxOJ-HpoFr0bsUXA7&%NKQh z66*LBM8bm06m5XMz32MiCXS|JWB4GiW}O`D@D{!m&?Kl2RtRuR!0R+njP2%rqXLSw zJSnD`+*JKww!CQNbrM%zZ&8Wfp=b=j>3i&jvWz-=J*)dI3_ge4^UR8DApyuvN0J;I zPF}y2nWF*>q4TCK1l$Of`2W5DtpF$VIdjJ->-BJWr=hYI1HU;f=B>Q6t)YF+wjN|O zCDaXq6*3>(pYP22-=^CDXsDfkKdIOQ{njPc~a*<@3Ubx>gRN5Sm%TaGKj|oZt zEq1sNr1L!X_jOlp81e+825%o5M2om>ILVf|+M_z{MB-LfjbR)EeRSc^u1Ajhe-6zD z(1qV;!x{Grzhb10?P?0A0OUo7f;9!fTagGm;RqxW5z6~5fodw9%w`eVJYTa47p9Dd z^NfG;*%}W-T}`pB_W24q=O#+|V5?7N!56jf52z6;x)nmCf94Mc{Jk>xKHK{w%(!7tZh@=qH?Ln( zV`h<}wne@?N2I0wd@Ylcas@|(d+YU#B8_}FJubVg2Y+~ml$>0WgEeg_^i;>%N44ql zGoVgp^@GVo-;{#^{hWFDbYyIyWk}u~Dva-1nGxIjn+s zyG%6uDUQ8|NmGvs_-4|5>}AoV;z&_a>WWI5fI{E4=)wM%@EF7in|x!jSwABru8Ot2 z%FF4fnMX8f_?XYoz zapbz(guoaQQQ1MooCghlCh&1m4P&ivYj#MZe~8d%9A;S(8&6~{`BNrVIjexoEe z2T0O}uRzUtl)(Ik*YAxjk(uP@1Q~P&(L(!#pv^jm(34#Bq(8!;LJ-LOfI8q_=j zS%HWXI3Le`4?q8t+^Ok0J%hGshn`l$NVB3=!^6iU>A~ zomm95qNvx(6DXcI6Cvl>`908F+H%{TqcK!L-jHNp%agB#D9W_m?spB>+7n&o>l@eU zs@;+Z1ia?iYU98!&&*dDu3aA6evt~*KB>|VSJd}b``u%hp+6G_^^YmPLyPid-WNS@ ziS-=sw%8)W&S>3g>#tkHA|2*TtxrPb2?=hfyu8MUpl@k>X(J*hyJfnuzcAoN@X(hLk`y9I?#7C1wh?eK@{;p6pb*W#Dm zfkiC>;HYmA@|#wv--zOPy;xy~Tpmm;G8vM77TJP0t;I6CKzW_AW-S<7UOqD>A8v`z zJ?&?8zh;@Cn_US3QoL#;Aj_$_bm!;>7W&~b-t3%Qw{5nWs{XX_JYc^mVgH8@n@lYK7l)Tpb6czm z4RUOSs6o07=!Y6k&5n`hK-_zMT6d_9jK^+{CKd)>+Zyg>iv&cr0Itvaei92kd;S(# z$%l6VhHXLDX5>MUmnAga1&glmIG81Nj2YP0m^U;H;OWr(CEj(uu{ebs2S!-S1*mXt&M=NZkH4qNTTCvaCF zD8FmIJ@go^#74I?*-u*p;OV1Zxdw{42$-s2hcw&)S!tW#{?RRIxeFA%FtOdT5=f z@2q%Y(No`tWHAEhD6-+C5nE%-g{y*y=~_!5PCa=Yx>ow>U@ta1)-ZJ(>{jC@LVvTBOJIqy}D-x`v_8y^l#x7*Rbt&(R>N`BEo=13tEmcc z>ZCjnx=R_i(NM!fd74Uvcv@5S=Og@YAE*a@co}a26S{7twN^QdP zG6QbV7xAX~*tH)KvQ5wptT>~iu$u?Pm++KooTCZ&+$1&S#aIW+E?B2jQSm)+fI0)_}Y z1b{X^=L>fMube8tY%CmF^@WQHpDy5xHfRtu*2cpNBLNr2$(Uw-^aIeecQrLP6=37> zyd6=YK!9I>fRfx;2e#)G~xpaSVU#_46C1rd;eB9Ij;x%>m4ycbjeZyP6nE>UZNE5SxK&E z?ODTi-CI`M#KOewX45$wPIIGrUh~qCsoZQy66>iYdc%mTz+*cK2=F-6qY*(B2*hSRz2P&C z@*)xTa+ysNzd-5p7Hsq!uNk_^GYVMb>U`HW8DdPQH`;v#$`xZpp>EWdQP5QiwyFmUb zK3YOGSK&xw>qhOVImg*fOmnB7)tAI$AK(a-vR@K+wsM$m_iH~XsGanEdps2EG{>Qp z^5dR24J==Q1X3<|r^@bFeN}$2UhB?5T`_-73+uA(3+woD1TjqR7n^MSM|=RTzFqR>IaOn54eeTtNqq{ZO%$lJMiwE7^@qRnveZ+ z{rJYeEtSe1Yqgxe13qFI`Gn&3!Rivc45p3D5p(+$lVhKGT+0&p+gyO+nPHIJ z)JEGk%qe>{*v|)i@l^N-6DFZvSt;H$4$GG7cJm{Y;xQGpm1#9vyE zj>OEgdaMvw9sbOjQ9|@W@mTJ%_RaYh2z1xrLSFc}V*jS<>~@??o72yC{ac1?Z1z(J zGq8qJ`-?R-tYNg#+tJxcpY@J(QL}av10lWfNrB_D1ZW&LfT2sRcb0#1Is7%PdrNN} zbPH@>2NdyaXY*{+!xsmz*?2)T=EeIdRy9)`Aw#qPdpbH{8lg43DgzD-+qy_rGwy$T zgOf5FsVBYOGdth@l&~M!WH=j)C;hCRDcR{OKL4DX_2uGx5?(&Ftma%fHz)VvsviWk z$eC$K+hWmdsH2Qs#8G;#nENB;;v)WXS{;~?lHs4AD|^M?^O97GndbIJj%@od^)nA& zUKZ?P{z>iO{x^~^{aEq+d5ifkw5;t}?Z<}JAI&{|w=QxQyq06~L!_HG_RbnSSXR`N zYkxqcfIoo%&G|eM&_Xcue}St#k>IRBTU{{Ni+6G{Cq`~Py0`0MiDxa$9w>z{)D6?BLTu?OJ)D-Ra# RpIex}W9P5NCI091e*i6i#q Date: Tue, 16 Jun 2026 11:25:50 +1200 Subject: [PATCH 2/2] chore(audience-sample): declare install referrer dependency in gradle template The sample no longer gets the Install Referrer Library from a bundled AAR, and it doesn't use EDM4U, so it declares the Maven dependency manually in mainTemplate.gradle - the documented fallback path. Verified the resulting App Bundle includes the installreferrer classes. Co-Authored-By: Claude Opus 4.8 --- .../audience/Assets/Plugins/Android/mainTemplate.gradle | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/audience/Assets/Plugins/Android/mainTemplate.gradle b/examples/audience/Assets/Plugins/Android/mainTemplate.gradle index 795cadd4d..3558a761f 100644 --- a/examples/audience/Assets/Plugins/Android/mainTemplate.gradle +++ b/examples/audience/Assets/Plugins/Android/mainTemplate.gradle @@ -22,6 +22,12 @@ apply plugin: 'com.android.library' dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) **DEPS** + // Google Play Install Referrer Library, resolved from Maven (the Audience + // package no longer bundles it as an .aar - it conflicted with other SDKs). + // EDM4U projects get it automatically from ImmutableAudienceDependencies.xml; + // this sample has no EDM4U, so it declares the dependency manually. + implementation 'com.android.installreferrer:installreferrer:2.2' + // Uncomment to enable GAID collection (requires AUDIENCE_MOBILE_ATTRIBUTION // scripting define + AudienceConfig.EnableMobileAttribution). Without this // line the SDK still builds and runs, but `gaid` / `gaidLimitAdTracking`