Можно ли установить приложение, подписанное платформой, в пространство пользователя?

Недавно я столкнулся со странной проблемой в пользовательской сборке Android? У меня было рабочее ПЗУ в течение нескольких месяцев, и с помощью этого ПЗУ я смог установить apks, подписанные платформой, в пользовательское пространство (/data/app). Недавно, после восстановления ПЗУ, я не смог установить те же apks. Любая попытка установить приложение, подписанное платформой (будь то через установку adb или установку pm), приводит к следующему сообщению:

Failure [INSTALL_FAILED_INVALID_INSTALL_LOCATION]

Покопавшись в исходниках Android, я нашел следующий соответствующий блок кода:

if ((compareSignatures(pkg.mSignatures, s1) == PackageManager.SIGNATURE_MATCH)) {
   Slog.w(TAG, "Cannot install platform packages to user storage");
   mLastScanError = PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION;
   return null;
}

Судя по моему чтению, установка системных приложений в пространстве пользователя никогда не должна была разрешаться. Был ли первоначальный случай, когда установка системных приложений в пространстве пользователя была аномалией? Можно ли устанавливать приложения с подписью платформы в пространстве пользователя, и если да, то как это сделать?


person Fil    schedule 04.01.2013    source источник
comment
Короткий ответ - нет! Приложения, подписанные платформой, являются частью ПЗУ, и, таким образом, если вам нужно приложение, подписанное платформой, в пользовательском пространстве, требуются ключи подписи, которые были сгенерированы во время сборки, когда ПЗУ было запечено   -  person t0mm13b    schedule 04.01.2013
comment
Так что у меня есть доступ к ключам, сгенерированным во время сборки, и я использую эти ключи. Он работал несколько месяцев и недавно перестал работать, что меня смутило. (Я хотел бы дать вам четкое представление о том, что изменилось, но, насколько мне известно, ничего не изменилось). Если я повторно подпишу приложение ключами, сгенерированными во время последней сборки, смогу ли я установить приложение, подписанное сертификатом платформы, в пространство пользователя?   -  person Fil    schedule 04.01.2013
comment
Да, в контексте моего предыдущего комментария - это относится только к заводским ПЗУ, но при прокатке собственного ПЗУ оно должно работать, тем не менее :) Извините, если я вас там запутал... :)   -  person t0mm13b    schedule 04.01.2013
comment
Это то, чего я просто не понимаю. Это работало месяцами. А сейчас уже не работает. Но блок кода, который я вставил выше, предполагает, что он никогда не должен работать. Однако спасибо за разъяснение, полезно знать, что ранее работавшая система не была аномалией.   -  person Fil    schedule 04.01.2013
comment
возможно, попробуйте сделать чистую сборку ПЗУ, make clobber в исходниках, что-то там пошло не так... :\   -  person t0mm13b    schedule 05.01.2013
comment
Добавил свои открытия по этой проблеме в ответ ниже.   -  person Fil    schedule 09.01.2013


Ответы (1)


Описанная выше ситуация возникла из-за того, что у нас есть общая машина для сборки Android (общая внутри компании). Коллега переключил ветку Git, не сообщив мне об этом, и, таким образом, мы остались со старым кодом в нашем пространстве сборки. Переключение на нужную ветку решило проблему. Чтобы ответить на приведенный выше вопрос более явно, кажется, что, если вы не закомментируете следующий блок кода, установка приложений, подписанных платформой, в пользовательском пространстве невозможна.

(Файл класса — /frameworks/base/services/src/com/android/server/pm/PackageManagerService.java);

    if (!pkg.applicationInfo.sourceDir.startsWith(Environment.getRootDirectory().getPath()) &&
            !pkg.applicationInfo.sourceDir.startsWith("/vendor")) {
        Object obj = mSettings.getUserIdLPr(1000);
        Signature[] s1 = null;
        if (obj instanceof SharedUserSetting) {
            s1 = ((SharedUserSetting)obj).signatures.mSignatures;
        }
        if ((compareSignatures(pkg.mSignatures, s1) == PackageManager.SIGNATURE_MATCH)) {
            Slog.w(TAG, "Cannot install platform packages to user storage");
            mLastScanError = PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION;
            return null;
        }
    } 
person Fil    schedule 09.01.2013