Программная регистрация учетной записи Google на устройстве Android

Я искал решение этой проблемы некоторое время (дни, а не минуты), но оно довольно эффективно ускользало от меня.

Обратите внимание, что это НЕ вопрос о начале процедуры регистрации. Это должно происходить автоматически без какого-либо взаимодействия с пользователем.

Я хотел бы добавить учетную запись Google на свое пользовательское устройство (их 1000). Учетная запись в основном будет использоваться для активации магазина Google Play на устройстве, чтобы приложение могло обновляться при появлении новых версий.

Мой существующий код (самый короткий фрагмент из тех, что я пробовал):

AccountManager mgr = AccountManager.get(this);
Account acc = new Account("[email protected]", "com.google");
mgr.addAccountExplicitly(acc, "password", new Bundle()));

естественно дает

java.lang.SecurityException: caller uid 10047 is different than the authenticator's uid

Итак, как мне на самом деле добиться этого? Мое устройство рутировано, так что это не препятствие, если это единственный способ.


person velis    schedule 22.12.2015    source источник
comment
Насколько мне известно, вы не можете создать учетную запись для другого аутентификатора приложений. Если у вас есть прошивка и ключ подписи, вы можете поделиться своим идентификатором пользователя с идентификатором пользователя системы. В этом случае вы можете обойти его. (не пишу как ответ, так как я не уверен на 100% в этой информации)   -  person Knossos    schedule 22.12.2015
comment
Что ж, резервная копия титана может это сделать, так что это должно быть как-то выполнимо   -  person velis    schedule 22.12.2015
comment
Поскольку это ваше пользовательское устройство, и вы утверждаете, что на нем установлен магазин Google Play, вы должны получить лицензию от Google. Вы должны спросить Google, какова их политика в отношении предварительного создания учетных записей Google в таких ситуациях, не только для того, чтобы определить, как это лучше всего сделать, но и в первую очередь, разрешено ли это.   -  person CommonsWare    schedule 22.12.2015
comment
Производитель устройства отклонил наш запрос на это, и у меня нет информации о фактической причине отклонения. Я предполагаю, что причина была политическая, но я не уверен.   -  person velis    schedule 22.12.2015
comment
Я столкнулся с чем-то, что нарушает TOS Google? Должен ли я тоже отказаться от моего работодателя?   -  person velis    schedule 22.12.2015


Ответы (2)


Невозможно добавить/создать учетную запись Google с помощью addAccountExplicitly(). Вы можете добавлять учетные записи только для своих собственных служб. даже ваше устройство рутировано, потому что оно будет отклонено веб-сервером Google. Подробнее см. эту ссылку.

person Rajesh Nasit    schedule 17.05.2017

Предупреждение: это решение не работает. Смотрите комментарии для объяснения.

Что ж, как оказалось, это не так просто решить. В итоге я зарегистрировал одно устройство, а затем вытащил из него файл пользователей. Расположение файла пользователей: /data/system/users/0/accounts.db (если на устройстве несколько профилей пользователей, последний каталог может отличаться в зависимости от рассматриваемого профиля).

Я сохранил этот файл в активах своего приложения (в сжатом виде, убедитесь, что расширение не является something.gz, потому что оно теряется во время упаковки - не стал проверять, почему).

Сначала я проверяю, существует ли мой пользователь:

AccountManager mgr = AccountManager.get(this);
for (Account acc: mgr.getAccountsByType("com.google")) {
  if (acc.name.equalsIgnoreCase("[email protected]"))
    return;
}

Если это так, я просто пропускаю шаг. В противном случае я распаковываю файл пользователей и перезаписываю существующий (используя su). Затем я также делаю перезагрузку, чтобы убедиться, что изменения зарегистрированы.

person velis    schedule 27.12.2015
comment
Вы нашли лучший способ сделать это? Это предполагает, что вы зарегистрировали эту учетную запись вручную один раз, чтобы в файл account.db были введены адрес электронной почты и хэш пароля. Есть ли способ сделать это, пропустив первый шаг, зная только необработанный пароль и не имея представления о его хешированной форме. Более того, я не уверен, что хешированная форма пароля будет одинаковой на всех устройствах, даже если модель таких устройств точно одинакова. - person Thanasis Petsas; 26.10.2016
comment
@ThanasisPetsas: На самом деле нет. Как оказалось, у Google есть некоторые средства обнаружения. Как только 50 устройств использовали одну и ту же учетную запись, Play Store перестал работать. Поэтому мы были вынуждены реализовать собственный механизм обновления пакетов. - person velis; 26.10.2016
comment
Хорошо, приятно знать! То есть 49 устройств с одной учетной записью устраивались? Хэшированная форма пароля была одинаковой для всех устройств? - person Thanasis Petsas; 26.10.2016
comment
Ну, технически все они использовали одну и ту же базу данных для учетной записи. Я не знаю, на каком устройстве Play Store перестал работать, но я предполагаю, что это было задолго до 50 устройств. У нас их тысячи, поэтому мы даже не пытались найти способ обойти это. Сам файл настроек представляет собой просто базу данных SQLite, поэтому технически вы можете делать с ней все, что хотите, просто сложно угадать все алгоритмы. - person velis; 27.10.2016