為什麼從後台再次進入知乎都要重載一次啟動界面?
系
統MIUI9開發版,系統內存優化級別為禁用
先說結果:
不是因為殺進程、殺後台的原因造成的,這是知乎的業務邏輯。
知乎就是為了顯示更多次數的廣告,故意設計成這個樣子的。
你啟動知乎的時候如果沒顯示廣告,那麼等你切到後台再回來就顯示一次。
你啟動知乎的時候如果顯示廣告了,那麼你切到後台了不殺死知乎,那麼他就不顯示。
---------------------------500+更新,華麗麗的分割線---------------------------
鑒於好多朋友問我具體的情況,就不一一說明了
我逆向的版本是v5.4.1,具體細節過程其實已經寫成博客啦,
歡迎來參觀,有深入的問題也希望和大家一起探討
Android逆向之路---為什麼從後台切換回app又顯示廣告了
----------------------------------華麗麗的分割線---------------------------------------
----------------------------------程序員可以往下讀------------------------------------
解釋原因:
直接逆向知乎app開干!
通過搜索「發現更大的世界」等搜索字元串方法,最後我發現那個廣告界面名稱叫「LaunchAdFragment」。那麼究竟哪裡載入了這個討厭的廣告界面呢,肯定和當前的Activity棧頂的頁面有關。
通過以下指令查看
adb shell dumpsys activity
結果如下,重點在這裡:
Run #4: ActivityRecord{bc733c u0 com.zhihu.android/.app.ui.activity.MainActivity t339}
緊接著我就看MainActivity的onResume方法,
發現了如下邏輯(看不懂的可以看下面java代碼片段):
.line 533
:cond_3
invoke-static {}, Lcom/zhihu/android/app/util/LaunchAdHelper;-&>getInstance()Lcom/zhihu/android/app/util/LaunchAdHelper;
move-result-object v5
invoke-virtual {v5}, Lcom/zhihu/android/app/util/LaunchAdHelper;-&>isShowLaunchAd()Z
move-result v5
if-eqz v5, :cond_4
.line 535
const-string v5, "input_method"
invoke-virtual {p0, v5}, Lcom/zhihu/android/app/ui/activity/MainActivity;-&>getSystemService(Ljava/lang/String;)Ljava/lang/Object;
move-result-object v0
check-cast v0, Landroid/view/inputmethod/InputMethodManager;
.line 536
.local v0, "imm":Landroid/view/inputmethod/InputMethodManager;
invoke-virtual {v0}, Landroid/view/inputmethod/InputMethodManager;-&>isActive()Z
move-result v5
if-nez v5, :cond_4
.line 538
invoke-static {}, Lcom/zhihu/android/app/ui/fragment/LaunchAdFragment;-&>buildIntent()Lcom/zhihu/android/app/util/ZHIntent;
move-result-object v5
invoke-virtual {p0, v5}, Lcom/zhihu/android/app/ui/activity/MainActivity;-&>startFragment(Lcom/zhihu/android/app/util/ZHIntent;)V
可能這個smali不好理解,我轉換成java代碼大致看下,:
void onResume() {
// 判斷是否需要載入廣告,
boolean showAd = LaunchAdHelper-&>getInstance().isShowLaunchAd();
if(!showAd) return ;
//判斷系統鍵盤是否是active的
InputMethodManager imm = ((InputMethodManager)getSystemService("input_method"));
if(imm.isActive()) return ;
//打開廣告頁面
Intent intent = LaunchAdFragment.buildIntent();
startFragment(intent);
}
那麼問題來了"LaunchAdHelper-&>getInstance().isShowLaunchAd()"的邏輯又是如何的呢。
結果如下,(看不懂的自動往下看轉Java):
.method public isShowLaunchAd()Z
.locals 2
.prologue
const/4 v0, 0x0
.line 105
iget-boolean v1, p0, Lcom/zhihu/android/app/util/LaunchAdHelper;-&>mIsAllowShowLaunchAd:Z
if-eqz v1, :cond_0
.line 106
iput-boolean v0, p0, Lcom/zhihu/android/app/util/LaunchAdHelper;-&>mIsAllowShowLaunchAd:Z
.line 107
const/4 v0, 0x1
.line 110
:cond_0
return v0
.end method
轉換為Java
public boolean isShowLaunchAd() {
if(!mIsAllowShowLaunchAd) {
return false;
}
mIsAllowShowLaunchAd = false;
return true;
}
上面代碼大致意思我就不解釋了,相信能看到這裡的讀者肯定是個程序員吧。
那麼一問又來了這個成員變數"mIsAllowShowLaunchAd"又是什麼時候被設置的呢。
往後就不答了,大致說下結果,在MainActivity的onStart方法裡面調用了LaunchAdHelper的onStart方法,隨後在這裡面初始化將mIsAllowShowLaunchAd 設置成true的。
關於我:
我的小站:MartinHan的小站
我的博客:hanhan12312的專欄 - CSDN博客
更新一波
之前我做應用是在google play上上線,用戶群體主要是日本用戶
那個應用在重新切回來會有個0.5s以內的黑幕,PM認為體驗不好,然後我就加了個只帶logo的閃屏
你問結果?
用戶一片罵聲,GP後台各種用戶反對,說我們腦殘加這麼個東西
然後在下個版本中revert了
我最後說了句,老子不想伺候這幫日本大爺了,艹,敬酒不吃吃罰酒。
以下是原答案:
利益相關,互相網app開發從業者
這種界面我們的說法叫開屏頁或者splash
後台並沒有關閉
加入的原因一般有兩個
1.就是讓你看廣告的,有收入,幹嘛不加。
2.為了防止可能出現的短暫黑屏,或者是ANR
首先,我的知乎客戶端並沒有出現你所說的現象。可能是版本問題,或者是系統設置的緣故。
不過你所說的現象確實在很多其它 app 中出現,而且這個「功能」理論上可以實現。
目的很可能是:為了更多次數的播放廣告。
這往往是應用程序刻意設計出來的特性,以前用戶只要程序不退,再進程序就能不用看進入界面。現在終於能在後台切回來的時候也能逼用戶看廣告了,產品經理露出了由衷的微笑。
假設只有殺掉進程後才重載啟動界面的話,
再假設每天只殺掉進程一次。
再假設看一次啟動界面(也就是廣告1毛錢)
那麼,之前是每天1毛,
現在呢,假設平常每天打開5次(我每天能打開10幾次。。。)
那麼變成了5毛,翻了5倍。。。
假如知乎日活用戶是100萬的話。。。
那麼。。。懶得算了
逃(
這麼明顯怎麼還有人以為是系統問題 ... 僅僅是知乎想讓你重複看廣告而已。
知乎的廣告越做越過頭了,即使不點擊也會強行跳轉鏈接,知乎藥丸啊。
求贊助,我來開發第三方知乎客戶端拯救下知乎,嘻嘻。
米6穩定版miui9。
qq,微信,微博,鳳凰新聞,瀏覽器,網易雲音樂,淘寶,京東以及各種莫名其妙的app都不會有任何載入的感覺。
只有知乎會載入?有個白色屏閃過去,但並沒有廣告,只是在首頁時會把首頁刷新,app的問題?
又測試了會。
後台10分鐘以後,淘寶,網易的也會載入,應該是沒殺後台的,我單開一個應用也會載入。
qq,微信常駐,怎麼弄都是秒開。
開了30多個應用,打開後馬上切換,只有知乎會載入。
網路遊戲可能會出現網路重連。只是想多放廣告吧……iOS也是
我也是米6 MIUI9,我確定這不是重新啟動一次,而是在從後台切回來的時候重新顯示一遍廣告。
不僅僅是重放一遍廣告,連首頁都重載了,之前想看的內容一下全沒了 ,給你換了一波。
知乎檢測到你把他放後台了,就再讓你看一遍廣告唄。
就是這麼不講道理(不要Face)
Play版保平安
一加3T 官方系統 7.1.1存在同樣現象。
首先可以確認應用進程沒有被殺,那麼按照系統默認行為不會這樣。
因此是知乎客戶端的邏輯,推測是為了提高閃屏廣告的曝光率。
Android.
出現了這個問題,沒有仔細找原因,但是可以說一下現象.我看沒人提到.
瀏覽回答時,切後台.
切回來,閃屏廣告(現載入的,不是預載入的,所以有時候要等很久),廣告結束,繼續仍是答案頁面.
這就很過分了,程序根本就沒有被殺,就TM是主動展示廣告的,這麼降低體驗的事兒也做得出來,我回個消息切回來就要看廣告!
淘寶也是一樣的。 實際上APP並沒有被後台清掉,但是你切回來的時候會讓你再看一遍廣告...表示很難受
知乎要運營成本的話,在live或者文章打賞可以抽成,在首頁中插入有意思的廣告我也沒有覺得不可,感興趣領域的廣告我也會去看,尚且知乎現在還有電子書商店了。然而在廣告問題上,知乎不是視頻軟體,知乎不需要購買版權等大頭支出,知乎的內容都是靠各位去提供與運營的,知乎的每個用戶都是知乎價值的提供者同時消費者。如果知乎不停地往廣告坑跳,只會和貼吧一樣,有下一個類似的app替代,知乎即可卸載。 @知乎小管家
知乎:最煩你們這幫不給錢還一堆屁事的。
廣告而已
假裝重載,其實一直好好的掛在後台呢
知乎:說起來你可能不信,是網易雲先動手的.
應該是知乎的問題,不單單是MIUI9。我的氫os也有這樣的情況。
ip6s,ios11.1也一樣。每次很煩。
不就是為了讓你看廣告么,iOS上知乎也是這樣的。
推薦閱讀:
※為什麼不同品牌的手機用戶總是互相撕逼?
※為什麼小米Global官網MIX系列是用"ceramic"來指代陶瓷材料而不是「china」?
※為什麼批評華為手機的大多都是小米的愛好者?
※小米note2作為小米的旗艦手機,為什麼配置這麼差的屏幕和攝像頭?
※紅米note3手機撲街,這次選米6還是榮耀9?