גיבוי אוטומטי לאפליקציות מגבה באופן אוטומטי את נתוני המשתמש מאפליקציות שמטרגטות ופועלות ב-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
לערך true.
כדי לפשט את הבדיקה, מערכת Android כוללת כלים שמאפשרים להתחיל באופן ידני גיבוי של האפליקציה. מידע נוסף זמין במאמר בדיקת הגיבוי והשחזור.
שחזור לוח הזמנים
הנתונים משוחזרים בכל פעם שהאפליקציה מותקנת, בין אם מחנות Play, במהלך הגדרת המכשיר (כשהמערכת מתקינה אפליקציות שהותקנו בעבר) או על ידי הפעלת adb
install. פעולת השחזור מתרחשת אחרי התקנת קובץ ה-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 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()
, שמשמשות לגיבוי של מפתחות-ערכים. אם אתם לא רוצים לבצע גיבוי של מפתח/ערך, תוכלו להשאיר את ההטמעה של השיטות האלה ריקה.
מידע נוסף זמין במאמר הרחבת BackupAgent.