Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
Mettre à jour un device Android, ok mais
comment ça marche ?
pod
Montréal
Paris
Ce dont on ne parlera pas...
Qu’est-ce qu’une OTA ?
Qui a besoin de ce genre de solutions ?
À quoi ça sert ?
Défis techniques
Générer un paquet de mise à jour
% . build/envsetup.sh && lunch tardis-eng
% mkdir dist_output
% make dist DIST_DIR=dist_o...
Ce que ça contient
META-INF
CERT.RSA
CERT.SF
com
android
metadata
otacert
google
android
update‐binary
updater‐script
MANI...
mount("ext4", "EMMC", "/dev/block/platform/dw_mmc.0/by-‐name/system", “/system");
file_getprop("/system/build.prop", "ro.b...
Full vs. incremental
% ./build/tools/releasetools/ota_from_target_files 
-i PREVIOUS-tardis-target_files.zip 
dist_output/...
Game of loaders // Updater
Game of loaders // Updater
private static final String KEY_SYSTEM_UPDATE_SETTINGS =
"system_update_settings";
if (UserHand...
Game of loaders // Updater
<intent-filter android:priority="999">
<action android:name="android.settings.SYSTEM_UPDATE_SET...
Game of loaders // Downloader
Game of loaders // Downloader
DownloadManager dm = (DownloadManager)
context.getSystemService(Context.DOWNLOAD_SERVICE);
D...
Game of loaders // Downloader
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<uses‐pe...
Game of loaders // Updater
Game of loaders // Updater
// android.os.RecoverySystem
public static void installPackage (Context context, File packageFi...
Le jeu des loaders // Bootloader
Game of loaders // Recovery(er?)
Installing the update
After installing
<receiver android:name=".BootReceiver">
<intent-filter>
<action android:name="android.intent.action.PRE_B...
Simple back-end
Industrial backend
Industrial backend
Industrial backend
Industrial backend
Branching your OTA
Device identification
Fragmentation
Version compatibility
Let´s have a look...
How did you find about all that ?!
What's next
Questions ?
POD //
pod@sidereo.com
Simon //
s@sidereo.com
Prochain SlideShare
Chargement dans…5
×

OTA : Mettre à jour un device Android, ok mais comment ça marche ?

586 vues

Publié le

Présentation donnée à la Droidcon Paris 2015

Constructeur, opérateur, grosse entreprise avec une flotte d'objets connectés ou tout simplement curieux, Pierre-Olivier soulève le capot et vous explique comment une OTA fonctionne de A à Z :
- le recovery
- le paquet de mise à jour
- le service de mise à jour
- les chinois
- etc.

Publié dans : Technologie
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

OTA : Mettre à jour un device Android, ok mais comment ça marche ?

  1. 1. Mettre à jour un device Android, ok mais comment ça marche ? pod
  2. 2. Montréal Paris
  3. 3. Ce dont on ne parlera pas...
  4. 4. Qu’est-ce qu’une OTA ?
  5. 5. Qui a besoin de ce genre de solutions ?
  6. 6. À quoi ça sert ?
  7. 7. Défis techniques
  8. 8. Générer un paquet de mise à jour % . build/envsetup.sh && lunch tardis-eng % mkdir dist_output % make dist DIST_DIR=dist_output % ./build/tools/releasetools/ota_from_target_files dist_output/tardis-target_files.zip ota_update.zip
  9. 9. Ce que ça contient META-INF CERT.RSA CERT.SF com android metadata otacert google android update‐binary updater‐script MANIFEST.MF
  10. 10. mount("ext4", "EMMC", "/dev/block/platform/dw_mmc.0/by-‐name/system", “/system"); file_getprop("/system/build.prop", "ro.build.fingerprint") == "google/mantaray/manta:4.4.3/KTU84L/1148727:user/release-‐keys" || file_getprop("/system/build.prop", "ro.build.fingerprint") == "google/mantaray/manta:4.4.4/KTU84P/1227136:user/release-‐keys" || abort("Package expects build fingerprint of google/mantaray/manta:4.4.3/KTU84L/ 1148727:user/release-‐keys or google/mantaray/manta:4.4.4/KTU84P/1227136:user/release-‐keys; this device has " + getprop("ro.build.fingerprint") + "."); getprop("ro.product.device") == "manta" || abort("This package is for "manta" devices; this is a "" + getprop("ro.product.device") + ""."); ui_print("Verifying current system...");
  11. 11. Full vs. incremental % ./build/tools/releasetools/ota_from_target_files -i PREVIOUS-tardis-target_files.zip dist_output/tardis-target_files.zip incremental_ota_update.zip
  12. 12. Game of loaders // Updater
  13. 13. Game of loaders // Updater private static final String KEY_SYSTEM_UPDATE_SETTINGS = "system_update_settings"; if (UserHandle.myUserId() == UserHandle.USER_OWNER) { Utils.updatePreferenceToSpecificActivityOrRemove( act, parentPreference, KEY_SYSTEM_UPDATE_SETTINGS, Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY); } else { // Remove for secondary users removePreference(KEY_SYSTEM_UPDATE_SETTINGS); }
  14. 14. Game of loaders // Updater <intent-filter android:priority="999"> <action android:name="android.settings.SYSTEM_UPDATE_SETTINGS" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter>
  15. 15. Game of loaders // Downloader
  16. 16. Game of loaders // Downloader DownloadManager dm = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); DownloadManager.Request requestDownload = new DownloadManager.Request(url) .setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI) .setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN) .setVisibleInDownloadsUi(false) .setTitle(update.buildNumber) .setDestinationUri(getDestinationUri()) .setDescription(update.buildNumber); return dm.enqueue(requestDownload);
  17. 17. Game of loaders // Downloader <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" /> <uses‐permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" /> <uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER_ADVANCED" /> <receiver android:name=".DownloadReceiver"> <intent-filter> <action android:name="android.intent.action.DOWNLOAD_COMPLETE" /> </intent‐filter> </receiver>
  18. 18. Game of loaders // Updater
  19. 19. Game of loaders // Updater // android.os.RecoverySystem public static void installPackage (Context context, File packageFile) public static void rebootWipeCache (Context context) public static void rebootWipeUserData (Context context) public static void verifyPackage (File packageFile, RecoverySystem.ProgressListener listener, File deviceCertsZipFile)
  20. 20. Le jeu des loaders // Bootloader
  21. 21. Game of loaders // Recovery(er?)
  22. 22. Installing the update
  23. 23. After installing <receiver android:name=".BootReceiver"> <intent-filter> <action android:name="android.intent.action.PRE_BOOT_COMPLETED" /> </intent-filter> </receiver>
  24. 24. Simple back-end
  25. 25. Industrial backend
  26. 26. Industrial backend
  27. 27. Industrial backend
  28. 28. Industrial backend
  29. 29. Branching your OTA
  30. 30. Device identification
  31. 31. Fragmentation
  32. 32. Version compatibility
  33. 33. Let´s have a look...
  34. 34. How did you find about all that ?!
  35. 35. What's next
  36. 36. Questions ? POD // pod@sidereo.com Simon // s@sidereo.com

×