【Android初級】如何讓APP無法在指定的系統(tǒng)版本上運行

隨著市面上越來越多三方APP的出現(xiàn),某些手機廠商也開始對這些APP進(jìn)行了安裝限制或者運行限制,或者三方APP自身的版本過低,無法被特定的系統(tǒng)版本所支持。

今天我將要模擬實現(xiàn)一個“由于APP自身版本過低、導(dǎo)致無法在當(dāng)前的系統(tǒng)版本上運行”的功能效果。

實現(xiàn)思路如下:

  1. 要獲得APP的目標(biāo)運行版本,也要知道系統(tǒng)的編譯版本

  2. 通過版本比較,在進(jìn)入該APP時,給用戶做出“不支持運行”的提示

  3. 用戶確認(rèn)提示后,直接退出該APP

關(guān)鍵點是 targetSdkVersion 的使用,源碼如下:

1、主Activity

public class TargetSdkVersionDemo extends Activity {
    @Override
    protected void onCreate(Bundle onSavedInstance) {
        super.onCreate(onSavedInstance);
        setContentView(R.layout.target_sdk_version_demo);

        int appTargetSdkVersion = getApplicationInfo().targetSdkVersion;
        Log.i("TargetSdkVersionDemo", "targetsdkversion " + appTargetSdkVersion);
        
        // 我們假設(shè)這個APP的目標(biāo)運行版本不高于 API Level 26
        if (appTargetSdkVersion <= Build.VERSION_CODES.O) {
            showNotSupportDialog(appTargetSdkVersion);
        }
    }

    private void showNotSupportDialog(int version) {
        new AlertDialog.Builder(this)
                .setMessage("該APP的目標(biāo)運行版本是 " + version + ",低于手機當(dāng)前的版本,不支持運行!")
                .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        // 退出程序
                        finish();
                    }
                })
                .create()
                .show();

    }
}

2、在AndroidManifest.xml中需要定義 uses-sdk 這個標(biāo)簽的 targetSdkVersion 屬性:

<uses-sdk android:targetSdkVersion="25" />

注意:

如果在 app 目錄下的 build.gradle 文件中定義了 targetSdkVersion,則會覆蓋 AndroidManifest中的值,源碼中有說明:

file

3、效果圖如下:

gif

我們注意到程序中使用的是 getApplicationInfo().targetSdkVersion,說明這個變量是 ApplicationInfo.java 的成員變量,這個值是在安裝APK的過程中、由系統(tǒng)服務(wù) PackageManagerService 解析賦值的,解析的源碼位于 frameworks\base\core\java\android\content\pm\PackageParser.java 中:

file

可以看到:

  • 先解析 TAG_USES_SDK(uses-sdk)

  • 再解析屬性名 targetSdkVersion 以及 minSdkVersion 的值

最后再賦值給 applicationInfo對象的:

pkg.applicationInfo.targetSdkVersion = targetSdkVersion

本文由博客群發(fā)一文多發(fā)等運營工具平臺 OpenWrite 發(fā)布

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容