plataforma
RK3288 + Android 7.1
problema
使用SU命令删除了/data/system/users目录下的文件后重启, HOME 无法正常返回主界面.
system_process I/WindowManager: Not starting activity because user setup is in progress: Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 (has extras) }
análisis
| - frameworks / base / services / core / java / com / android / server / policy / PhoneWindowManager.java
private void startActivityAsUser(Intent intent, UserHandle handle) {
if (isUserSetupComplete()) {
mContext.startActivityAsUser(intent, handle);
} else {
Slog.i(TAG, "Not starting activity because user setup is in progress: " + intent);
}
}
boolean isUserSetupComplete() {
return Settings.Secure.getIntForUser(mContext.getContentResolver(),
Settings.Secure.USER_SETUP_COMPLETE, 0, UserHandle.USER_CURRENT) != 0;
}
¿El valor de Settings.Secure.USER_SETUP_COMPLETE es 0?
Método 1:
Comando para ver el valor de la configuración de la base de datos: la configuración es segura user_setup_complete, el resultado es 0
Método 2:
cat /data/system/users/0/settings_secure.xml | grep user_setup
<setting id="56" name="user_setup_complete" value="0" package="com.android.provision" />
resolver
使用命令设置为1:
settings put secure user_setup_complete 1
PD
- Los comandos relacionados anteriores requieren permisos del sistema
- Se recomienda usarlo solo durante la depuración.
Código relacionado:
user_setup_complete valor predeterminado configuración:
| - frameworks / base / packages / SettingsProvider / src / com / android / Suppliers / settings / DatabaseHelper.java
loadBooleanSetting(stmt, Settings.Secure.USER_SETUP_COMPLETE,
R.bool.def_user_setup_complete);
| - frameworks / base / packages / SettingsProvider / res / values / defaults.xml
<bool name="def_user_setup_complete">false</bool>
Modificación de valor:
| - packages / apps / Provision / src / com / android / provision / DefaultActivity.java
public class DefaultActivity extends Activity {
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
// Add a persistent setting to allow other apps to know the device has been provisioned.
Settings.Global.putInt(getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1);
Settings.Secure.putInt(getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, 1);
// remove this activity from the package manager.
PackageManager pm = getPackageManager();
ComponentName name = new ComponentName(this, DefaultActivity.class);
pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
...
finish();
}