天天看點

關于app提示專為舊版Android打造的有關測試

因為經常進自己網站左康右康有沒有人通路(極度自戀),老是去翻浏覽器書簽很麻煩,最近就想着把網站打包一個app,雖然我這破站也沒什麼可看的,不過至少打包後加點快捷功能就看不出來我一直在劃水了

0x01 正文

說是做個app,但是我又完全不懂安卓,這可怎麼辦呢。

正好想到之前大名鼎鼎的Funsion App,可以快捷的将網站做成app,于是就下載下傳來試了一下,調了半個小時就做好了(也就改改圖示之類的,也沒什麼技術含量,就不獻醜了),說起來這應用确實簡單,沒有一點安卓程式設計基礎的都能用,這裡向和我一樣的小白朋友們安利一波(住口,我沒恰爛錢!)

關于app提示專為舊版Android打造的有關測試

雖然這軟體确實很友善,不過随之而來也有一些問題,預覽的結果還挺簡潔美觀,但是打包安裝好後測試一波,就彈出了下面的提示

關于app提示專為舊版Android打造的有關測試

雖說沒有什麼大問題,但是,一來彈個提示出來會讓大部分人不爽,二來這不還是看的出來我在劃水嗎?得想辦法解決一下。

一般這種情況,要麼是用了低版本安卓專用的參數,要麼就是應用SDK版本配置過低,上網查了一下,原因大緻是因為從Android9開始,作業系統對minSdk進行了限制。

具體原因分析:

PS:引用自大佬文章https://www.jianshu.com/p/9dc825ac1c58

安卓應用啟動,startActivity時,流程會執行到realStartActivityLocked方法,代碼位于ActivityStackSupervisor.java

realStartActivityLocked方法中,會調用AppWarnings.java的onStartActivity方法,如下:

final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app, boolean andResume, boolean checkConfig) throws RemoteException {
    try {
        // ...
        mService.getAppWarningsLocked().onStartActivity(r);
        // ...
    } catch (RemoteException e) {
        // ...
    }
}           

複制

onStartActivity方法實作:

/**
   * Called when an activity is being started.
   *
   * @param r record for the activity being started
   */
public void onStartActivity(ActivityRecord r) {
    showUnsupportedCompileSdkDialogIfNeeded(r);
    showUnsupportedDisplaySizeDialogIfNeeded(r);
    showDeprecatedTargetDialogIfNeeded(r);
}           

複制

其中第三個函數showDeprecatedTargetDialogIfNeeded重點分析:

/**
   * Shows the "deprecated target sdk" warning, if necessary.
   *
   * @param r activity record for which the warning may be displayed
   */
public void showDeprecatedTargetDialogIfNeeded(ActivityRecord r) {
    if (r.appInfo.targetSdkVersion < Build.VERSION.MIN_SUPPORTED_TARGET_SDK_INT) {
        mUiHandler.showDeprecatedTargetDialog(r);
    }
}           

複制

重點:這裡出現一個判斷方法,正是其決定是否彈窗,判斷條件中Build.VERSION.MIN_SUPPORTED_TARGET_SDK_INT,如下:

public static final int MIN_SUPPORTED_TARGET_SDK_INT = SystemProperties.getInt(
                "ro.build.version.min_supported_target_sdk", 0);           

複制

此屬性預設值,一般是17。也就是說:

Android P機以上機型上,當應用的targetSdk版本低于17時,應用啟動時會彈窗“此應用專為舊版Android打造,是以可能無法正常運作。請嘗試檢查更新或與開發者聯系”。

懂安卓程式設計或者正在學的同學可以分析一下,反正我是看不懂的(菜)。。。

原理搞懂了,現在來看解決方法

這裡需要提到AndroidManifest.xml 裡 targetSdkVersion版本:

原文及相關釋義引用自大佬文章,自行檢視:https://blog.csdn.net/qq_23062979/article/details/81294550

總結:

targetSdkVersion保證的是api的一緻性。

是以一般minSdkVersion <targetSdkVersion<= compileSdkVersion

不随意更改targetSdkVersion,更改targetSdkVersion必須做好相容。

綜上所述,解決方法有二:

方法一:app修改 android:targetSdkVersion 值為合适值

方法二:降低ro.build.version.min_supported_target_sdk 設定值

這裡我用的第一種方法,首先檢視我自己手機的Android API

關于app提示專為舊版Android打造的有關測試

然後在手機上用MT管理器反編譯,更改AndroidManifest.xml中的targetSdkVersion值為29

關于app提示專為舊版Android打造的有關測試

提示是沒了,然後報錯了。。。

關于app提示專為舊版Android打造的有關測試

參考文章https://www.jianshu.com/p/c42b17223d35 猜測是因為安卓P以上的API版本預設所有Http的請求都被阻止了。

然後繼續修改targetSdkVersion,經多次測試發現值為25時既無提示也無報錯,成功運作:

關于app提示專為舊版Android打造的有關測試

0x02 後記

這次隻是簡單的用軟體快捷打包了一下網站,是以還有很多不足的地方,還是不做為我正式的app作品了,不過要是有看得上的小夥伴們還是想讓你們更友善的踩踩我的站啦,哈哈!

劃重點:因為我幾乎沒有接觸過本文涉及知識,是以此篇文章中的所有我自己寫的解釋僅供參考,更偏向于個人記錄,請不要以我的解釋作為正解,如果是大佬們發現了本文有什麼錯誤的地方,還勞煩大家在評論區中嚴厲溫柔指出,你們的支援是我前進的動力!