แอพ Android จะจดจำข้อมูลหลังจากถอนการติดตั้งและติดตั้งใหม่


194

ในขณะที่การพัฒนาแอพ Android ที่กำหนดเป้าหมายทุกเวอร์ชั่นด้านบน 4.1 ฉันสังเกตว่าการถอนการติดตั้งแอพของฉันและการติดตั้งอีกครั้งนั้นไม่ได้ล้างข้อมูล

แอพได้รับการออกแบบมาเพื่อเก็บรายละเอียดที่ถามในหน้าจอแรก หลังจากถอนการติดตั้งและติดตั้งอีกครั้งใน OS เวอร์ชัน 4.4.4 แอปจะแจ้งให้ผู้ใช้กรอกข้อมูลซึ่งเป็นเรื่องปกติ อย่างไรก็ตามในเวอร์ชัน 6.0 ลำดับการติดตั้ง / ถอนการติดตั้งเดียวกันจะนำข้อมูลที่ป้อนกลับมา

ฉันพยายามตรวจสอบให้แน่ใจโดยไปที่/data/data/my package folderเพื่อดูฐานข้อมูลหายไปหลังจากถอนการติดตั้งและแน่นอนว่าโฟลเดอร์จะถูกลบระหว่างการถอนการติดตั้ง

ฉันพยายามลบแอพโดยไปที่หน้าการตั้งค่าผ่าน Titanium Backup และผลลัพธ์เหมือนกัน อุปกรณ์ดังกล่าวรูท Nexus 5 ที่รัน v6.0

อะไรคือสาเหตุของพฤติกรรมแปลก ๆ นี้?

คำตอบ:


329

เป็นเพราะ Android 6 มีการสำรองข้อมูลอัตโนมัติ คุณต้องปรับแต่งandroid:allowBackupและandroid:fullBackupContentใน<application>แท็กรายการของคุณหากคุณไม่ต้องการสำรองข้อมูลของคุณหรือถ้าคุณต้องการที่จะรวมหรือไม่รวมทรัพยากรบางอย่าง มันไม่ใช่ข้อผิดพลาด

เพิ่มเติมเกี่ยวกับการสำรองข้อมูลอัตโนมัติบน Android ที่นี่


28
นี่เป็นคำตอบที่ถูกต้องและใช้ได้กับฉัน (ฉันมีปัญหาเดียวกัน) เพื่อหลีกเลี่ยงพฤติกรรมนี้จำเป็นต้องใส่ android: allowBackup = "false"และ android: fullBackupContent = "false" ใน manifest.xml
frusso

33
ในกรณีที่บางคนสงสัย, android: allowBackup และ android: fullBackupContent เป็นคุณสมบัติที่จะเพิ่มใน <application />
Jack '

2
จากเอกสาร: android: fullBackupContent ชี้ไปที่ไฟล์ XML ซึ่งมีตัวเลือกการสำรองข้อมูล โดยค่าเริ่มต้นไฟล์ส่วนใหญ่จะถูกสำรอง แม้ว่าการตั้งค่านี้เป็น "เท็จ" ไม่ก่อให้เกิดข้อผิดพลาดใด ๆ แต่ฉันคิดว่ามันผิดที่จะตั้งค่า
bajicdusko

3
ไม่แน่ใจว่าเพราะเหตุใดพวกเขาจึงใช้การสำรองข้อมูลเป็นค่าเริ่มต้นเนื่องจากพฤติกรรมนั้นไม่ได้ซิงค์กับเวอร์ชันก่อนหน้าดังนั้นจึงน่ารำคาญ ผู้ที่ต้องการให้สามารถเปิดใช้งานได้
Atul

7
ใครรู้วิธีลบข้อมูลสำรอง?
1800 ข้อมูล

31

คำตอบของ greywolf82 ถูกต้อง แต่ฉันต้องการเพิ่มข้อมูลบางอย่างลงในนี้

