Một ứng dụng Android ghi nhớ dữ liệu của nó sau khi gỡ cài đặt và cài đặt lại


191

Trong khi phát triển ứng dụng Android nhắm mục tiêu tất cả các phiên bản trên 4.1, tôi đã quan sát thấy việc gỡ cài đặt ứng dụng của mình và cài đặt lại ứng dụng không xóa dữ liệu của nó.

Ứng dụng này được thiết kế để lưu trữ các chi tiết mà nó yêu cầu trong màn hình đầu tiên. Sau khi gỡ cài đặt và cài đặt lại trong phiên bản HĐH 4.4.4, ứng dụng sẽ nhắc người dùng điền dữ liệu, điều này là bình thường. Tuy nhiên, trong phiên bản 6.0, trình tự cài đặt / gỡ cài đặt tương tự mang lại dữ liệu đầu vào ban đầu.

Tôi đã cố gắng đảm bảo bằng cách truy cập /data/data/my package folderđể xem cơ sở dữ liệu đã biến mất sau khi gỡ cài đặt và thực sự thư mục đó sẽ bị xóa trong khi gỡ cài đặt.

Tôi đã cố gắng xóa ứng dụng bằng cách truy cập trang cài đặt, thông qua Titanium Backup và kết quả đều giống nhau. Thiết bị được root Nexus 5 chạy v6.0.

Điều gì có thể là lý do cho hành vi kỳ lạ này?

Câu trả lời:


322

Đó là vì Android 6 có tính năng sao lưu tự động. Bạn cần điều chỉnh android:allowBackupandroid:fullBackupContenttrong <application>thẻ kê khai của mình nếu bạn không muốn dữ liệu của mình được sao lưu hoặc nếu bạn muốn bao gồm hoặc loại trừ một số tài nguyên. Đó không phải là một lỗi.

Tìm hiểu thêm về AutoBackup trên Android tại đây .


27
Đây là câu trả lời đúng và nó hoạt động với tôi (tôi có cùng một vấn đề) Để tránh hành vi này là cần thiết để đặt android: allowBackup = "false"android: fullBackupContent = "false" trong manifest.xml
frusso

32
Trong trường hợp một số bạn thắc mắc, android: allowBackup và android: fullBackupContent là các thuộc tính để thêm vào <application />
Jack '

2
Từ tài liệu: android: fullBackupContent trỏ đến tệp XML có chứa các tùy chọn sao lưu. Theo mặc định, hầu hết các tập tin được sao lưu. Mặc dù cài đặt này thành "false" không gây ra bất kỳ lỗi nào, tôi đoán nó đã sai khi đặt.
bajicdusko

3
Không chắc chắn tại sao họ giữ hành vi mặc định để sao lưu, vì hành vi không đồng bộ với các phiên bản trước nên trở nên khó chịu. Những người muốn nó có thể bật nó lên.
Atul

7
Bất cứ ai cũng biết làm thế nào để xóa các bản sao lưu?
1800 THÔNG TIN

29

Câu trả lời của greywolf82 là đúng nhưng tôi muốn thêm một số thông tin vào đây.

Khi phát triển ứng dụng Android của tôi (sử dụng Xamarin), tôi nhận thấy rằng bất cứ khi nào tôi khởi chạy lại ứng dụng từ Visual Studio, dữ liệu của tôi sẽ trở lại dữ liệu từ vài tháng trước. Sẽ không có vấn đề gì nếu tôi chỉ dừng lại và chạy lại nó từ VS hoặc nếu tôi gỡ cài đặt hoàn toàn ứng dụng và cài đặt lại nó.

Cũng đáng lưu ý rằng chúng tôi không bao giờ nói rõ ràng với ứng dụng để lưu trữ bản sao lưu.

Bản sao lưu dường như cũng ghi đè lên dữ liệu mới hơn khi khởi chạy từ Visual Studio và chúng tôi có báo cáo về người dùng sử dụng bản phát hành của ứng dụng của chúng tôi và cũng nhận được dữ liệu mới hơn được ghi đè bởi các bản sao lưu.

Vì tôi không biết chính xác khi nào sao lưu và khôi phục xảy ra, tính năng này dường như chỉ gây ra sự cố.

Chúng tôi đã sửa đổi AndroidManifest của chúng tôi như được hiển thị trong xml sau:

<?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>

Khi chúng tôi đặt giá trị thành false một cách rõ ràng, tất cả dường như hoạt động. Tôi hy vọng đây sẽ là một tính năng chọn tham gia nhưng ... có vẻ như nó có thể được bật theo mặc định cho các ứng dụng không chỉ định giá trị theo cách nào.


