Share
Embed
Transcript
119 slides
-
Privacy Sandbox on Android ୩ ५ (HASEBA Junya) / @7pairs
DroidKaigi 2024 Day 1 (September 12, 2024) -
ࠓޙํ͕มΘΔՄೳੑʜʜʁ ‣ ݄ʹ1SJWBDZ4BOECPYGPSUIF8FC͕ํసΛൃද ‣ IUUQTQSJWBDZTBOECPYDPNJOUMFO@VTOFXTQSJWBDZTBOECPYVQEBUF ‣ பͷͻͱͭͩͬͨαʔυύʔςΟ$PPLJFͷഇࢭΛஅ೦ ‣ ഇࢭͷऔΓΈ͔ͳΓߤ͍ͯͨ͠ ‣
աڈʹΘͨͬͯԆظΛ܁Γฦ͍ͯͨ͠ ‣ ͨͩ͠1SJWBDZ4BOECPYࣗମࠓޙܧଓͯ͠։ൃΛ͓͜ͳ͏ -
ࠓޙํ͕มΘΔՄೳੑʜʜʁ ‣ ݄ʹ1SJWBDZ4BOECPYGPSUIF8FC͕ํసΛൃද ‣ IUUQTQSJWBDZTBOECPYDPNJOUMFO@VTOFXTQSJWBDZTBOECPYVQEBUF ‣ பͷͻͱͭͩͬͨαʔυύʔςΟ$PPLJFͷഇࢭΛஅ೦ ‣ ഇࢭͷऔΓΈ͔ͳΓߤ͍ͯͨ͠ ‣
աڈʹΘͨͬͯԆظΛ܁Γฦ͍ͯͨ͠ ‣ ͨͩ͠1SJWBDZ4BOECPYࣗମࠓޙܧଓͯ͠։ൃΛ͓͜ͳ͏ -
ࣗݾհ val speaker = Person( name = "長谷場 潤也 (HASEBA
Junya)" sns = "7pairs" icon = AppCompatResources.getDrawable(context, R.drawable.tkg) company = "株式会社アイモバイル" job = "広告SDK (Android / iOS)" languages = setOf("Python", "Clojure") favorites = setOf("U-NEXT Pirates", "埼玉西武ライオンズ") ) -
1SJWBDZ4BOECPYͷඪ Ϣʔβʔ の ϓϥΠόγʔอޢ を ڧԽ͠ た ৽ͨ な
ٕज़ の ߏங ύϒϦογϟʔ や ։ൃऀ に Α る ແྉΦϯϥΠϯίϯςϯπఏڙ の ܧଓ ۀք の օ༷ と ڞʹ ΠϯλʔωοτϢʔβʔ の ϓϥΠόγʔ を อޢ͢ る ৽ͨ な ج४ を ߏங ˞IUUQTQSJWBDZTBOECPYDPNJOUMKB@KQΑΓ -
1SJWBDZ4BOECPYͷඪ Ϣʔβʔ の ϓϥΠόγʔอޢ を ڧԽ͠ た ৽ͨ な
ٕज़ の ߏங ύϒϦογϟʔ や ։ൃऀ に ΑΔແྉΦϯϥΠϯίϯςϯπఏڙ の ܧଓ ۀք の օ༷ と ڞʹ ΠϯλʔωοτϢʔβʔ の ϓϥΠόγʔ を อޢ͢ る ৽ͨ な ج४ を ߏங ˞IUUQTQSJWBDZTBOECPYDPNJOUMKB@KQΑΓ -
ϢʔβʔͷϓϥΠόγʔอޢ ‣ ΞϓϦ8FCαΠτͳͲͷίϯςϯπ Ϣʔβʔ͕҆৺ͯ͠ར༻Ͱ͖ΔͷͰͳ͚ΕͳΒͳ͍ ‣ ݱࡏݸਓͷಛఆʹͭͳ͕Γ͔Ͷͳ͍Έ͕ར༻͞Ε͍ͯΔ ‣ "OESPJEʹ͓͚Δࠂ*% ‣
8FCʹ͓͚ΔαʔυύʔςΟ$PPLJF ‣ ସػೳΛఏڙͯ͜͠ΕΒͷΈΛഇࢭ͢Δ͜ͱΛࢦ͢ -
ϢʔβʔͷϓϥΠόγʔอޢ ‣ ΞϓϦ8FCαΠτͳͲͷίϯςϯπ Ϣʔβʔ͕҆৺ͯ͠ར༻Ͱ͖ΔͷͰͳ͚ΕͳΒͳ͍ ‣ ݱࡏݸਓͷಛఆʹͭͳ͕Γ͔Ͷͳ͍Έ͕ར༻͞Ε͍ͯΔ ‣ "OESPJEʹ͓͚Δࠂ*% ʹݻ༗ͷ*%
ৄࡉͷͪ΄Ͳ ‣ 8FCʹ͓͚ΔαʔυύʔςΟ$PPLJF ݄ʹഇࢭΛஅ೦ ‣ ସػೳΛఏڙͯ͜͠ΕΒͷΈΛഇࢭ͢Δ͜ͱΛࢦ͢ -
ແྉΦϯϥΠϯίϯςϯπఏڙͷܧଓ ‣ ίϯςϯπΛແྉͰఏڙ͢Δʹ͋ͨΓࠂॏཁͳׂΛՌͨ͢ ‣ ϢʔβʔͷϓϥΠόγʔΛอޢ͠ͳ͕Β ͜Ε·Ͱͱಉ Ҏ্ ͷޮՌΛ্͛Δࠂ৴ͷΈΛఏڙ͢Δ ‣
8FCࠂಛ༗ͷػೳ ޮՌͷଌఆ ύʔιφϥΠζͳͲ ͷͨΊʹ ϢʔβʔͷϓϥΠόγʔ͕ڴ͔͞Ε͔Ͷͳ͍ͷ͕ݱঢ় ‣ ୯ʹࠂ*%αʔυύʔςΟ$PPLJFΛഇࢭ͚ͨͩ͠Ͱ ޮՌ͕Լ͕ͬͯίϯςϯπఏڙऀؐݩͰ͖Δརӹ͕ݮগ͢Δ -
ۀքͷօ༷ͱڞʹ ‣ ఏҊஈ֊ͷ༷Λެ։͍ͯ͠Δ ‣ ͦΕͧΕͷཱ͔ΒͷϑΟʔυόοΫΛ͘ื͍ͬͯΔ ‣ ΞϓϦσϕϩούʔ ࠂΛදࣔͤͯ͞རӹΛಘΔཱ
‣ ࠂ৴ࣄۀऀ ࠂΛ৴͢Δཱ ‣ ܭଌπʔϧࣄۀऀ ࠂͷޮՌΛଌఆ͢Δཱ ‣ ࠂओ ࠂΛग़ߘ͢Δཱ -
ࠂ*%ͷ༻్ ‣ ࠂͷޮՌΛଌఆ͢Δ ‣ ΫϦοΫͷܭଌ ‣ ίϯόʔδϣϯ Πϯετʔϧ ߪೖͳͲ ͷܭଌ
‣ ࠂΛύʔιφϥΠζ͢Δ ‣ Ϣʔβʔͷڵຯʹͱ͍ͮͨࠂͷදࣔ -
ొਓհ ‣ ࠂωοτϫʔΫ ‣ 8FCࠂΛ৴͢Δࣄۀऀ ‣ ΞϓϦܭଌπʔϧ ‣ ࠂओͷͨΊʹࠂؔ࿈ͷσʔλΛܭଌ ूܭ͢Δࣄۀऀ
‣ ૬ੑͷྑ͍ࠂΛબͿΈ ‣ ࢦఆ͞Εͨ݅ͷϢʔβʔͱ૬ੑͷྑ͍ࠂΛબͿγεςϜ ܈ -
ࠂ*%ͷ༻్ ‣ ࠂͷޮՌΛଌఆ͢Δ ‣ ΫϦοΫͷܭଌ ‣ ίϯόʔδϣϯ Πϯετʔϧ ߪೖͳͲ ͷܭଌ
‣ ࠂΛύʔιφϥΠζ͢Δ ‣ Ϣʔβʔͷڵຯʹͱ͍ͮͨࠂͷදࣔ -
ΫϦοΫͷܭଌᶆ ΫϦοΫͷ௨ᶃ ‣ <ࠂ4%,> ࠂ*%ΛؚΉܗͰ ࠂͷΫϦοΫΛ௨͢Δ ‣ <ࠂωοτϫʔΫ> ΫϦοΫ͕ൃੜͨ͠σόΠεͷ ࠂ*%ΛѲ͢Δ
ࠂωοτϫʔΫ ΞϓϦܭଌπʔϧ ࠂ*% -
ΫϦοΫͷܭଌᶇ ΫϦοΫͷ௨ᶄ ‣ <ࠂωοτϫʔΫ> ࠂ*%ΛؚΉܗͰϦμΠϨΫτ͢Δ ‣ <ΞϓϦܭଌπʔϧ> ΫϦοΫ͕ൃੜͨ͠σόΠεͷ ࠂ*%ΛѲ͢Δ ˞ϦμΠϨΫτͰͳ͘
ɹ4%,͔ΒใΛૹ৴͢Δέʔε͋Γ·͢ ࠂωοτϫʔΫ ΞϓϦܭଌπʔϧ ࠂ*% -
ࠂ*%ͷ༻్ ‣ ࠂͷޮՌΛଌఆ͢Δ ‣ ΫϦοΫͷܭଌ ‣ ίϯόʔδϣϯ Πϯετʔϧ ߪೖͳͲ ͷܭଌ
‣ ࠂΛύʔιφϥΠζ͢Δ ‣ Ϣʔβʔͷڵຯʹͱ͍ͮͨࠂͷදࣔ -
ࠂ*%ͷ༻్ ‣ ࠂͷޮՌΛଌఆ͢Δ ‣ ΫϦοΫͷܭଌ ‣ ίϯόʔδϣϯ Πϯετʔϧ ߪೖͳͲ ͷܭଌ
‣ ࠂΛύʔιφϥΠζ͢Δ ‣ Ϣʔβʔͷڵຯʹͱ͍ͮͨࠂͷදࣔ -
ࠂ*%ͷऔಘᶃ ґଘؔͷՃ // dependenciesにGoogle Play Servicesの参照を追加する implementation "com.google.android.gms:play-services:+" // AD_IDのパーミッションを追加する
<uses-permission android:name= "com.google.android.gms.permission.AD_ID" /> // 広告IDを取得する Thread(Runnable { val info = AdvertisingIdClient .getAdvertisingIdInfo(context) if (info != null && !info.isLimitAdTrackingEnabled) { val id = info.getId() // 広告IDを使った処理 } }).start() ‣ (PPHMF͕ఏڙ͍ͯ͠Δ (PPHMF1MBZ4FSWJDFTͷ ϥΠϒϥϦΛར༻͢Δ -
ࠂ*%ͷऔಘᶄ ݖݶͷՃ // dependenciesにGoogle Play Servicesの参照を追加する implementation "com.google.android.gms:play-services:+" // AD_IDのパーミッションを追加する
<uses-permission android:name= "com.google.android.gms.permission.AD_ID" /> // 広告IDを取得する Thread(Runnable { val info = AdvertisingIdClient .getAdvertisingIdInfo(context) if (info != null && !info.isLimitAdTrackingEnabled) { val id = info.getId() // 広告IDを使った処理 } }).start() ‣ "OESPJEҎ߱Ͱ "OESPJE.BOJGFTUYNMʹ "%@*%ͷݖݶ͕ඞཁ ‣ ϢʔβʔʹΑΔ ࣮ߦ࣌ͷڐෆཁ -
ࠂ*%ͷऔಘᶅ *%ͷऔಘॲཧ // dependenciesにGoogle Play Servicesの参照を追加する implementation "com.google.android.gms:play-services:+" // AD_IDのパーミッションを追加する
<uses-permission android:name= "com.google.android.gms.permission.AD_ID" /> // 広告IDを取得する Thread(Runnable { val info = AdvertisingIdClient .getAdvertisingIdInfo(context) if (info != null && !info.isLimitAdTrackingEnabled) { val id = info.getId() // 広告IDを使った処理 } }).start() ‣ (PPHMF1MBZ4FSWJDFTͷ "EWFSUJTJOH*E$MJFOUΛ ར༻͢Δ -
ࠂ*%ͷকདྷతͳഇࢭ ‣ ஈ֊తͳ੍ݶ1SJWBDZ4BOECPYͷൃදҎલ͔Β࢝·͍ͬͯΔ ‣ Ҏ߱ϢʔβʔͷڐՄ͕ͳ͍ࠂ*%ͷΞΫηεʹର͠ ΦʔϧθϩΛฦ͢Α͏ʹͳ͍ͬͯΔ ‣ ۩ମతͳഇࢭͷఔ·ͩ໌Β͔ʹͳ͍ͬͯͳ͍ ‣ ݄͔Βؒഇࢭ͠ͳ͍
͏ա͍͗ͯ·͕͢ ‣ େ͖ͳมߋ͕ೖΔ߹ेͳࠂظؒΛ͏͚Δ -
5PQJDT ‣ Ϣʔβʔͷڵຯʹͱ͍ͮͨࠂΛදࣔ͢ΔͨΊͷΈ ‣ ˞ ࠂͷ͕ࣝ͋Δํ͚ͷઆ໌ ɹࠂ*%ΛΘͣʹΦʔσΟΤϯελʔήςΟϯάΛ࣮ݱ͢Δ ‣ σόΠε্ͰͷΞϓϦͷར༻ঢ়گʹͱ͍ͮͯ
γεςϜʹΑͬͯʮτϐοΫʯ͕σόΠεʹׂΓͯΒΕΔ ‣ ࠂͷϦΫΤετʹτϐοΫͷใΛՃ͢Δ͜ͱͰ ֘τϐοΫͱؔ࿈ੑͷߴ͍ࠂΛ৴͢Δ -
τϐοΫͱʁ ‣ Ϣʔβʔ͕ڵຯΛ͍࣋ͬͯΔରΛ͋ΒΘ͢ΧςΰϦ ‣ ྨެ։͞Ε͓ͯΓશछྨ ݄ݱࡏ ‣ IUUQTHJUIVCDPNQSJWBDZTBOECPYUPQJDTBOESPJE ‣
ਓछੑผͳͲͷσϦέʔτͳྨଘࡏ͠ͳ͍ ‣ γεςϜʹΑͬͯσόΠε෦ͰׂΓͯΒΕఆظతʹߋ৽͞ΕΔ ‣ ϢʔβʔʹΑΔ֬ೝ আ͕Մೳ -
5PQJDTʹΑΔ ύʔιφϥΠζᶆ ‣ <ࠂωοτϫʔΫ> ֘ͷτϐοΫͱ ૬ੑͷྑ͍ࠂΛબఆ͢Δ ˞ࠂ*%Λར༻ͨ͠ख๏ͱҟͳΓ ɹσόΠε Ϣʔβʔ Ͱͳ͘
ɹτϐοΫͱͷ૬ੑ͕ج४ͱͳΓ·͢ ࠂωοτϫʔΫ τϐοΫ τϐοΫͱ ૬ੑͷྑ͍ࠂΛ બͿΈ -
5PQJDTͷಛ ‣ Ϣʔβʔͷڵຯʹͱ͍ͮͨࠂΛ৴Ͱ͖Δ ‣ τϐοΫͷׂΓͯσόΠε෦Ͱ݁͢ΔͨΊ ࠂϦΫΤετ࣌Λআ͍ͯ ֎෦ʹใ͕ૹ৴͞ΕΔ͜ͱͳ͍ ‣ ࠂϦΫΤετ࣌ʹ࠷খݶͷใ͔͠ఏڙ͞Εͳ͍ ‣
΄͔ʹͲΜͳτϐοΫׂ͕ΓͯΒΕ͍ͯΔ͔͑ͳ͍ ‣ ͦͷτϐοΫׂ͕ΓͯΒΕͨཧ༝͑ͳ͍ -
1SPUFDUFE"VEJFODF"1* ‣ Ϣʔβʔͷڵຯʹͱ͍ͮͨࠂΛදࣔ͢ΔͨΊͷΈ ‣ ˞ ࠂͷ͕ࣝ͋Δํ͚ͷઆ໌ ɹࠂ*%ΛΘͣʹϦϚʔέςΟϯάΛ࣮ݱ͢Δ ‣ ࠂओͷΞϓϦ͕ϢʔβʔͷߦಈΛͱʹ
ʮΧελϜΦʔσΟΤϯεʯΛఆٛ͢Δ ‣ ΧελϜΦʔσΟΤϯεͱ૬ੑͷྑ͍ࠂΛ ֎෦ʹσʔλΛૹ৴͢Δ͜ͱͳ͘σόΠεͰબఆ͢Δ -
ΧελϜΦʔσΟΤϯεͱʁ ‣ ಛఆͷج४ʹͱ͍ͮͯબΕͨϢʔβʔͷάϧʔϓ ‣ ΞϓϦͰͷߦಈ͕τϦΨʔͱͳͬͯఆٛ͞ΕΔ ‣ Ϣʔβʔొ࣌ʹϝʔϧϚΨδϯͷߪಡʹಉҙͨ͠ਓ ‣ ಛఆͷΧςΰϦͷΛߪೖͨ͠ਓ ‣
FUD ‣ ͦΕͧΕͷάϧʔϓʹ߹ΘͤͨࠂΛ৴͢Δͷ͕ૂ͍ -
1SPUFDUFE"VEJFODF"1*ͷߏཁૉ ‣ $VTUPN"VEJFODF"1* ‣ ΧελϜΦʔσΟΤϯεΛఆٛ͢ΔͨΊͷ"1* ‣ ར༻͢Δͷࠂओ ͷΞϓϦ ‣
"E4FMFDUJPO"1* ‣ ΧελϜΦʔσΟΤϯεͱ૬ੑͷྑ͍ࠂΛબఆ͢ΔͨΊͷ"1* ‣ ར༻͢Δͷࠂ4%, -
͓·͚ 1SPUFDUFE"QQ4JHOBMT ‣ ʹ1SPUFDUFE"VEJFODF"1*ʹՃ͞Εͨཁૉ ‣ ΞϓϦͰͷϢʔβʔͷߦಈΛγάφϧͱͯ͠Ωϟϓνϟ͢Δ ‣ γάφϧσόΠεͷ֎෦ʹૹ৴͞ΕΔ͜ͱͳ͍ ‣ Ϣʔβʔͷߦಈʹͱ͍ͮͨ૬ੑͷྑ͍ࠂΛબͿͨΊ
σόΠε෦ͰͷࠂબఆʹγάφϧΛར༻͢Δ ˞͓·͚ͱݺͿʹେنͳΈͰ͕͢ৄࡉׂѪ͠·͢ -
"UUSJCVUJPO3FQPSUJOH ‣ ࠂͷޮՌΛଌఆ͢ΔͨΊͷΈ ‣ ΫϦοΫίϯόʔδϣϯ ॳճىಈ ߪೖ ՝ۚͳͲ ͷ ൃੜ࣌ʹ֘ΠϕϯτΛσόΠε্Ͱه͢Δ
‣ ΫϦοΫͱίϯόʔδϣϯͷใσόΠεͷ෦Ͱ݁ͼ͚ͭΒΕΔ ‣ ूܭ͢Δ୯ҐཻͷҟͳΔ &WFOUMFWFMSFQPSUTͱ"HHSFHBUBCMFSFQPSUTͷ छྨͷϨϙʔτ͕͋Δ -
"UUSJCVUJPO3FQPSUJOHᶇ ετΞͷදࣔᶄ ‣ <ࠂωοτϫʔΫ> ϦμΠϨΫτ͢Δ ‣ <1MBZ4UPSF> ֘ΞϓϦͷϖʔδ͕දࣔ͞ΕΔ ˞"UUSJCVUJPO3FQPSUJOHΛར༻͢Δ্Ͱ ɹඞਢͰͳ͍ͨΊলུ͠·͕ͨ͠
ɹ࣮ࡍʹࠓޙΞϓϦܭଌπʔϧΛ ɹܦ༝͢Δέʔε͕ଟ͍ͱࢥΘΕ·͢ ࠂωοτϫʔΫ -
"UUSJCVUJPO3FQPSUJOHᶈ Ռͷه ‣ <Ϣʔβʔ> ࠂܦ༝ͰΠϯετʔϧͨ͠ ΞϓϦΛىಈ͢Δ ‣ <ࠂओͷΞϓϦ> "UUSJCVUJPO3FQPSUJOH"1*Ͱ ίϯόʔδϣϯͷใΛ
σόΠεʹอଘ͢Δ ࠂωοτϫʔΫ ΞϓϦΛ ىಈ -
ैདྷͷ4%,ར༻ํ๏ ‣ ΞϓϦ͔Β4%,Λݺͼग़͢ ‣ ΠϯελϯεΛੜ͢Δ ‣ TUBUJDϝιουΛݺͼग़͢ ‣ ݺͼग़͞Εͨ4%, ΞϓϦͱಉҰϓϩηεͰಈ࡞͢Δ
˞ը૾IUUQTEFWFMPQFSTHPPHMFDPNQSJWBDZTBOECPYSFMFWBODFTELSVOUJNFΑΓ -
Կ͕ͳͷ͔ʁ ‣ ηΩϡϦςΟ໘ͷ ‣ 4%,ݺͼग़͠ݩͷΞϓϦ ͷҰ෦ ͱͯ͠ ৼΔ͏͜ͱ͕Ͱ͖ͯ͠·͏ ‣ ҆ఆੑͷ
‣ ΞϓϦͱ4%,͕ಉҰϓϩηε্Ͱಈ࡞͍ͯ͠ΔͨΊ 4%,ͷڍಈ͕ΞϓϦʹӨڹΛٴ΅͢͜ͱ͕͋Δ ͋Δ͍ͦͷٯ -
ηΩϡϦςΟ໘ͷ ‣ ΞϓϦͱ4%,ͰϝϞϦۭؒΛڞ༗͍ͯ͠ΔͨΊ ཧ্ ΞϓϦ͕ѻ͍ͬͯΔσʔλΛ4%,͔ΒࢀরͰ͖Δ ‣ ΞϓϦઐ༻ͷετϨʔδྖҬʹ4%,͔ΒΞΫηεͰ͖Δ ‣ 4%,͕ΞϓϦͱಉͷݖݶͰಈ࡞͢Δ ‣
Ϣʔβʔͷڐ͕ඞཁͱͳΔݖݶΛཁ͢Δૢ࡞Ͱ ΞϓϦ͕ڐΛಘΕ4%,͔Βಉ༷ʹ࣮ߦͰ͖Δ -
4%,3VOUJNFͰͷ 4%,ར༻ํ๏ ‣ ΞϓϦͱผͷϓϩηεͰ 4%,͕ಈ࡞͢Δ ‣ ಈ࡞ͷࡍʹ͋Δఔͷ ੍Λड͚Δ ‣ ΞϓϦΠϯλʔϑΣΠεΛ
հͯ͠4%,Λૢ࡞͢Δ ˞ը૾IUUQTEFWFMPQFSTHPPHMFDPNQSJWBDZTBOECPYSFMFWBODFTELSVOUJNFΑΓ -
ΞϓϦͱ4%,ͷΓͱΓ ‣ 4EL4BOECPY.BOBHFSMPBE4EL ‣ 4%,ΛΞϓϦͱผͷαϯυϘοΫεͰϩʔυͯ͠ 4%,͕ఏڙ͍ͯ͠Δ"1*Λ௨ͯ͠ૢ࡞͢Δ ‣ 4EL4BOECPY.BOBHFSSFRVFTU4VSGBDF1BDLBHF
‣ 4%,͕ࠂΛඳըͨ͠4VSGBDF1BDLBHFΛड͚औͬͯ ΞϓϦͰఆٛͨ͠4VSGBDF7JFXͷDIJMEͱͯ͠ઃఆ͢Δ -
ΞϓϦͱ4%,ͷΓͱΓ ‣ 4EL4BOECPY.BOBHFSMPBE4EL ‣ 4%,ΛΞϓϦͱผͷαϯυϘοΫεͰϩʔυͯ͠ 4%,͕ఏڙ͍ͯ͠Δ"1*Λ௨ͯ͠ૢ࡞͢Δ ‣ 4EL4BOECPY.BOBHFSSFRVFTU4VSGBDF1BDLBHF
‣ 4%,͕ࠂΛඳըͨ͠4VSGBDF1BDLBHFΛड͚औͬͯ ΞϓϦͰఆٛͨ͠4VSGBDF7JFXͷDIJMEͱͯ͠ઃఆ͢Δ -
MPBE4EL ࣮αϯϓϧᶃ // SdkSandboxManagerを取得する val manager = applicationContext.getSystemService( SdkSandboxManager::class.java
) // SDKの読み込みを要求する manager.loadSdk( "com.example.adnetwork", Bundle(), { obj: Runnable -> obj.run() }, object : OutcomeReceiver<SandboxedSdk, LoadSdkException> { override fun onResult(sandboxedSdk: SandboxedSdk) { mSandboxedSdk = sandboxedSdk } override fun onError(error: LoadSdkException) {} } ) // SDKを呼び出す // (※IAdNetworkSdkがAIDLで定義されているものとする) val binder: IBinder? = mSandboxedSdk.getInterface() val adNetworkSdk = IAdNetworkSdk.Stub.asInterface(binder) adNetworkSdk.showAd() ‣ HFU4ZTUFN4FSWJDF Ͱ 4EL4BOECPY.BOBHFSΛ औಘ͢Δ -
MPBE4EL ࣮αϯϓϧᶄ // SdkSandboxManagerを取得する val manager = applicationContext.getSystemService( SdkSandboxManager::class.java
) // SDKの読み込みを要求する manager.loadSdk( "com.example.adnetwork", Bundle(), { obj: Runnable -> obj.run() }, object : OutcomeReceiver<SandboxedSdk, LoadSdkException> { override fun onResult(sandboxedSdk: SandboxedSdk) { mSandboxedSdk = sandboxedSdk } override fun onError(error: LoadSdkException) {} } ) // SDKを呼び出す // (※IAdNetworkSdkがAIDLで定義されているものとする) val binder: IBinder? = mSandboxedSdk.getInterface() val adNetworkSdk = IAdNetworkSdk.Stub.asInterface(binder) adNetworkSdk.showAd() ‣ MPBE4EL Λݺͼग़͢ ‣ ҾͷίʔϧόοΫͰ 4BOECPYFE4ELΛ ड͚औΔ͜ͱ͕Ͱ͖Δ -
MPBE4EL ࣮αϯϓϧᶅ // SdkSandboxManagerを取得する val manager = applicationContext.getSystemService( SdkSandboxManager::class.java
) // SDKの読み込みを要求する manager.loadSdk( "com.example.adnetwork", Bundle(), { obj: Runnable -> obj.run() }, object : OutcomeReceiver<SandboxedSdk, LoadSdkException> { override fun onResult(sandboxedSdk: SandboxedSdk) { mSandboxedSdk = sandboxedSdk } override fun onError(error: LoadSdkException) {} } ) // SDKを呼び出す // (※IAdNetworkSdkがAIDLで定義されているものとする) val binder: IBinder? = mSandboxedSdk.getInterface() val adNetworkSdk = IAdNetworkSdk.Stub.asInterface(binder) adNetworkSdk.showAd() ‣ 4BOECPYFE4EL͔Β *#JOEFSΛऔಘ͢Δ ‣ औಘͨ͠*#JOEFSΛ 4%,ͷΠϯλʔϑΣΠεʹ ม͔ͯ͠Βૢ࡞͢Δ -
ΞϓϦͱ4%,ͷΓͱΓ ‣ 4EL4BOECPY.BOBHFSMPBE4EL ‣ 4%,ΛΞϓϦͱผͷαϯυϘοΫεͰϩʔυͯ͠ 4%,͕ఏڙ͍ͯ͠Δ"1*Λ௨ͯ͠ૢ࡞͢Δ ‣ 4EL4BOECPY.BOBHFSSFRVFTU4VSGBDF1BDLBHF
‣ 4%,͕ࠂΛඳըͨ͠4VSGBDF1BDLBHFΛड͚औͬͯ ΞϓϦͰఆٛͨ͠4VSGBDF7JFXͷDIJMEͱͯ͠ઃఆ͢Δ -
4VSGBDF1BDLBHF ࣮αϯϓϧᶃ // SdkSandboxManagerを取得する val manager = applicationContext.getSystemService( SdkSandboxManager::class.java )
// SurfacePackageを要求する Handler(Looper.getMainLooper()).post { val params = Bundle() params.putInt(EXTRA_WIDTH_IN_PIXELS, mClientView.getWidth()) params.putInt(EXTRA_HEIGHT_IN_PIXELS, mClientView.getHeight()) params.putInt(EXTRA_DISPLAY_ID, getDisplay()?.getDisplayId()!!) params.putBinder(EXTRA_HOST_TOKEN, mClientView.getHostToken()) manager.requestSurfacePackage( "com.example.adnetwork", params, { obj: Runnable -> obj.run() }, object : OutcomeReceiver<Bundle?, RequestSurfacePackageException?> { override fun onResult(response: Bundle) { Handler(Looper.getMainLooper()).post { val surfacePackage: SurfacePackage? = response.getParcelable( EXTRA_SURFACE_PACKAGE, SurfacePackage::class.java) mClientView.setChildSurfacePackage(surfacePackage!!) mClientView.setVisibility(View.VISIBLE) } } override fun onError(error: RequestSurfacePackageException) {} } ) } ‣ HFU4ZTUFN4FSWJDF Ͱ 4EL4BOECPY.BOBHFSΛ औಘ͢Δ -
4VSGBDF1BDLBHF ࣮αϯϓϧᶄ // SdkSandboxManagerを取得する val manager = applicationContext.getSystemService( SdkSandboxManager::class.java )
// SurfacePackageを要求する Handler(Looper.getMainLooper()).post { val params = Bundle() params.putInt(EXTRA_WIDTH_IN_PIXELS, mClientView.getWidth()) params.putInt(EXTRA_HEIGHT_IN_PIXELS, mClientView.getHeight()) params.putInt(EXTRA_DISPLAY_ID, getDisplay()?.getDisplayId()!!) params.putBinder(EXTRA_HOST_TOKEN, mClientView.getHostToken()) manager.requestSurfacePackage( "com.example.adnetwork", params, { obj: Runnable -> obj.run() }, object : OutcomeReceiver<Bundle?, RequestSurfacePackageException?> { override fun onResult(response: Bundle) { Handler(Looper.getMainLooper()).post { val surfacePackage: SurfacePackage? = response.getParcelable( EXTRA_SURFACE_PACKAGE, SurfacePackage::class.java) mClientView.setChildSurfacePackage(surfacePackage!!) mClientView.setVisibility(View.VISIBLE) } } override fun onError(error: RequestSurfacePackageException) {} } ) } ‣ SFRVFTU4VSGBDF1BDLBHF ʹ 4VSGBDF7JFXͷαΠζ *% )PTU5PLFOΛ͢ -
4VSGBDF1BDLBHF ࣮αϯϓϧᶅ // SdkSandboxManagerを取得する val manager = applicationContext.getSystemService( SdkSandboxManager::class.java )
// SurfacePackageを要求する Handler(Looper.getMainLooper()).post { val params = Bundle() params.putInt(EXTRA_WIDTH_IN_PIXELS, mClientView.getWidth()) params.putInt(EXTRA_HEIGHT_IN_PIXELS, mClientView.getHeight()) params.putInt(EXTRA_DISPLAY_ID, getDisplay()?.getDisplayId()!!) params.putBinder(EXTRA_HOST_TOKEN, mClientView.getHostToken()) manager.requestSurfacePackage( "com.example.adnetwork", params, { obj: Runnable -> obj.run() }, object : OutcomeReceiver<Bundle?, RequestSurfacePackageException?> { override fun onResult(response: Bundle) { Handler(Looper.getMainLooper()).post { val surfacePackage: SurfacePackage? = response.getParcelable( EXTRA_SURFACE_PACKAGE, SurfacePackage::class.java) mClientView.setChildSurfacePackage(surfacePackage!!) mClientView.setVisibility(View.VISIBLE) } } override fun onError(error: RequestSurfacePackageException) {} } ) } ‣ SFRVFTU4VSGBDF1BDLBHF ͷ ίʔϧόοΫͰ 4VSGBDF1BDLBHFΛड͚औΓ ΞϓϦͷ4VSGBDF7JFXͷ DIJMEͱͯ͠ઃఆ͢Δ -
4%,3VOUJNFͰͷ ৴Ϟσϧ ‣ 4%,ετΞͰެ։͞ΕΔ ‣ ΞϓϦࢀর͢Δ4%,Λ ࢦఆ্ͨ͠ͰετΞʹެ։͞ΕΔ ‣ ϢʔβʔετΞ͔Β ΞϓϦͱ4%,ΛΠϯετʔϧ͢Δ
˞ը૾IUUQTEFWFMPQFSTHPPHMFDPNQSJWBDZTBOECPYSFMFWBODFTELSVOUJNFΑΓ -
5PQJDT͕Ҿ͖ى͜͢มԽ ‣ ϢʔβʔͷϓϥΠόγʔอޢ͕ڧԽ͞ΕΔ ‣ ࠂ*%ͷґଘ͕ͳ͘ͳΔ ‣ σʔλΛσόΠεͷ෦Ͱॲཧ͢Δ ‣ σʔλͷϢʔβʔίϯτϩʔϧ͕ڧԽ͞ΕΔ ‣
τϐοΫϢʔβʔʹΑΔ֬ೝ আ͕Մೳ ‣ ࠂઓུ͕τϐοΫΛલఏͱͨ͠ͷʹมΘΔ -
1SPUFDUFE"VEJFODF"1*͕Ҿ͖ى͜͢มԽ ‣ ϢʔβʔͷϓϥΠόγʔอޢ͕ڧԽ͞ΕΔ ‣ ࠂ*%ͷґଘ͕ͳ͘ͳΔ ‣ σʔλΛσόΠεͷ෦Ͱॲཧ͢Δ ‣ ࠂબఆͷҰ෦͕σόΠεͰ࣮ߦ͞ΕΔ ‣
ࠂઓུ͕1SPUFDUFE"VEJFODF"1*Λલఏͱͨ͠ͷʹมΘΔ -
"UUSJCVUJPO3FQPSUJOH͕Ҿ͖ى͜͢มԽ ‣ ϢʔβʔͷϓϥΠόγʔอޢ͕ڧԽ͞ΕΔ ‣ ࠂ*%ͷґଘ͕ͳ͘ͳΔ ‣ σʔλΛσόΠεͷ෦Ͱॲཧ͢Δ ‣ σʔλͷ҆શੑ্͕͢Δ ‣
ूܭσόΠεͷ෦ͱ"HHSFHBUJPO4FSWJDFͰ͓͜ͳΘΕΔ ‣ ࠂઓུ͕"UUSJCVUJPO3FQPSUJOHΛલఏͱͨ͠ͷʹมΘΔ -
ηΩϡϦςΟͷڧԽ ‣ ΞϓϦͱ4%,͕͞ΕͨڥͰಈ࡞͢Δ ‣ 4%,͔ΒΞϓϦͷσʔλʹΞΫηεͰ͖ͳ͍ ‣ 4%,ѱҙͷ͋Δߦಈ͕औΓͮΒ͍ڥͰಈ࡞͢Δ ‣ ΞϓϦͱ4%,͕ผͷݖݶͰಈ࡞͢Δ
‣ Ϣʔβʔ͕ҙਤ͍ͯ͠ͳ͍ 4%,ʹڐՄͨͭ͠Γ͕ͳ͍ ػೳͷΞΫηεΛ͙͜ͱ͕Ͱ͖Δ -
։ൃϓϩηεͷޮԽ ‣ ΞϓϦ։ൃऀʹΑΔ4%,ͷόʔδϣϯཧͷίετ͕ݮ͞ΕΔ ‣ 4%,ͷΞοϓσʔτΛ͓͜ͳ͏ख͕ؒܰݮ͞ΕΔ ‣ ޓੑΛҡ࣋͢ΔͨΊͷ࡞ۀ͕ݮ͞ΕΔ ‣ 4%,ͷΠϯλʔϑΣΠε͕
͋Δఔ ౷Ұ͞ΕΔ ‣ ෳͷ4%,Λಉ࣌ʹར༻͢Δࡍʹޮతͳ࣮͕Ͱ͖Δ -
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ ‣ ࢀߟࢿྉ ‣ "OESPJE͚ の ϓϥΠόγʔαϯυϘοΫε ‣ IUUQTQSJWBDZTBOECPYDPNJOUMKB@KQBOESPJE ‣
ϓϥΠόγʔαϯυϘοΫεͷಈըϥΠϒϥϦ ‣ IUUQTEFWFMPQFSTHPPHMFDPNQSJWBDZTBOECPYSFTPVSDFTWJEFPT IMKB ‣ 4%,3VOUJNFBOE1SJWBDZ1SFTFSWJOH"1*T3FQPTJUPSZ ‣ IUUQTHJUIVCDPNBOESPJEQSJWBDZTBOECPYTBNQMFT