เมื่อพัฒนาแอพ Android ของฉัน (โดยใช้ Xamarin) ฉันสังเกตว่าเมื่อใดก็ตามที่ฉันเปิดแอปจาก Visual Studio อีกครั้งข้อมูลของฉันจะเปลี่ยนกลับไปเป็นข้อมูลจากไม่กี่เดือนที่ผ่านมา ไม่สำคัญว่าฉันจะหยุดและเรียกใช้งานอีกครั้งจาก VS หรือหากฉันถอนการติดตั้งแอพอย่างสมบูรณ์และติดตั้งใหม่

นอกจากนี้ยังเป็นที่น่าสังเกตว่าเราไม่เคยบอกให้แอปจัดเก็บข้อมูลสำรองไว้อย่างชัดเจน

การสำรองข้อมูลดูเหมือนว่าจะเขียนทับข้อมูลที่ใหม่กว่าเมื่อเปิดจาก Visual Studio และเรามีรายงานของผู้ใช้โดยใช้ build build ของแอพของเราและยังได้รับข้อมูลที่ใหม่กว่าโดยการสำรองข้อมูล

เนื่องจากฉันไม่ทราบว่าเมื่อใดการสำรองข้อมูลและการคืนค่าเกิดขึ้นคุณสมบัตินี้ดูเหมือนว่าจะทำให้เกิดปัญหาเท่านั้น

เราได้แก้ไข AndroidManifest ดังที่แสดงใน xml ต่อไปนี้:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.XXXXXXX" android:versionName="8.0.0" android:installLocation="auto" android:versionCode="439">
    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="24" />
    <application 
               android:label="@string/appName" 
               android:icon="@drawable/icon_small" 
               android:installLocation="internalOnly" 
               android:largeHeap="true"
               android:allowBackup="false"
               android:fullBackupOnly="false"
               />
...
</manifest>

เมื่อเราตั้งค่าเป็นเท็จอย่างชัดเจนดูเหมือนว่าทั้งหมดจะทำงาน ฉันคาดหวังว่านี่จะเป็นคุณสมบัติการเลือกใช้ แต่ ... ดูเหมือนว่าอาจเปิดอยู่ตามค่าเริ่มต้นสำหรับแอปที่ไม่ได้ระบุค่าอย่างใดอย่างหนึ่ง


ขอบคุณ ฉันมีปัญหาเดียวกัน
Hadi Fooladi Talari

15

คุณควรตรวจสอบการตั้งค่าการสำรองและรีเซ็ตอุปกรณ์ของคุณและปิดการคืนค่าอัตโนมัติ (เมื่อติดตั้งแอปพลิเคชันใหม่การตั้งค่าการสำรองข้อมูลและข้อมูลจะถูกกู้คืน)

การปิดการสำรองข้อมูลอัตโนมัตินั้นแตกต่างจากการกู้คืนอัตโนมัติ หากคุณคิดว่าจะเป็นการดีหากเปิดการสำรองข้อมูลอัตโนมัติสำหรับแอปพลิเคชันของคุณ แต่ถ้าคุณคิดว่าการทำเช่นนี้จะทำให้ผู้ใช้ปลายทางที่ไม่ทราบว่าคุณลักษณะการกู้คืนอัตโนมัติของอุปกรณ์นั้นเปิดใช้งานอยู่

ในกรณีของฉันฉันปิดคุณลักษณะ allowBackup แต่เนื่องจากฉันมีข้อมูลสำรองของเวอร์ชันก่อนหน้าบน Cloud อยู่แล้วจึงยังคงทำการกู้คืน

ดูภาพเป็นข้อมูลอ้างอิงสำหรับอุปกรณ์ Samsung บน Android 6.0 อุปกรณ์และรุ่นอื่น ๆ อาจมีหน้าจอที่แตกต่างกัน ดูภาพด้านล่าง

การตั้งค่าการคืนค่าอัตโนมัติภายใต้การสำรองและรีเซ็ต


ฉันมีปัญหาเดียวกันแอพของฉันสำรองข้อมูลสำหรับผู้ใช้ไม่กี่รายเมื่อเปิดใช้งาน มีความเป็นไปได้ที่จะล้าง / ทิ้งข้อมูลที่ซิงค์หรือไม่
Aditya Chauhan

5

