בגיבוי אוטומטי לאפליקציות מתבצע גיבוי אוטומטי של נתוני המשתמש מאפליקציות הם פועלים ב-Android 6.0 (רמת API 23) ומעלה. כדי לשמור את נתוני האפליקציות, מערכת Android מעלה אותם ל-Google Drive של המשתמש, שם הם מוגנים באמצעות פרטי הכניסה של חשבון Google שלו. הגיבוי מוצפן מקצה לקצה במכשירים עם Android 9 ואילך באמצעות קוד האימות, קו ביטול הנעילה או הסיסמה של המכשיר. כל אפליקציה יכולה להקצות עד 25MB של נתוני גיבוי לכל משתמש באפליקציה. אין חיוב על אחסון נתוני הגיבוי. האפליקציה שלך יכולה להתאים אישית את התהליך לגיבוי, או לבטל את ההסכמה על ידי השבתת הגיבויים.
סקירה כללית על גיבוי נתונים – סקירה כללית על אפשרויות הגיבוי ב-Android והנחיות לגבי הנתונים שצריך לגבות ולשחזר.
קבצים שעוברים גיבוי
כברירת מחדל, הגיבוי האוטומטי כולל קבצים ברוב הספריות שהמערכת מקצה לאפליקציה:
קובצי העדפות משותפות
קבצים שנשמרו באחסון הפנימי של האפליקציה וגישה אליהם מתבצעת דרך
getFilesDir()
אוgetDir(String, int)
קבצים בספרייה שמוחזרת על ידי
getDatabasePath(String)
, שכוללים גם קבצים שנוצרו באמצעות הכיתהSQLiteOpenHelper
קבצים באחסון חיצוני בספרייה שהוחזרו על ידי
getExternalFilesDir(String)
הגיבוי האוטומטי לא כולל קבצים בספריות שהוחזרו על ידי getCacheDir()
,
getCodeCacheDir()
וgetNoBackupFilesDir()
. הקבצים שנשמרים במיקומים האלה נדרשים רק באופן זמני, והם לא נכללים בכוונה בפעולות הגיבוי.
אפשר להגדיר שהאפליקציה תכלול קבצים מסוימים ותחריג אותם. לקבלת מידע נוסף מידע נוסף זמין בקטע הכללה והחרגה של קבצים.
מיקום הגיבוי
נתוני הגיבוי מאוחסנים בתיקייה פרטית בחשבון Google Drive של המשתמש, מוגבל ל-25MB לכל אפליקציה. הנתונים השמורים לא ייכללו בחישוב ממכסת האחסון האישית ב-Google Drive. רק הגיבוי האחרון נשמר. כאשר מתבצע גיבוי, כל הגיבויים הקודמים נמחק. אי אפשר לקרוא את נתוני הגיבוי המשתמש או אפליקציות אחרות במכשיר.
המשתמשים יכולים לראות רשימה של אפליקציות שגובו ב-Google Drive אפליקציה ל-Android. במכשירי Android, המשתמשים יכולים למצוא את הרשימה הזאת ב-Drive. חלונית ההזזה לניווט של האפליקציה בקטע הגדרות > גיבוי ואיפוס.
הגיבויים מכל תקופת ההגדרה של המכשיר מאוחסנים במערכי נתונים נפרדים, כפי שמתואר בדוגמאות הבאות:
אם למשתמש יש שני מכשירים, קיים מערך נתונים לגיבוי לכל מכשיר.
אם המשתמש מאפס את המכשיר להגדרות המקוריות ואז מגדיר אותו עם אותו חשבון, הגיבוי נשמר במערך נתונים חדש. מערכי נתונים שאינם בשימוש הם נמחק באופן אוטומטי לאחר פרק זמן של חוסר פעילות.
לו"ז גיבוי
הגיבויים מתבצעים באופן אוטומטי כשכל התנאים הבאים מתקיימים:
- המשתמש הפעיל את הגיבוי במכשיר. ב-Android 9, ההגדרה הזו נמצאת הגדרות > מערכת > גיבוי.
- עברו לפחות 24 שעות מאז הגיבוי האחרון.
- המכשיר לא פעיל.
- המכשיר מחובר לרשת Wi-Fi (אם משתמש המכשיר לא הגדיר גיבויים בחבילת הגלישה).
בפועל, התנאים האלה מתקיימים בערך כל לילה, אבל יכול להיות שמכשיר לא יבצע גיבוי אף פעם (לדוגמה, אם הוא אף פעם לא מתחבר לרשת). כדי לחסוך ברוחב הפס של הרשת, ההעלאה מתבצעת רק אם נתוני האפליקציה השתנו.
במהלך הגיבוי האוטומטי, המערכת משביתה את האפליקציה כדי לוודא שהיא לא כותבת יותר במערכת הקבצים. כברירת מחדל, מערכת הגיבוי מתעלמת מאפליקציות
שפועלות בחזית כדי למנוע חוויית משתמש גרועה. אפשר לשנות את
את התנהגות ברירת המחדל באמצעות הגדרה של המאפיין android:backupInForeground
נכון.
כדי לפשט את הבדיקה, Android כולל כלים שמאפשרים לך להפעיל באופן ידני לגיבוי של האפליקציה. מידע נוסף זמין במאמר בנושא בדיקה של גיבוי ושחזור.
שחזור לוח הזמנים
הנתונים משוחזרים בכל פעם שהאפליקציה מותקנת, גם מחנות Play וגם
במהלך הגדרת המכשיר (כשהמערכת מתקינה אפליקציות שהותקנו בעבר), או על ידי
פועלת התקנה של adb
. פעולת השחזור מתרחשת לאחר התקנת ה-APK
אבל לפני שהאפליקציה זמינה להפעלה על ידי המשתמש.
במהלך האשף להגדרת המכשיר הראשונית, מוצגת למשתמש רשימה של מערכי נתונים זמינים לגיבוי, והוא מתבקש לבחור ממנו את הנתונים שרוצים לשחזר. מערך הנתונים שנבחר לגיבוי יהפוך למערך הנתונים האב של המכשיר. המכשיר יכול לשחזר מהגיבויים שלו או מקבוצת הנתונים האב. אם הגיבויים הם מ- שני המקורות זמינים, המכשיר מתעדף גיבוי משלו. אם המשתמש לא השלים את האשף להגדרת המכשיר, אפשר לשחזר את המכשיר רק מהגיבויים שלו.
כדי לפשט את הבדיקה, Android כולל כלים שמאפשרים לך להפעיל באופן ידני לשחזור של האפליקציה. מידע נוסף זמין במאמר בנושא בדיקה של גיבוי ושחזור.
הפעלה והשבתה של הגיבוי
אפליקציות שמטרגטות ל-Android 6.0 (רמת API 23) ואילך משתתפות באופן אוטומטי
ב'גיבוי אוטומטי'. בקובץ המניפסט של האפליקציה, מגדירים את הערך הבוליאני android:allowBackup
כדי להפעיל או להשבית את הגיבוי. ערך ברירת המחדל הוא
true
, אבל מומלץ להגדיר את המאפיין באופן מפורש במניפסט, כי
שמוצגת בדוגמה הבאה:
<manifest ... >
...
<application android:allowBackup="true" ... >
...
</application>
</manifest>
כדי להשבית את הגיבויים, צריך להגדיר את android:allowBackup
ל-false
. ייתכן ש
אני רוצה לעשות זאת אם האפליקציה יכולה ליצור מחדש את המצב שלה באמצעות מנגנון אחר
או אם האפליקציה מטפלת במידע רגיש.
הכללה והחרגה של קבצים
כברירת מחדל, המערכת מגבה כמעט את כל נתוני האפליקציות. מידע נוסף זמין במאמר הבא: בקטע קבצים מגובים.
בקטע הזה נסביר איך להגדיר כללי XML בהתאמה אישית כדי לקבוע איזה קובץ מגובה למעלה. אם האפליקציה מטרגטת את Android 12 (רמת API 31) ואילך, צריך לציין קבוצה נוספת של כללי גיבוי XML, כפי שמתואר בקטע הזה, לתמוך בשינויים בשחזור גיבוי שבוצעו במכשירים שפועלות בהם גרסאות Android האלה.
שליטה בגיבוי ב-Android מגרסה 11 ומטה
כדי לקבוע אילו קבצים יגובו במכשירים, צריך לפעול לפי ההוראות שבסעיף הזה מערכת Android בגרסה 11 (רמת API 30) ומטה.
בקובץ
AndroidManifest.xml
, מוסיפים את השיטהandroid:fullBackupContent
לרכיב<application>
, כפי שאפשר לראות בדוגמה הבאה. המאפיין הזה מפנה לקובץ XML שמכיל כללי גיבוי.<application ... android:fullBackupContent="@xml/backup_rules"> </application>
יוצרים קובץ XML בשם
@xml/backup_rules
ב- הספרייהres/xml/
. בקובץ הזה, אפשר להוסיף כללים עם המאפיינים<include>
וגם רכיבי<exclude>
. בדוגמה הבאה מתבצעת גיבוי של כל ההעדפות המשותפות, מלבדdevice.xml
:<?xml version="1.0" encoding="utf-8"?> <full-backup-content> <include domain="sharedpref" path="."/> <exclude domain="sharedpref" path="device.xml"/> </full-backup-content>
הגדרת התנאים שנדרשים לגיבוי במכשיר
אם האפליקציה שומרת מידע רגיש במכשיר, אפשר לציין תנאים שבהם נתוני האפליקציה ייכללו בגיבוי של המשתמש. אפשר להוסיף את התנאים הבאים ב-Android 9 (רמת API 28) ואילך:
clientSideEncryption
: הגיבוי של המשתמש מוצפן באמצעות סוד מצד הלקוח. ההצפנה הזו מופעלת במכשירים עם Android 9 או גבוהה יותר, כל עוד המשתמש הפעיל את הגיבוי ב-Android 9 ואילך. הם הגדירו נעילת מסך (קוד אימות, קו ביטול נעילה או סיסמה) במכשיר.deviceToDeviceTransfer
: המשתמש מעביר את הגיבוי שלו למכשיר אחר מכשיר שתומך בהעברה מקומית ממכשיר למכשיר (לדוגמה, Google Pixel).
אם שדרגתם את מכשירי הפיתוח ל-Android 9, עליכם להשבית את התכונה ולהפעיל מחדש את גיבוי הנתונים לאחר השדרוג. הסיבה לכך היא שמערכת Android מצפינה את הגיבויים באמצעות סוד מצד הלקוח רק אחרי שהיא מעדכנת את המשתמשים בהגדרות או באשף ההגדרה.
כדי להצהיר על תנאי ההכללה, מגדירים את המאפיין requireFlags
לערך או לערכים שנבחרו ברכיבי <include>
בתוך קבוצת כללי הגיבוי:
גיבוי_כללים.xml
<?xml version="1.0" encoding="utf-8"?> <full-backup-content> <!-- App data isn't included in user's backup unless client-side encryption is enabled. --> <include domain="file" path="." requireFlags="clientSideEncryption" /> </full-backup-content>
אם האפליקציה מטמיעה מערכת גיבוי של מפתח/ערך או אם אתם מטמיעים את BackupAgent
בעצמכם, תוכלו גם להחיל את הדרישות המותנות האלה על הלוגיקה של הגיבוי על ידי ביצוע השוואה בייטית בין קבוצת הדגלים של התעבורה של אובייקט BackupDataOutput
לבין הדגלים FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED
או FLAG_DEVICE_TO_DEVICE_TRANSFER
של סוכן הגיבוי בהתאמה אישית.
קטע הקוד הבא מציג דוגמה לשימוש בשיטה הזו:
Kotlin
class CustomBackupAgent : BackupAgent() { override fun onBackup(oldState: ParcelFileDescriptor?, data: BackupDataOutput?, newState: ParcelFileDescriptor?) { if (data != null) { if ((data.transportFlags and FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED) != 0) { // Client-side backup encryption is enabled. } if ((data.transportFlags and FLAG_DEVICE_TO_DEVICE_TRANSFER) != 0) { // Local device-to-device transfer is enabled. } } } // Implementation of onRestore() here. }
Java
public class CustomBackupAgent extends BackupAgent { @Override public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) throws IOException { if ((data.getTransportFlags() & FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED) != 0) { // Client-side backup encryption is enabled. } if ((data.getTransportFlags() & FLAG_DEVICE_TO_DEVICE_TRANSFER) != 0) { // Local device-to-device transfer is enabled. } } // Implementation of onRestore() here. }
שליטה בגיבוי ב-Android מגרסה 12 ואילך
אם האפליקציה מטרגטת את Android 12 (רמת API 31) ואילך, צריך לפעול לפי השלבים שמפורטים בקטע הזה כדי לקבוע אילו קבצים יגובו במכשירים פועלים Android מגרסה 12 ואילך.
בקובץ
AndroidManifest.xml
, מוסיפים את השיטהandroid:dataExtractionRules
ל-<application>
כפי שאפשר לראות בדוגמה הבאה. המאפיין הזה מפנה לקובץ XML שמכיל כללי גיבוי.<application ... android:dataExtractionRules="backup_rules.xml"> </application>
יוצרים קובץ XML בשם
backup_rules.xml
ב- הספרייהres/xml/
. בקובץ הזה, אפשר להוסיף כללים עם המאפיינים<include>
וגם רכיבי<exclude>
. בדוגמה הבאה אפשר לגבות את כל ההעדפות המשותפות חוץ מ-device.xml
:<?xml version="1.0" encoding="utf-8"?> <data-extraction-rules> <cloud-backup [disableIfNoEncryptionCapabilities="true|false"]> <include domain="sharedpref" path="."/> <exclude domain="sharedpref" path="device.xml"/> </cloud-backup> </data-extraction-rules>
תחביר של הגדרות XML
תחביר ה-XML של קובץ התצורה משתנה בהתאם לגרסה של Android שהאפליקציה מטרגטת ופועלת בו.
Android מגרסה 11 ומטה
צריך להשתמש בתחביר XML הבא לקובץ התצורה ששולט בגיבוי למכשירים עם Android מגרסה 11 ומטה.
<full-backup-content> <include domain=["file" | "database" | "sharedpref" | "external" | "root" | "device_file" | "device_database" | "device_sharedpref" | "device_root" ] path="string" requireFlags=["clientSideEncryption" | "deviceToDeviceTransfer"] /> <exclude domain=["file" | "database" | "sharedpref" | "external" | "root" | "device_file" | "device_database" | "device_sharedpref" | "device_root" ] path="string" /> </full-backup-content>
Android מגרסה 12 ואילך
אם האפליקציה שלכם מטרגטת את Android 12 (רמת API 31) ואילך, צריך להשתמש בסינטקס ה-XML הבא בקובץ התצורה ששולט בגיבוי במכשירים עם Android 12 ואילך.
<data-extraction-rules> <cloud-backup [disableIfNoEncryptionCapabilities="true|false"]> ... <include domain=["file" | "database" | "sharedpref" | "external" | "root" | "device_file" | "device_database" | "device_sharedpref" | "device_root" ] path="string"/> ... <exclude domain=["file" | "database" | "sharedpref" | "external" | "root" | "device_file" | "device_database" | "device_sharedpref" | "device_root" ] path="string"/> ... </cloud-backup> <device-transfer> ... <include domain=["file" | "database" | "sharedpref" | "external" | "root" | "device_file" | "device_database" | "device_sharedpref" | "device_root" ] path="string"/> ... <exclude domain=["file" | "database" | "sharedpref" | "external" | "root" | "device_file" | "device_database" | "device_sharedpref" | "device_root" ] path="string"/> ... </device-transfer> </data-extraction-rules>
כל קטע בתצורה (<cloud-backup>
, <device-transfer>
) מכיל כללים שחלים רק על סוג ההעברה הזה. ההפרדה הזו מאפשרת, למשל, להחריג קובץ או ספרייה מגיבויים ב-Google Drive ועדיין להעביר אותם במהלך העברות ממכשיר למכשיר (D2D). האפשרות הזאת שימושית אם
יש קבצים גדולים מדי לגיבוי בענן, אבל אפשר להעביר אותם
בין מכשירים ללא בעיה.
אם אין כללים למצב גיבוי מסוים, למשל אם הקטע <device-transfer>
חסר, המצב הזה מופעל במלואו לכל התוכן, מלבד הספריות no-backup
ו-cache
, כפי שמתואר בקטע קבצים שגובים.
האפליקציה שלך יכולה להגדיר את הדגל disableIfNoEncryptionCapabilities
<cloud-backup>
כדי לוודא שהגיבוי יתבצע רק אם הוא יכול
מוצפן, למשל כשלמשתמש יש מסך נעילה. הגדרת האילוץ הזה מונעת שליחת גיבויים לענן אם המכשיר של המשתמש לא תומך בהצפנה, אבל מכיוון שהעברות D2D לא נשלחות לשרת, הן ממשיכות לפעול גם במכשירים שלא תומכים בהצפנה.
תחביר של רכיבי הכללה והחרגה
בתגים <full-backup-content>
, <cloud-backup>
ו-<device-transfer>
(בהתאם לגרסה של Android במכשיר ול-targetSDKVersion
של האפליקציה), אפשר להגדיר רכיבים מסוג <include>
ו-<exclude>
:
<include>
קובץ או תיקייה לגיבוי. כברירת מחדל, הגיבוי האוטומטי כולל כמעט את כל קובצי האפליקציות. אם מציינים רכיב
<include>
, המערכת כבר לא כוללת קבצים כברירת מחדל ומגבה רק את הקבצים שצוינו. כדי לכלול כמה קבצים, צריך להשתמש בכמה רכיבי<include>
.ב-Android מגרסה 11 ומטה, הרכיב הזה יכול להכיל גם את הקוד
requireFlags
, שאותו הקטע מתאר איך להגדיר בהמשך מפורטות דרישות מותנות לגיבוי.קבצים בספריות שמוחזרים על ידי
getCacheDir()
,getCodeCacheDir()
אוgetNoBackupFilesDir()
תמיד מוחרגים, גם אם מנסים לכלול אותם.<exclude>
קובץ או תיקייה שרוצים להחריג מהגיבוי. הנה כמה דוגמאות קבצים שבדרך כלל לא נכללים בגיבוי:
קבצים שיש להם מזהים ספציפיים למכשיר, שהנפיק אותם שרת או שנוצרו במכשיר. לדוגמה, Firebase Cloud Messaging (FCM) צריך ליצור אסימון רישום בכל פעם שמשתמש מתקין את האפליקציה במכשיר חדש. אם טוקן הרישום הישן ישוחזר, יכול להיות שהאפליקציה תתנהג בצורה לא צפויה.
קבצים שקשורים לניפוי באגים באפליקציות.
קבצים גדולים שגורמים לאפליקציה לחרוג ממכסת הגיבוי של 25MB.
כל רכיב <include>
ורכיב <exclude>
חייבים לכלול את שני הערכים הבאים
:
domain
מציינת את מיקום המשאב. הערכים החוקיים למאפיין הזה הם:
root
: הספרייה במערכת הקבצים שבה מאוחסנים כל הקבצים הפרטיים ששייכים לאפליקציה הזו.file
: ספריות שהוחזרו על ידיgetFilesDir()
.database
: ספריות שהוחזרו על ידיgetDatabasePath()
. כאן מאוחסנות מסדי נתונים שנוצרו באמצעותSQLiteOpenHelper
.sharedpref
: הספרייה שבה שמוריםSharedPreferences
.external
: הספרייה שהוחזרה על ידיgetExternalFilesDir()
.device_root
: כמוroot
, אבל לאחסון המוגן במכשיר.device_file
: כמוfile
, אבל לאחסון המוגן במכשיר.device_database
: כמוdatabase
, אבל לאחסון שמוגן במכשיר.device_sharedpref
: כמוsharedpref
, אבל לאחסון המוגן במכשיר.
path
מציינת קובץ או תיקייה שייכללו או לא ייכללו בגיבוי. חשוב לשים לב:
- לא ניתן להשתמש בתווים כלליים לחיפוש או בסינטקס של ביטויים רגולריים במאפיין הזה.
- אפשר להפנות לספרייה הנוכחית באמצעות
./
, אבל לא ניתן להפנות לספריית ההורה, למשל באמצעות..
, לצורך אבטחה סיבות נוספות. - אם מציינים ספרייה, הכלל חל על כל הקבצים בספרייה ועל ספריות המשנה הרקורסיביות.
הטמעת BackupAgent
אפליקציות שמטמיעות את הגיבוי האוטומטי לא צריכות להטמיע BackupAgent
.
עם זאת, אפשר גם להטמיע BackupAgent
בהתאמה אישית. בדרך כלל יש לכך שתי סיבות:
אתם רוצים לקבל התראות על אירועי גיבוי, כמו
onRestoreFinished()
ו-onQuotaExceeded(long, long)
. שיטות ה-callback האלה מופעלות גם אם האפליקציה לא פועלת.אי אפשר להביע בקלות את קבוצת הקבצים שרוצים לגבות באמצעות כללי XML. במקרים הנדירים האלה, אפשר להטמיע
BackupAgent
שיבטל את השינוייםonFullBackup(FullBackupDataOutput)
כדי לאחסן את מה שאתם רוצים. כדי להמשיך הטמעת ברירת המחדל של המערכת, מפעילים את השיטה המתאימה מחלקה-על שלsuper.onFullBackup()
.
אם מטמיעים BackupAgent
, כברירת מחדל המערכת מצפה מהאפליקציה
לבצע גיבוי ושחזור של ערך מפתח. כדי להשתמש בגיבוי אוטומטי מבוסס קבצים
במקום זאת, צריך להגדיר את המאפיין android:fullBackupOnly
כ-true
למניפסט של האפליקציה.
במהלך פעולות הגיבוי והשחזור האוטומטיות, המערכת מפעילה את האפליקציה במצב מוגבל כדי למנוע מהאפליקציה לגשת לקבצים שעשויים לגרום להתנגשויות, ולאפשר לאפליקציה להריץ שיטות של קריאה חוזרת (callback) ב-BackupAgent
שלה. במצב המוגבל הזה, הפעילות הראשית של האפליקציה לא מופעלת באופן אוטומטי, ספקי התוכן לא מופעלים והיצירה של קלאס הבסיס Application
מתבצעת במקום יצירת קלאס משנה כלשהו שהוצהר במניפסט של האפליקציה.
BackupAgent
חייב להטמיע את השיטות המופשטות onBackup()
וגם
onRestore()
, שמשמשים לגיבוי מפתח/ערך. אם אתם לא רוצים לבצע גיבוי של מפתח/ערך, תוכלו להשאיר את ההטמעה של השיטות האלה ריקה.
מידע נוסף זמין במאמר Extend BackupAgent.