6

Я хочу использовать метаданные в манифесте Android, чтобы настроить поведение службы.Есть ли способ сохранить метаданные в манифесте Android, приватные для пакета?

<service 
    android:name=".SampleService" 
    android:exported="false"> 
    <meta-data 
     android:name="sampleName" 
     android:resource="@string/sampleValue" /> 
</service> 

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

ответ

9

Являются ли эти атрибуты метаданных видимыми для других установленных пакетов на телефоне через PackageManager, даже если служба не экспортируется?

Да. Все в манифесте и все в ваших ресурсах и активах доступно для всех приложений на устройстве.

1

После выполнения некоторых тестов я подтвердил, что все поля метаданных видны всем пакетам, как сообщает CommonsWare. Однако я также обнаружил, что вы можете сохранить содержимое значения private, используя android: resource вместо android: value. Когда вы используете android: resource, из PackageManager возвращается только целочисленный идентификатор ресурса, и поэтому только ваш пакет будет иметь доступ к фактическому значению ресурса.

Update: Оказывается, что CommonsWare право снова. После дальнейшего изучения все ресурсы и активы общедоступны для ВСЕХ пакетов, установленных на устройстве. Никаких разрешений не требуется.

PackageManager pm = getPackageManager(); 
PackageInfo info = pm.getPackageInfo("test.package", PackageManager.GET_META_DATA|PackageManager.GET_SERVICES); 
int resourceId = info.services[0].metaData.getInt("sampleName"); 
String resourceValue = pm.getResourcesForApplication("test.package").getString(resourceId); 
+0

Это может исключить информацию из публичных размещений, менеджера пакетов для других программ, но это довольно просто, чтобы найти и открыть APK, извлечь двоичный манифест, и demangle его обратно в обычный текст - ситуацию с ресурсы должны быть схожими. Нельзя, наверное, не полагаться на то, что всегда в состоянии сделать это, но нужно обязательно ** не ** полагаться на кого-то другого, а не на то, чтобы быть в состоянии сделать это. –

+0

Разве это не так для всех файлов, активов и ресурсов dex? – Alan

+0

Да, но значения, которые собираются в коде, требуют немного более конкретного усилия, чем значения, которые хранятся стандартным образом. –