今天從源碼角度分析一下mopub,
以下內(nèi)容基于Mopub 5.12.0 Android源碼,github上可以下載到斤吐,通過閱讀源碼,理清邏輯厨喂,找到自己想要的答案和措。
1.初始化入口
MoPub.initializeSdk(mContext, sdkConfiguration, initSdkListener());
Mopub.java類第175行initializeSdk方法;
作用蜕煌,初始化mopub SDK派阱;在請求激勵廣告或者bidding前調(diào)用該方法,這個方法將對自定義adpater調(diào)用任意次數(shù)幌绍,但是SDK自己僅僅初始化一次颁褂。
第178行~184行,檢測context傀广,sdkConfiguration是否為空颁独,打印log
第185行~190行,判斷Application info是否為空伪冰,然后打印日志
第191行~195行誓酒,初始化激勵視頻 initializeRewardedVideo(activity, sdkConfiguration);
Mopub.java類第357行~375行,是initializeRewardedVideo
第358行~360行贮聂,檢測activity靠柑,sdkConfiguration是否為空
第362行~366行,通過Reflection.MethodBuilder
new Reflection.MethodBuilder Reflection.java類中吓懈,第34行~45行歼冰;確定反射類名,initializeRewardedVideo setStatic("com.mopub.mobileads.MoPubRewardedVideos"), 設(shè)定反射修飾符為static setAccessible 設(shè)定mIsAccessible耻警,設(shè)定訪問權(quán)限
addParam隔嫡,傳入當(dāng)前activity
addParam甸怕,傳入當(dāng)前sdkConfiguration
execute方法,98行~118行腮恩;獲取class名梢杭;方法名,添加參數(shù)秸滴;判斷是否Accessible武契,是否Static;然后執(zhí)行method.invoke(如何執(zhí)行sdkConfiguration傳入進(jìn)來的參數(shù))
第367行~375行荡含,捕獲反射的異常
第196行~200行咒唆,如果mopub已經(jīng)初始化完畢,向外拋initializationFinished回調(diào)内颗,
第201行~205行钧排,如果mopub正在初始化敦腔,直接return掉
第206行~210行均澳,判斷當(dāng)前線程是否是主線程,mopub只能在主線程初始化
第211行~215行符衔;設(shè)置正在初始化的標(biāo)記位為true找前;確保當(dāng)前的請求在主線程
第216行~221行,定義兩個final sdk初始化狀態(tài)的監(jiān)聽類
第389行~407行判族,靜態(tài)類InternalSdkInitializationListener躺盛,主要作用,當(dāng)收到sdk初始化完成的回調(diào)形帮,向上拋槽惫,sdk初始化完成的回調(diào)。就是初始化mopubsdk的第3個參數(shù)辩撑。
類CompositeSdkInitializationListener界斜,的作用是,將初始化的回調(diào)合冀,合并,一次發(fā)送君躺。(這個類寫的很巧妙峭判,可以學(xué)習(xí)下)
定義了一個mTimes參數(shù)棕叫,當(dāng)收到一次回調(diào),這個次數(shù)就減1俺泣,當(dāng)mTimes小于等于0時疗认,就觸發(fā)向外拋初始化成功的回調(diào)急侥。
@Override
public void onInitializationFinished() {
mTimes--;
if (mTimes <= 0) {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
if (mSdkInitializationListener != null) {
mSdkInitializationListener.onInitializationFinished();
mSdkInitializationListener = null;
}
}
});
}
}
第222行~第225行,實例PersonalInfoManager類坏怪,處理用戶個人信息,如GDPR铝宵,等
第226行,單例獲取ClientMetadata华畏,用戶手機(jī)鹏秋,網(wǎng)絡(luò)等相關(guān)信息;單例用的雙重校驗鎖 DCL
第227行~第233行亡笑,實例化AdapterConfigurationManager侣夷,通過異步線程獲得bidding相關(guān)數(shù)據(jù)仑乌,并存儲到內(nèi)存中,供后面查詢調(diào)用晰甚。
2.Mopub加載激勵視頻入口
MopubRewardedVideos.loadRewardedVideo(rewardedId, new MopubRewardedVideoManager.RequestParameters(null,null));
MopubRewardedVideos.class
第47-52行,loadRewardedVideo厕九,
49行,檢查傳進(jìn)來的參數(shù)是否為空扁远,Preconditions.checkNotNull(adUnitId);
50行,加載激勵視頻畅买,MopubRewardedVideoManager.loadVideo(adUnitId, requestParameters, mediationSettings);
MopubRewardedVideoManager.class
第176-209行,加載激勵視頻
178-180行皮获,檢查單例是否為空,空就報錯
181-184行购公,如果當(dāng)前播放廣告的id,和傳進(jìn)來的廣告id相同宏浩,那么就打印log靠瞎,不再向下執(zhí)行
184-194行比庄,如果當(dāng)前緩存的廣告id和傳進(jìn)來的廣告id相同,那么就對外發(fā)送廣告已加載的回調(diào)佳窑,不再向下執(zhí)行
195-209行,加載廣告
206行净神,加載激勵廣告溉委,loadVideo(adUnitId,(String)urlGenerator.generateUrlString(Constants.HOST), (MoPubErrorCode)null)
211-217行鹃唯,加載激勵視頻瓣喊,sInstance.fetchAd(adUnitId, adUrlString, errorCode)
219-226行,加載激勵視頻藻三,判斷當(dāng)前id是否正在加載;rewardedAdsLoaders.loadNextAd(mContext, adUnitId, adUrlString, errorCode);
RewardedAdsLoaders.class
32-43行趴酣,loadNextAd,
37-40行岖寞,判斷adLoader是否為空柜蜈,adLoader是否有已經(jīng)緩存的廣告,空或者無廣告淑履,就執(zhí)行mAdUnitToAdLoader.put(adUnitId, adLoader);
42行隶垮,adloader.loadNextAd(errorCode);執(zhí)行加載的邏輯
AdLoader.java 廣告加載核心類
133-219行秘噪,loadNextAd方法,waterfall的邏輯主要是在loadNextAd方法中實現(xiàn)的指煎,廣告是異步加載的,廣告可能來自內(nèi)部緩存或者從服務(wù)端下載至壤。請確保調(diào)用加載廣告前,調(diào)用hasMoreAds方法
175行黎棠,fetchAd(mMultiAdRequest, mContext.get());//第一次請求
260-287行晋渺,通過網(wǎng)絡(luò)庫請求
3.加載核心位置
AdLoader.java 第175行fetchAd(mMultiAdRequest, mContext.get());//first request 第一次請求
268行脓斩,fetchAd()方法 283-286行,RequestQueue request =Networking.getRequestQueue(context); 通過Volley進(jìn)行請求
Networking.java 98行 requestQueue = new MoPubRequestQueue(cache, network);
MopubRequestQueue.java 58行随静,addDelayedRequest(@NonNull Request<?> request, int delayMs)
addDelayedRequest(request, new DelayedRequestHelper(request, delayMs));
RequestManager.java 60行, makeRequest(@NonNull T requestFactory, @NonNull BackoffPolicy backoffPolicy)