Cảm ơn. Tôi gặp vấn đề tương tự.
Hadi Fooladi Talari

15

Bạn nên kiểm tra cài đặt Sao lưu và Đặt lại của thiết bị và tắt Khôi phục tự động (khi cài đặt lại ứng dụng, các cài đặt và dữ liệu được sao lưu sẽ được khôi phục.)

Tắt tự động sao lưu khác với tự động khôi phục. Nếu bạn nghĩ sẽ hữu ích khi bật tự động sao lưu cho ứng dụng của mình, hãy làm như vậy. Nhưng nếu bạn nghĩ rằng điều này sẽ khiến người dùng cuối không biết rằng tính năng tự động khôi phục thiết bị của họ được bật, hãy tắt nó đi.

Trong trường hợp của tôi, tôi đã tắt tính năng allowBackup, nhưng vì tôi đã có bản sao lưu của phiên bản trước trên Cloud, nên nó vẫn tiếp tục khôi phục.

Xem hình ảnh làm tài liệu tham khảo cho thiết bị Samsung trên Android 6.0. Các thiết bị và phiên bản khác có thể có một màn hình khác. Xem hình ảnh dưới đây.

Cài đặt khôi phục tự động trong Sao lưu và đặt lại


Tôi có cùng một vấn đề, ứng dụng của tôi đã sao lưu dữ liệu cho một vài người dùng khi nó được bật. Có khả năng xóa / loại bỏ dữ liệu được đồng bộ hóa không?
Aditya Chauhan

5

Gần đây tôi cần tận dụng các tính năng này, tôi đã có thể khám phá tài liệu và sau khi thử nghiệm rộng rãi, đây là những gì tôi có thể suy ra:

Android: allowbackup - sẽ sao lưu dữ liệu ứng dụng cục bộ trên thiết bị được đặt trên đó.

Android: fullBackupContent - được sử dụng cùng với api khôi phục sao lưu của Google và CÓ THỂ được kiểm soát thông qua tệp xml để chỉ định chính xác những gì cần sao lưu, cũng như lớp BackupManager mà bạn có thể triển khai để kiểm soát thêm quá trình.

Tuy nhiên, tài liệu nêu rõ và tôi đã xác nhận với thử nghiệm rằng việc khôi phục sẽ chỉ xảy ra khi thiết bị được khôi phục và quá trình dữ liệu ứng dụng khôi phục được kích hoạt. HOẶC nó cũng sẽ khôi phục khi ứng dụng được tải thông qua adb, đây là những gì chúng tôi làm khi chạy ứng dụng để kiểm tra hoặc gỡ lỗi trên thiết bị của mình thông qua Android Studio. Lưu ý rằng nếu bạn đặt android: allowbackup nhưng không cấu hình android: fullBackupContent bằng mã api của Google thì dữ liệu ứng dụng chỉ được lưu trữ cục bộ, trong khi nếu bạn định cấu hình đúng thì nếu ứng dụng của bạn được sao lưu và bạn có được một thiết bị mới, ứng dụng mới dữ liệu được lưu trữ trên đám mây để có thể khôi phục trên thiết bị mới.


3

Thêm android: allowBackup = "false" trong thẻ ứng dụng trong tệp Manifest đã giải quyết vấn đề của tôi.

Dưới đây là tài liệu Android để Sao lưu dữ liệu người dùng với Tự động sao lưu


2

Chỉ cần thay đổi android: allowBackup = "true" thành android: allowBackup = "false" trong manifiest.xml. Nó sẽ được làm việc.

<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

Chỉ cần thêm vào điều này, chúng tôi thấy rằng trong Android 9 (trên thiết bị Nokia của HMD) rằng các tài sản đã được giữ, ngay cả sau khi xóa ứng dụng qua giao diện và qua adb.

Câu trả lời của việc thêm:

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

Rõ ràng, đây không phải là một câu trả lời mới - mà là một quan sát cho những người ở cùng vị trí với chúng tôi.


2

Nếu bạn đang nhắm mục tiêu Android 10 thì bạn phải đặt android:hasFragileUserData="true"thẻ ứng dụng củaAndroidManifest.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 là một cài đặt bảng kê khai mới (tôi đoán vậy). Nếu đúng, người dùng sẽ được nhắc giữ dữ liệu của ứng dụng khi gỡ cài đặt. Điều này có vẻ chín muồi cho việc lạm dụng, nhưng tôi có thể thấy nó có thể hữu ích cho một số ứng dụng.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.