Приложение отлично работает при отладке на тестовом устройстве, но не в версии apk, оно не получает переменные post.class из firebase

В моем приложении есть сообщения в действиях, у сообщения есть изображение и кнопка «Мне нравится», а также кнопка «Поделиться». При отладке на тестовое устройство все работает, а в опубликованной версии нет. После публикации приложения в магазине Google все переменные в post.class не принимаются/не отображаются (все, что использует пост.получить, например, пост.получить изображение(), не получает значения из базы данных firebase. с другой стороны, значения, которые хранятся вне сообщения получены (например, у меня есть отдельный узел количество звезд, и я получаю значение дочернего счета, и он работает нормально). Я пробовал все возможные решения, но ничего не помогло: Обновил приложение с помощью ключа выпуска SHA (ключ загрузки), затем сгенерировал подписанный apk (aab), все три SHA (ключ отладки, выпуска и подписи приложения) сохраняются под отпечатком моего проекта firebase. Я также проверил правила базы данных firebase. Я изменил некоторую переменную в post.class с общедоступной на частную.

Я скачал APK прямо на устройство, и он тоже не работает. он отлично работает на тестовом устройстве. Спасибо, если кто-то может помочь, и большое спасибо заранее.

это пост.класс

// [START post_class]

@IgnoreExtraProperties

public class Post {

private String image;
public String uid;
public String author;
public String title;
public String body;
public String videoLink;
private int starCount = 0;
private int starCount2 = 0;
private Map<String, Boolean> stars = new HashMap<>();

//shares
private String ntDeeplink;
private int ntNumShares = 0 ;
private String postID;

public Post() {
    // Default constructor required for calls to DataSnapshot.getValue(Post.class)
}

public Post(String image, String uid, String author, String title, String body, String videoLink) {
    this.image = image;
    this.uid = uid;
    this.author = author;
    this.title = title;
    this.body = body;
    this.videoLink = videoLink;


}

//note 2 constructor here were icrease instead of one , and the above one in connectedto some methods already


public Post(int starCount, Map<String, Boolean> stars, String ntDeeplink, int ntNumShares, String ntPostID) {
    this.starCount = starCount;
    this.stars = stars;
    this.ntDeeplink = ntDeeplink;
    this.ntNumShares = ntNumShares;
    this.postID = postID;
}

public Post(int starCount2) {
    this.starCount2 = starCount2;
}

// [START post_to_map]   ....this and bindToPost(if there is a view) replace the method of populateViewHolder
// but only for non Storage Items like Images
@Exclude
public Map<String, Object> toMap() {
    HashMap<String, Object> result = new HashMap<>();

    result.put("image",image);
    result.put("uid", uid);
    result.put("author", author);
    result.put("title", title);
    result.put("body", body);
    result.put("videoLink", videoLink);
    result.put("starCount", starCount);
    result.put("starCount2", starCount2);
    result.put("stars", stars);
    //numShares also created int the contants
    result.put("ntNumShares", ntNumShares);
    result.put("ntDeeplink", ntDeeplink);
    result.put("postID", postID);

    return result;
}

//shares

public String getImage() {
    return image;
}

public void setImage(String image) {
    this.image = image;
}

public String getUid() {
    return uid;
}

public void setUid(String uid) {
    this.uid = uid;
}

public String getAuthor() {
    return author;
}

public void setAuthor(String author) {
    this.author = author;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getBody() {
    return body;
}

public void setBody(String body) {
    this.body = body;
}

public String getVideoLink() {
    return videoLink;
}

public void setVideoLink(String videoLink) {
    this.videoLink = videoLink;
}

public int getStarCount() {
    return starCount;
}

public void setStarCount(int starCount) {
    this.starCount = starCount;
}

public int getStarCount2() {
    return starCount2;
}

public void setStarCount2(int starCount2) {
    this.starCount2 = starCount2;
}

public Map<String, Boolean> getStars() {
    return stars;
}

public void setStars(Map<String, Boolean> stars) {
    this.stars = stars;
}

public String getNtDeeplink() {
    return ntDeeplink;
}

public void setNtDeeplink(String ntDeeplink) {
    this.ntDeeplink = ntDeeplink;
}

public int getNtNumShares() {
    return ntNumShares;
}

public void setNtNumShares(int ntNumShares) {
    this.ntNumShares = ntNumShares;
}

public String getPostID() {
    return postID;
}

public void setPostID(String postID) {
    this.postID = postID;
}


// [END post_to_map]

} // [КОНЕЦ post_class]

и это, например, как я получаю изображение в действии

        ValueEventListener postListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            // Get Post object and use the values to update the UI
            final Post post = dataSnapshot.getValue(Post.class);
            final DatabaseReference postRef = mPostReference;
            final DatabaseReference postRefLikes = mPostReferenceLikes;


            // [START_EXCLUDE]

            //Image
            String image = null;
            if (post != null) {
                image = post.getImage();
            }
            Picasso.with(HbDetailActivity.this).load(image).placeholder(R.drawable.likes_hl_gr).into(hbDActivityPostImage);
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел решение своего вопроса после двух дней поиска: Что создавало эту проблему, так это Proguard. При создании подписанного APK Proguard очищает все неиспользуемые коды или классы. В моем случае post.class был ошибочно удален Proguard:

Решение:

  • Я поместил post.class и другие классы, которые я хочу убедиться, что Proguard не удалит их в один пакет (модели), вы можете поместить их в разные пакеты, но вам нужно перечислить их все в соответствии с правилами Proguard, как показано ниже:

  • В майском проекте андроид студии я открыл proguard-rules.pro

  • Я помещаю строку ниже в список и не допускаю удаления классов, когда Proguard создает подписанный APK (или aab)

    -keepclassmembers class com.mydomain.app.models.** {*;} 
    

Где com.domain.app — имя пакета

Надеюсь, это сэкономит кому-то время.

Это было так полезно, хотя в моем случае я использовал -keep class com.hamsoftug.cashflow.models.** {*;}

Neri 11.06.2019 14:40

Другие вопросы по теме