web-dev-qa-db-fra.com

À quoi sert le fichier res / values ​​/ public.xml sur Android?

J'ai effectué une recherche sur Google, mais je n'ai trouvé aucun résultat pertinent.

J'ai également vérifié les officiels Android docs et cette page (pour toutes les ressources disponibles) était tout ce que j'ai pu trouver. Les liens pertinents (vers le res/values/ répertoire) J'ai trouvé sur cette page:

Ces pages ne disent rien sur le res/values/public.xml fichier.
Voici un exemple que j'ai trouvé pour ce type de fichier .

Petit extrait

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <public type="attr" name="commentTextColor" id="0xAA010007" />
    <public type="drawable" name="add_icon_bl" id="0xAA020000" />
    <public type="layout" name="act_date_picker" id="0xAA030001" />
    <public type="anim" name="activity_slide_from_bottom" id="0xAA040000" />
    <public type="xml" name="pref_menu" id="0xAA050000" />
    <public type="raw" name="alert_bell_animation_bl" id="0xAA060000" />
    <public type="array" name="taskRepeat" id="0xAA070000" />
    <public type="color" name="theme_main_color_bl" id="0xAA080000" />
    <public type="string" name="no_internet" id="0xAA0a0001" />
    <public type="id" name="page1" id="0xAA0d0015" />
</resources>

Comme vous pouvez le voir dans l'attribut type, il contient à peu près tous les types de ressources standard que vous placez normalement dans répertoires séparés sous le res répertoire ...


Pourquoi voudrait-on abuser des répertoires que Android fournit et utilise un seul fichier pour stocker toutes les valeurs dans? Quelqu'un peut-il donner plus d'informations à ce sujet?

55
Igor Popov

Le fichier res/values ​​/ public.xml est utilisé pour attribuer des ID de ressources fixes aux ressources Android Android.

Considérez ces ensembles de ressources de chaîne dans res/values ​​/ strings.xml :

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="string1">String 1</string>
    <string name="string3">String 3</string>
</resources>

L'outil Android Asset Packaging Tool (aapt) peut attribuer les ID de ressource suivants pour ces ressources lors de la compilation de l'application:

public final class R {
    // ...
    public static final class string {
        public static final int string1=0x7f040000;
        public static final int string3=0x7f040001;
    }
}

Maintenant, changez l'ensemble des ressources de chaîne en

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="string1">String 1</string>
    <string name="string2">String 2</string>
    <string name="string3">String 3</string>
</resources>

et vous remarquerez que l'ID de ressource pour @string/string3 a changé:

public final class R {
    // ...
    public static final class string {
        public static final int string1=0x7f040000;
        public static final int string2=0x7f040001;
        public static final int string3=0x7f040002; // New ID! Was 0x7f040001
    }
}

Pour éviter cela, vous pouvez utiliser res/values ​​/ public.xml :

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <public type="string" name="string3" id="0x7f040001" />
</resources>

ce qui entraînera l'attribution des ID de ressource comme suit:

public final class R {
    // ...
    public static final class string {
        public static final int string1=0x7f040000;
        public static final int string2=0x7f040002;
        public static final int string3=0x7f040001; // Resource ID from public.xml
    }
}

Les applications ont rarement une utilité pour res/values ​​/ public.xml car les ID de ressource affectés aux ressources n'ont pas d'importance. Lorsqu'elles changent, l'application entière est reconstruite de toute façon, donc toutes les références dans Java code aux ressources par ID de ressource seront mises à jour.

L'utilisateur le plus important de res/values ​​/ public.xml est la plate-forme Android elle-même. Applications construites sur les anciennes versions de Android suppose que certaines ressources ont un certain ID de ressource. Par exemple, la ressource Android) @Android:style/Theme doit toujours avoir l'ID de ressource 0x01030005 pour que la plateforme soit rétrocompatible avec les applications construites sur les anciennes versions de la plateforme.

Si vous souhaitez en savoir plus sur la façon dont les ID de ressource sont attribués, reportez-vous à cette réponse: Comment fonctionne le mappage entre Android ressources et ID de ressources?

85
Martin Nordholts

https://developer.Android.com/studio/projects/Android-library.html#PrivateResources

public.xml est utile pour les projets de bibliothèque en général. Si vous incluez un fichier public.xml, il est supposé que le reste de vos ressources sont censées être privées.

Bien que les ressources privées soient toujours utilisables par d'autres projets, le linter vous avertira de leur utilisation et ne sera pas inclus dans la saisie semi-automatique d'AndroidStudio.

Voici un Gist pour la génération automatique de public.xml https://Gist.github.com/HannahMitt/99922d4183bdb03356fd339413ba63

8
HannahMitt

N'est-ce pas un fichier destiné uniquement aux auteurs du code du système d'exploitation pour définir un mappage entre les noms symboliques et les ID de ressource système?

Vous le trouverez dans votre SDK à YOUR_SDK_LOCATION\plates-formes\Android - ??\data\res\values.

C'est dirigé

Ce fichier définit les ressources publiques de base exportées par la plateforme, qui doivent toujours exister

et a la mise en garde:

NOTE IMPORTANTE POUR TOUTE PERSONNE MODIFIANT CE FICHIER LISEZ CECI AVANT D'APPORTER DES MODIFICATIONS

Ce fichier définit la compatibilité binaire des ressources. En tant que tel, vous devez être très prudent lorsque vous effectuez des modifications ici, sinon vous rompez complètement la compatibilité descendante avec les anciennes applications

Il contient des entrées telles que

<public type="attr" name="smallScreens" id="0x01010284" />
<public type="attr" name="normalScreens" id="0x01010285" />
<public type="attr" name="largeScreens" id="0x01010286" />

- tous les identifiants du système, donc toute personne qui modifie des entrées cassera son code, dans la mesure où il ne fonctionnera pas sur un appareil standard.

3
NickT