# #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.
Вот несколько связанных кодов, которые очень просты
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
файле.
Но IMHO вместо этого вы должны где-то в своем коде сопоставить переменные с правильными строками, а затем отправить строки в 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. Да, это способ