Изменено имя переменной Firebase firestore

# #android #firebase #google-cloud-firestore

Вопрос:

Мои переменные firestore сохраняются под другими именами в cloud firestore. Я думаю, что это связано с proguard, но я не понимаю.

Ниже приведено мое имя пользователя.

 public String id;
public String name;
public String number;
public String profilePic;
public String shopPic;
 

а ниже приведен скриншот, который сохранен в firestore.
sc

Вот несколько связанных кодов, которые очень просты

         FirestoreUrls.get().getAccountsCollection()
                .document().set(binding.getUser()).addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                hideProgressBar();
                handleFirebaseException(getClass(), task, true);
            }
        });
 

Ответ №1:

Вы столкнулись с этой проблемой, потому что вы используете Proguard для обеспечения безопасности, который перемешивает код, чтобы другие не могли его увидеть сразу после создания APK приложения. Это также доступно в случае Firebase. Чтобы решить эту проблему, пожалуйста, добавьте следующие строки кода в свой build.gradle файл:

 buildTypes {
    release {
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}
 

Затем добавьте следующие правила в файл Proguard вашего проекта, чтобы предотвратить такое поведение, заменив имя пакета своим собственным именем пакета:

 -keepattributes Signature //Global rule

-keepclassmembers class com.example.YourModelClass.** {
  *;
}
 

Пожалуйста, ознакомьтесь с документами для получения дополнительной информации:

Комментарии:

1. Я проверил эту конфигурацию, она все та же

2. Может быть, это вам немного поможет.

3. Еще нет Алекс Мамо

4. Привет @AlexMamo Я сталкиваюсь с той же проблемой, и это решает мою проблему (спасибо), но версия моего приложения в Google Play все еще меняет имена. Следует ли создать новый APK-файл и загрузить его в Google Play, чтобы решить проблему?

5. @AmrJyniat Да, новый APK, так как файлы теперь изменены.

Ответ №2:

proguard переименовывает поля и имена классов в более короткие. Чтобы предотвратить это, вы можете исключить этот класс из оптимизации proguard с "-keep class com.package.MyClass" помощью строки в proguard-android.txt файле.

Но ИМХО вместо этого вы должны где-то в своем коде сопоставить свои переменные с соответствующими строками, а затем отправить строки в cloud firestore. Потому что на данный момент любой рефакторинг в вашем классе (например, переименование полей) может привести к нарушению соответствия вашего имени firestore.

Обновить:

Похоже, что вы можете сопоставить файлы объектов с соответствующими строками таким образом:

 User user = binding.getUser()

Map<String, Object> docData = new HashMap<>();
docData.put("id", user.id);
docData.put("name", user.name);
docData.put("number", user.number);
docData.put("profilePic", user.profilePic);
docData.put("shopPic", user.shopPic);

FirestoreUrls.get().getAccountsCollection()
                .document().set(docData)...
 

Комментарии:

1. Но proguard работает для версии выпуска, в настоящее время я работаю над отладкой apk.

2. Да, это способ