:
ENIGME10a:
Non non ! Vous n'aurez pas la réponse à l'énigme 10 aussi vite !!! D'abord, déclarez nous votre flamme !
htc.dev.concours@gmail.com
(Pensez à vérifier vos courriers indésirables et spams)
Non non ! Vous n'aurez pas la réponse à l'énigme 10 aussi vite !!! D'abord, déclarez nous votre flamme !
htc.dev.concours@gmail.com
(Pensez à vérifier vos courriers indésirables et spams)
Les pré-requis
Un téléphone rooté.
Le JDK (avec le JRE) Java JDK
Le SDK Android SDK ADB vous servira à extraire et remettre les fichiers sur votre téléphone.
7zip outil de décompression 7zip
Pour vous familiariser et être sur que tout fonctionne, il est conseillé de s'entrainer à l'installation avec un thème existant.
Video pour ceux qui auraient des problèmes avec le JDK et les sytèmes en 64bits :
Utilisation de ADB
Avant de démarrer, vous devez "dé-sécuriser" le shell.
Lancez le terminal de commande et tapez.
(Au moment de la commande su, vérifiez qu'on ne vous demande pas les droits root sur le téléphone.)
Code:
adb shell
su
mount -o remount,rw -t yaffs2 /dev/block/mtdblock2 /system
chmod 4755 /system/bin/sh
Quand vous avez terminé, pour sécuriser à nouveau le shell, il suffit de faire les mêmes commandes en modifiant la valeur 4755 par 0755.
Code:
adb shell
su
mount -o remount,rw -t yaffs2 /dev/block/mtdblock2 /system
chmod 0755 /system/bin/sh
Activez le mode débogage sur votre téléphone.
Connectez votre téléphone au pc.
Lancez le terminal de commande et placez vous dans le dossier ou vous extrairez votre fichier.
(Vous pouvez aussi,en y plaçant le CMD, le lancez directement depuis le dossier concerné )
Tapez.
Code:
adb pull /system/framework/framework-res.apk framework-res.apk
Cela copiera votre "framework-res.apk" du téléphone à votre dossier.
(Faites une sauvegarde de ce fichier dans un autre coin de votre pc au cas ou vous auriez des problèmes)
Une fois les modifications apportées à votre fichier pour le replacer tapez.
Code:
adb shell mount -o remount,rw -t yaffs2 /dev/block/mtdblock2 /system
adb push framework-res.apk /sdcard/framework-res.apk
adb shell dd if=/sdcard/framework-res.apk of=/system/framework/framework-res.apk
Le téléphone redémarre automatiquement.
Modification du thème
Vous aurez besoin de apktool Android-apktoll
draw9patch draw9patch
Le fichier thème Thème.zip
(Dans le dossier "stock" du fichier thème remplacez le "framework-res-apk" par le votre)
Utiliser Drag/Drop pour la mise à jour de vos images.
Méthode à utiliser si ne modifiez pas les images .9.png ou bien si vous n'ajoutez pas d'autres images.
Ouvrir sans extraire l'apk avec 7zip et trouver le répertoire des images (res\drawable-hdpi folder)
Déplacez les images à modifier depuis 7zip vers un répertoire de votre disque dur (laissez 7zip ouvert)
Modifier les images avec votre programme favori.
Déplacez les imagés modifiées vers l'apk (toujours ouvert avec 7zip).
Remettre le framework-res.apk sur votre téléphone en utilisant ADB.
Les fichiers .9.png
Ces fichiers sont des images avec des informations supplémentaires incluses. Ces informations décrivent comment les images peuvent être étirées, et où y placer le contenu (par exemple pour un bouton en arrière-plan, quelle espace doit contenir le texte).
Ces information sont contenues dans des bordures d'un pixel (les "guides") autour de l'image et peuvent être ajoutées en utilisant draw9patch. Les guides doivent en fait être compilés avec l'image avant de pouvoir être utilisée.
La bordure: Normalement vous ne devriez pas toucher à la bordure mais dans le cas contraire un lien vers xda..9.pngs figured out
Editer le Framework
Dans le fichier "thème.zip" vous trouverez 3 batch.
"install_framework.bat"
Ce batch permet à apktool d'installer le framework sur votre ordinateur. Les ressources du fichier stock\framework-res.apk seront extraites dans un répertoire par défaut. Si vous ne le faites pas vous risquez d'avoir le message "RessourceNotFound error".
"decompile.bat" et "build.bat" servent à décompiler et reconstruire le framework.
Ces fichiers seront à modifier si vous modifiez d'autres apk.
Décompilation et reconstruction.
Lancez "decompile.bat"
Les contenus de l'apk doivent être maintenant dans le dossier "working"
Les images à modifier se trouvent dans le répertoire "res/drawable-hdpi et res/drawable-land-hdpi".
Editez les images que vous voulez.
Pour les images .9.png travaillez sur une copie sans les guides puis recollez la copie au centre de l'image originale.
Vous pouvez modifier ces images sans soucis tant que vous ne touchiez pas au "guide".
Lancez "build.bat"
Cela reconstruit le framework modifié et le place dans le dossier "out".
N'installez pas encore celui ci dans votre téléphone.
Pour terminer utiliser la méthode Drag/Drop pour déplacer les images modifiés et finaliser le framework.
Modifier les fichiers XML et ajouter des ressources
Les fichiers XML dans le framework-res.apk sont compilés dans l'archive ce qui empêche de les éditer sans les décompiler. Le processus est assez simple à condition de prendre des précautions.
L'édition des fichiers XML permet des modifications qui ne seraient pas possibles par de simples modifications des fichiers images. Le meilleur exemple est le changement de l'icône batterie dans la barre de notification pour indiquer le pourcentage par tranche de 1% au lieu de 10%.
Si vous modifiez les fichiers XML ou ajouter des ressources à l'apk, copier toutes les modifications effectuées vers l'apk d'origine après chaque compilation.
Icône de batterie.
Pour décompiler et recompiler vous pouvez utiliser les batch dans le dossier "thème.zip"
Ou avec le terminal de commande.
Décompiler
Code:
java -jar apktool.jar d framework-res.apk framework-res
Recompiler
Code:
java -jar apktool.jar b framework-res out\framework-res.apk
Avec decompile.bat, le framework sera placé dans le répertoire working\framework-res.
Editez le fichier res\drawable\stat_sys_battery.xml
Code:
<item android:drawable="@drawable/stat_sys_battery_0" android:maxLevel="4" />
<item android:drawable="@drawable/stat_sys_battery_10" android:maxLevel="14" />
...
<item android:drawable="@drawable/stat_sys_battery_100" android:maxLevel="100" />
Remplacer tous les items par
Code:
<item android:drawable="@drawable/stat_sys_battery_0" android:maxLevel="0" />
<item android:drawable="@drawable/stat_sys_battery_1" android:maxLevel="1" />
<item android:drawable="@drawable/stat_sys_battery_2" android:maxLevel="2" />
...
<item android:drawable="@drawable/stat_sys_battery_100" android:maxLevel="100" />
Ajoutez les ressources (fichiers images) nécessaires. Pour l'icône de batterie vous devrez créer une image pour chaque pourcentage et les ajouter au répertoire res\drawable_hdpi. Le nom doit correspondre aux noms dans le fichier XML (stat_sys_battery_*.png)
Les images sont disponible ici Super Circle Battery
Recompilez l'apk avec le script build.bat. Un nouveau framework est créé dans le répertoire out\.
N'installez pas encore celui ci dans votre téléphone.
Extraire les fichiers XML modifiés et les images du framework-res.apk qui vient d'être généré et ajoutez les à l'apk à modifier en utilisant la méthode Drag/Drop.
Extraire le fichier ressources.arsc du framework généré.
Renommez votre framework-res.apk à modifier en framework-res.zip
Faites clique-droit sur le fichier ressources.arsc et sélectionner 7zip > Ajouter à l'archive
Dans la fenêtre qui s'ouvre, sélectionner le framework-res.zip dans le champ Archive. Fixer le format de l'archive à Zip, le niveau de compression à Aucun et cliquez sur OK. Si vous ne réglez pas ces paramètres, votre téléphone ne démarrera pas!
Renommer votre framework en framework-res.apk. Vérifier sa taille qui doit faire environ 10 Mo.
Voilà, vous pouvez transférer le framework-res.apk vers votre téléphone.
Le texte de la barre de notification
Le style des éléments graphiques se trouvent (normalement) dans res/values/styles.xml.
Le fichier XML est visbile uniquement dans le framework décompilé.
Le style du texte de la barre de notification est nommé TextAppearance.StatusBar. Mieux vaut faire une recherche sur ce nom.
Cela ressemble à ça
Code:
<style name="TextAppearance.StatusBar" parent="@style/TextAppearance">
<item name="textSize">16.0sp</item>
<item name="textStyle">normal</item>
<item name="textColor">@color/semc_text_color_primary</item>
</style>
Vous pouvez facilement modifier la taille et le style du texte en utilisant les éléments textSize et textStyle.
La description de ces attributs TextView
Pour les couleurs on utilise @color/... pour faire référence à une ressource définie dans colors.xml. On peut aussi définir directement la couleur en suivant ces indications textColor
En ouvrant le fichier colors.xml vous avez.
Code:
<color name="semc_text_color_primary">#ffffffff</color>
Cela définit la couleur de base du texte, ici en blanc (#ffffff). Changer cette valeur affectera tous les texte de base du téléphone (menu, etc..). Pour changer la couleur dans la barre de notification, mieux vaut ajouter une nouvelle couleur. Pour cela nous dupliquons juste la définition ci dessus en changeant le nom et la couleur:
Code:
<color name="semc_text_color_primary">#ffffffff</color>
<color name="semc_text_color_custom">#9900ff00</color>
Il faut ensuite modifier le style pour utiliser cette couleur.
Code:
<style name="TextAppearance.StatusBar" parent="@style/TextAppearance">
<item name="textSize">16.0sp</item>
<item name="textStyle">normal</item>
<item name="textColor">@color/semc_text_color_custom</item>
</style>
Ensuite suivez les instructions données pour l'icône de batterie ci dessus pour recompiler et ajouter le ressources.arsc à votre framework-res.apk.
Modification du service .jar
Les modifications du services.jar ne sont pas souvent nécessaires.
Modifier la couleur de texte de l'horloge est assez simple.
En fait, une autre méthode est possible juste en modifiant des XML dans res/layout, mais cela reste un exemple assez simple pour comprendre.
Pour modifier le services.jar nous devons décompiler le fichier classes.dex. Pour cela nous utiliserons baksmali.
Télécharger les 2 jar (baksmali et smali) smali et baksmali
1. Extraire le fichier services.jar du téléphone(situé dans /system/framework) en utilisant une des méthodes.
(faites une copie de sauvegarde)
2. Ourvir services.jar avec 7zip.
3. Extraire classes.dex de l'archive
4. Lancez le terminal de commande et tapez.
Code:
java -jar baksmali-1.2.5.jar -o working\services classes.dex
5. Vous avez maintenant un sous répertoire out\services\ avec le classes.dex décompilé (les fichiers smali).
Un guide de référence du smali ICI ou LA
Analyse du fichier StatusBarIcon.smali
Tout d'abord, jetons un oeil au fichier suivant com\android\server\status\StatusBarIcon.smali pour comprendre comment la couleur de l'horloge est définie. Une fois décrit la gestion de la coleur de l'horloge nous commenceront les modifications.
Vous pouvez utiliser n'importe quel éditeur de texte (PSPad ou Notepad++ par exemple).
si nous regardons la méthode init nous trouvons:
Le contenu peut différer légèrement, pas d'impact pour nous dans ce cas.
Code:
.line 44
.local v15, textColor:I
const/4 v13, -0x1
.line 50
.local v13, styleIndex:I
const v18, 0x1030079
:try_start_1f
sget-object v19, Lcom/android/internal/R$styleable;->TextAppearance:[I
move-object/from16 v0, p1
move/from16 v1, v18
move-object/from16 v2, v19
invoke-virtual {v0, v1, v2}, Landroid/content/Context;->obtainStyledAttributes(I[I)Landroid/content/res/TypedArray;
move-result-object v5
.line 53
.local v5, a:Landroid/content/res/TypedArray;
const/16 v18, 0x0
move-object v0, v5
move/from16 v1, v18
move/from16 v2, v16
invoke-virtual {v0, v1, v2}, Landroid/content/res/TypedArray;->getDimension(IF)F
move-result v16
.line 54
const/16 v18, 0x3
move-object v0, v5
move/from16 v1, v18
move v2, v15
invoke-virtual {v0, v1, v2}, Landroid/content/res/TypedArray;->getColor(II)I
move-result v15
En résumé:
Je suis persuadé que les lignes commençant par un point '.' sont des commentaires du décompileur.
Les lignes .line xx font juste référence au numéro de lignes du code Java. Et je pense que les lignes .local v15, textColor:I font juste référence au nom et au type de la variable v15.
Ce qui nous intéresse en premier lieu est la ligne
Code:
invoke-virtual {v0, v1, v2}, Landroid/content/Context;->obtainStyledAttributes(I[I)
On trouve la définition de la méthode obtainStyledAttributes ici StyledAttributes
Il y a des surcharges, mais on appelle ici la méthode qui prend comme paramètres un entier et un tableau d'entiers - ce qui nous est indiqué par (I[I), soit I et [I .
Les trois variables entre accolades au début indiquent respectivement l'objet sur lequel sera appelé la méthode et les 2 paramètres de la méthode.
Le premier paramètre (v1) est un ID de ressource et quelques lignes plus haut, le contenu de la variable v18 y est copié (move/from16 v1, v18). v18 a été déclaré encore quelques lignes plus haut avec la valeur 0x1030079. On retrouve cet ID dans le fichier res/values/public.xml du framework associé au nom d'un style (TextAppearance.StatusBar). On retrouve la définition de ce style dans le fichier res/values/styles.xml
Le résultat de obtainStyledAttributes est copié vers la variable v5 qui est copié vers v0. Celle-ci est utilisée pour appeler Landroid/content/res/TypedArray;->getColor avec les deux paramètres v18 et v15. Le premier paramètre est l'index de la couleur dans le tableau de styles (index 3 dans v5) et le second est la valeur par défaut (noir).
Le résultat de getColor() est alors copié vers v15 et réutilisé à la construction du texte pour l'horloge:
Code:
.line 61
.local v14, t:Landroid/widget/TextView;
move-object v0, v14
move-object/from16 v1, p0
iput-object v0, v1, Lcom/android/server/status/StatusBarIcon;->mTextView:Landroid/widget/TextView;
.line 62
new-instance v11, Landroid/widget/LinearLayout$LayoutParams;
const/16 v18, -0x2
const/16 v19, -0x1
move-object v0, v11
move/from16 v1, v18
move/from16 v2, v19
invoke-direct {v0, v1, v2}, Landroid/widget/LinearLayout$LayoutParams;-><init>(II)V
.line 65
.local v11, layoutParams:Landroid/widget/LinearLayout$LayoutParams;
const/16 v18, 0x0
move-object v0, v14
move/from16 v1, v18
move/from16 v2, v16
invoke-virtual {v0, v1, v2}, Landroid/widget/TextView;->setTextSize(IF)V
.line 66
invoke-virtual {v14, v15}, Landroid/widget/TextView;->setTextColor(I)V
Ainsi nous en déduisons que pour changer uniquement la couleur de l'horloge, nous devons déclarer un nouveau style et utiliser l'ID de ce style au moment d'appeler obtainStyledAttributes.
Modifications à apporter
On ajoute le style TextAppearance.StatusBar.Clock au fichier styles.xml au même endroit que les autres définitions de style de la barre de notification.
Code:
...
<style name="TextAppearance.StatusBar" parent="@style/TextAppearance">
<item name="textSize">16.0sp</item>
<item name="textStyle">normal</item>
<item name="textColor">@color/semc_text_color_primary</item>
</style>
<style name="TextAppearance.StatusBar.Clock" parent="@style/TextAppearance">
<item name="textSize">16.0sp</item>
<item name="textStyle">normal</item>
<item name="textColor">@color/semc_text_color_clock</item>
</style>
...
Le nom du nouveau style peut être n'importe quoi, ce qui est important c'est son ID dans public.xml. On y associe soit une couleur déjà définie dans colors.xml, soit comme ici une nouvelle, comme nous l'avons vu dans le post précédent.
Pour un rouge un peu transparent par exemple, ajoutez cette ligne au fichier colors.xml:
Code:
<color name="semc_text_color_clock">#99ff0000</color>
Le style dans public.xml doit avoir un ID commençant par 0x103xxxx. C'est la fourchette d'ID utilisable pour les styles. Les chaines de caractères et les autres ressources ont des fourchettes d'ID différentes. J'ajoute toujours un nouveau style à la fin de la liste des styles pour être sûr d'utiliser le premier ID disponible.
Code:
....
<public type="style" name="SEMCTheme.Dialog.Alert.Vanilla" id="0x01030139" />
<public type="style" name="TextAppearance.StatusBar.Clock" id="0x0103013a" />
....
Maintenant que nous avons ajouté un style nous devons juste modifier le code pour l'utiliser. Modifiez ce code.
Code:
.line 50
.local v13, styleIndex:I
const v18, 0x1030079
Par.
Code:
.line 50
.local v13, styleIndex:I
const v18, 0x103013a
Notre nouveau style est maintenant utilisé quand on appelle StyledAttributes. Nous devons recompiler le code smali vers le fichier classes.dex et mettre à jour le services.jar:
Exécutez la commande suivante pour recompiler le smali.
Code:
java -jar smali-1.2.5.jar -o out\classes.dex working\services
Le fichier en résultant peut être d'une taille légèrement différente que le fichier classes.dex original, mais tant que vous n'avez pas d'erreurs, c'est bon.
Ouvrez maintenant services.jar avec 7zip et ajouter le nouveau classes.dex à l'archiver en le faisant glisser vers 7zip.
Régénérez un fichier ressources.arsc (voir méthode) pour que les nouveaux ID soient pris en compte.
Et voilà! Transférer le services.jar puis le framework-res.apk vers votre téléphone (avec la méthode de votre choix). Au redémarrage, la couleur de l'horloge a changé!
Localisation des ressources
Quelques infos sur les modifications possibles:
Couleur d'arrière plan dans la barre de notification:
Fichiers à modifier dans /res/drawable/ :
- statusbar_background.png
- status_bar_background.png
- status_bar_close_on.9.png
- status_bar_header_background.9.png
- status_bar_item_background_normal.9.png
Si vous avez un problème
Quelques retours d'expérience.
Ce post regroupe des astuces au cas où votre téléphone ne booterait pas suite à un changement de thème (Si ça ne vous est jamais arrivé, c'est que vous n'avez pas bien essayé)
Pour ceux qui ont besoin de reflasher après le téléchargement d'un apk, vous pouvez essayer de ne flasher que le fichier .sin. Votre téléphone va rebooter (en mettant plus de temps que d'habitude) et ainsi vous aurez toujours toutes vos applis. Par contre il faudra re-rooter.
Pourquoi votre téléphone ne boot pas
- les images ne sont pas correctement stockées, leur format n'est pas le bon, pas la bonne taille, ..
- votre apk n'a pas été correctement décompressée ou recompressée
- vous avez signé l'apk avant de l'envoyer vers le téléphone - à moins que vous ne sachiez exactement ce que vous faites, suivez les instructions de ce topic et ça devrait fonctionner.
- vous avez envoyé l'apk au mauvais endroit
Si le téléphone reste bloqué sur le bootscreen, replacer votre sauveagrde du framework-res.apk sur le téléphone.
Si vous avez installé le recovery
- si le téléphone ne boot pas assez pour que vous puissiez accéder à la partition système, lancer le recovery au démarrage, puis sélectionnez Partition tools => Mount /system et Mount /sdcard. A partir de là, vous pourrez renvoyer le framework-res.apk de sauvegarde vers votre téléphone.
- Sinon, vous pouvez toujours restaurer votre sauvegarde (Backup & restore => restore)
SOURCE XDA
SOURCE FrAndroid