Vivo判断应用是否可以自启动

系统分析

Posted by JovenHe on April 25, 2021

打开设置中的自启动设置页面

vivo_自启动页面.jpg

adb一下看是哪个页面

vivo_adb_currentFocus.png

直接在Android studio 的Device File Explorer中找到该应用,在system-app-PermissionManager中找到

vivo_permissionManager.png

直接拿出来使用jadx打开

vivo_startupManagerAc.png

自启动页面的应用列表肯定需要adapter,所以直接找adapter

vivo_setAdapter.png

可以看到初始化传入了三个值,而第三个就是list数据,直接找它的数据是怎么来的

vivo_startup_data.png

vivo_startup_data2.png

最终获取数据是执行的com.vivo.permissionmanager.utils.C0536aq.m1102a

vivo_startup_dataGet.png

那我们把代码整理执行一下

vivo_startup_dataGet_code.png

vivo_startup_dataGet_result.png

和手机自启动页面的应用是一致的,但这一步只是获取了需要自启动的应用包名,下一步就需要获取打开了的应用。继续查看调用后的代码

vivo_startup_dataGet_result_Next.png

可以看到进行了遍历,所以主要分析所有调用了L_0x0051的位置,很容易找到该位置

vivo_startup_dataGet_result_Next2.png

vivo_startup_dataGet_query.png

代码简化后得到

    public static void getPackageStartupInfo(Context context, String packageName){
        StringBuilder uriString = new StringBuilder();
        uriString.append("content://com.vivo.permissionmanager.provider.permission");
        uriString.append(File.separator);
        uriString.append("bg_start_up_apps");
        android.net.Uri uri =Uri.parse(uriString.toString());
        java.lang.String[] projection = new java.lang.String[]{"_id", "pkgname", "pkguid", "setbyuser", "currentstate"};
        java.lang.String[] Args = new java.lang.String[]{packageName};
        android.database.Cursor cursor = context.getContentResolver().query(
                uri, projection, "pkgname=?", Args, null);
        if (cursor.moveToFirst()) {
            for (String columnName : cursor.getColumnNames()) {
                int index= cursor.getColumnIndex(columnName);
                Log.d(TAG, "getPackageStartupInfo: ="+columnName+"="+cursor.getString(index));
            }
        }
        cursor.close();
    }

执行一下,获取支付宝的信息

vivo_startup_dataGet_query_result.png

在自启动中允许支付宝自启动,再次执行

vivo_startup_dataGet_query_result2.png

可见状态值为0代表允许自启,为1代表不允许自启

至此分析结束