เมื่อเร็ว ๆ นี้ฉันต้องการใช้ประโยชน์จากคุณสมบัติเหล่านี้ฉันสามารถค้นพบเอกสารและเมื่อทำการทดสอบอย่างละเอียดนี่คือสิ่งที่ฉันสามารถอนุมานได้:

Android: allowbackup - จะสำรองข้อมูลแอปในเครื่องบนอุปกรณ์ที่ตั้งอยู่

Android: fullBackupContent - ใช้ร่วมกับ API การสำรองข้อมูลสำรองของ Google และสามารถควบคุมได้ผ่านไฟล์ xml เพื่อระบุสิ่งที่จะสำรองอย่างแน่นอนรวมถึงคลาส BackupManager ที่คุณสามารถนำไปใช้เพื่อควบคุมกระบวนการเพิ่มเติม

อย่างไรก็ตามสถานะเอกสารประกอบและฉันได้รับการยืนยันด้วยการทดสอบว่าการคืนค่าจะเกิดขึ้นก็ต่อเมื่ออุปกรณ์ได้รับการกู้คืนและกระบวนการเรียกคืนข้อมูลแอพจะถูกเรียกใช้ หรือมันจะกู้คืนเมื่อแอปถูก sideloaded ผ่าน adb ซึ่งเป็นสิ่งที่เราทำเมื่อเราเรียกใช้แอพเพื่อทดสอบหรือดีบักบนอุปกรณ์ของเราผ่าน Android Studio โปรดทราบว่าหากคุณตั้งค่า android: allowbackup แต่ไม่ได้กำหนดค่า android: fullBackupContent ด้วยรหัส Google api ข้อมูลแอปจะถูกเก็บไว้ในเครื่องเท่านั้นในขณะที่ถ้าคุณกำหนดค่าไว้อย่างถูกต้องแล้วหากแอปของคุณสำรองข้อมูลและคุณได้อุปกรณ์ใหม่ ข้อมูลถูกเก็บไว้บนคลาวด์เพื่อให้สามารถเรียกคืนได้ในอุปกรณ์ใหม่


3

การเพิ่ม android: allowBackup = "false" ภายใต้แท็กแอปพลิเคชันในไฟล์ Manifest แก้ไขปัญหาของฉันได้

นี่คือเอกสาร Android สำหรับการสำรองข้อมูลผู้ใช้ด้วยการสำรองข้อมูลอัตโนมัติ


2

เพียงเปลี่ยน android: allowBackup = "true" เป็น android: allowBackup = "false" ใน manifiest.xml มันจะทำงานได้

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    <application
        android:allowBackup="false"
        android:icon="@mipmap/app_icon"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
</manifest>

2

เพียงเพิ่มเข้าไปในสิ่งนี้เราพบว่าใน Android 9 (บนอุปกรณ์ HMD Nokia) ที่จัดขึ้นแม้หลังจากลบแอพผ่านทางอินเทอร์เฟซและผ่าน adb

คำตอบของการเพิ่ม:

android:allowBackup="false" android:fullBackupOnly="false"

เห็นได้ชัดว่านี่ไม่ใช่คำตอบใหม่ - แต่เป็นการสังเกตสำหรับคนที่อยู่ในตำแหน่งเดียวกับเรา


2

หากคุณกำหนดเป้าหมายเป็น Android 10 คุณต้องใส่android:hasFragileUserData="true"ในแท็กแอปพลิเคชันของAndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
  <application
    android:name=".MyApplication"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    android:allowBackup="true"
    android:hasFragileUserData="true">

    .....

     </application>

 </manifest>

android: hasFragileUserData เป็นการตั้งค่ารายการใหม่ (ฉันคาดเดา) “ หากเป็นจริงผู้ใช้จะได้รับแจ้งให้เก็บข้อมูลของแอปเมื่อถอนการติดตั้ง” นี่ดูเหมือนจะสุกงอมสำหรับการละเมิด แต่ฉันสามารถดูว่ามันอาจมีประโยชน์สำหรับแอพบางตัว

ดูhttps://commonsware.com/blog/2019/06/06/random-musings-q-beta-4.html

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.