為什麼從後台再次進入知乎都要重載一次啟動界面?

統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?

TAG:手機 | Android手機 | 米柚MIUI | Android | 小米手機 |