为什么 firebase 在 playstore 上发布我的应用程序后要添加一个额外的日历节点?
Why is firebase adding an extra calendar node after publishing my app on playstore?
使用这些优化发布我的应用程序后;
minifyEnabled true
shrinkResources true
useProguard true
Firebase 将来自 CampaignModel class 的我的日历代码视为一个节点,并将其作为“c”添加到数据中,并包含所有当前时间详细信息。我已使用 Proguard 排除了所有 class 模型:
-keepclassmembers class com.tubevibe.android.models.CampaignModel {*;}
-keepclassmembers class com.tubevibe.android.models.UserModel {*;}
此节点 c 导致我的应用程序在从实时数据库获取数据时崩溃。有什么方法可以阻止日历中的这个节点被插入吗?
这是我的广告系列模型
package com.tubevibe.android.models;
import androidx.annotation.Keep;
import java.util.Calendar;
@Keep
public class CampaignModel {
private String id;
private String idNo;
private String videoUrl;
private String viewsNeeded;
private String totalCost;
private String active;
private String timeRequired;
private Long postingDate;
Calendar c = Calendar.getInstance();
int utcOffset = c.get(Calendar.ZONE_OFFSET) + c.get(Calendar.DST_OFFSET);
public CampaignModel() {
}
public CampaignModel(String id, String idNo, String videoUrl,
String viewsNeeded,
String totalCost, String active, String timeRequired) {
this.id = id;
this.idNo = idNo;
this.videoUrl = videoUrl;
this.viewsNeeded = viewsNeeded;
this.totalCost = totalCost;
this.active = active;
this.timeRequired = timeRequired;
this.postingDate = c.getTimeInMillis() - utcOffset;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getIdNo() {
return idNo;
}
public void setIdNo(String idNo) {
this.idNo = idNo;
}
public String getViewsNeeded() {
return viewsNeeded;
}
public void setViewsNeeded(String viewsNeeded) {
this.viewsNeeded = viewsNeeded;
}
public String getTotalCost() {
return totalCost;
}
public void setTotalCost(String totalCost) {
this.totalCost = totalCost;
}
public String getTimeRequired() {
return timeRequired;
}
public void setTimeRequired(String timeRequired) {
this.timeRequired = timeRequired;
}
public String getVideoUrl() {
return videoUrl;
}
public void setVideoUrl(String videoUrl) {
this.videoUrl = videoUrl;
}
public Long getPostingDate() {
return postingDate;
}
public void setPostingDate(Long postingDate) {
this.postingDate = postingDate;
}
public String getActive() {
return active;
}
public void setActive(String active) {
this.active = active;
}
}
如果你的“models”包下有多个class,那么你只能使用下面一行:
-keepclassmembers class com.tubevibe.android.models.* {*;}
因为我看到你在你的“CampaignModel”中使用了“@Keep”注释class,这是正确的,下面两行代码也必须添加到你的“proguard- rules.pro" 文件:
-keepattributes Signature
-keepattributes *Annotation*
就在上面这行代码之前。请记住,您之所以会出现此行为,是因为您使用 Proguard 来确保安全,它会在您创建应用程序的 APK 后立即打乱代码,以便其他人无法看到它:
- Firebase firestore variable name changed
适用于 Cloud Firestore,但适用相同的规则。
此外,“日历”class 不是 Firebase 实时数据库supported data-type。我没有测试过,但很可能您还需要添加以下行:
-keepnames class java.util.Calendar
如果这不起作用,您很可能应该从模型中取出“c”对象 class 并创建它的新实例,仅在您需要的 class 中那。这样,对象“c”将不再存在于数据库中。
要查看它是否正常运行,请使用更改后的代码再次发布该应用。
Alex 解释了为什么 c
会出现在您的数据库中,但我想指出另外两种方法来确保它不会出现。
将字段标记为 private
,这意味着 Firebase 在读取 from/writing 到数据库时忽略它:
private Calendar c = Calendar.getInstance();
private int utcOffset = c.get(Calendar.ZONE_OFFSET) + c.get(Calendar.DST_OFFSET);
明确告诉 Firebase 在读取 from/writing 数据库时忽略该字段:
@Exclude
private Calendar c = Calendar.getInstance();
@Exclude
private int utcOffset = c.get(Calendar.ZONE_OFFSET) + c.get(Calendar.DST_OFFSET);
使用这些优化发布我的应用程序后;
minifyEnabled true
shrinkResources true
useProguard true
Firebase 将来自 CampaignModel class 的我的日历代码视为一个节点,并将其作为“c”添加到数据中,并包含所有当前时间详细信息。我已使用 Proguard 排除了所有 class 模型:
-keepclassmembers class com.tubevibe.android.models.CampaignModel {*;}
-keepclassmembers class com.tubevibe.android.models.UserModel {*;}
此节点 c 导致我的应用程序在从实时数据库获取数据时崩溃。有什么方法可以阻止日历中的这个节点被插入吗?
这是我的广告系列模型
package com.tubevibe.android.models;
import androidx.annotation.Keep;
import java.util.Calendar;
@Keep
public class CampaignModel {
private String id;
private String idNo;
private String videoUrl;
private String viewsNeeded;
private String totalCost;
private String active;
private String timeRequired;
private Long postingDate;
Calendar c = Calendar.getInstance();
int utcOffset = c.get(Calendar.ZONE_OFFSET) + c.get(Calendar.DST_OFFSET);
public CampaignModel() {
}
public CampaignModel(String id, String idNo, String videoUrl,
String viewsNeeded,
String totalCost, String active, String timeRequired) {
this.id = id;
this.idNo = idNo;
this.videoUrl = videoUrl;
this.viewsNeeded = viewsNeeded;
this.totalCost = totalCost;
this.active = active;
this.timeRequired = timeRequired;
this.postingDate = c.getTimeInMillis() - utcOffset;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getIdNo() {
return idNo;
}
public void setIdNo(String idNo) {
this.idNo = idNo;
}
public String getViewsNeeded() {
return viewsNeeded;
}
public void setViewsNeeded(String viewsNeeded) {
this.viewsNeeded = viewsNeeded;
}
public String getTotalCost() {
return totalCost;
}
public void setTotalCost(String totalCost) {
this.totalCost = totalCost;
}
public String getTimeRequired() {
return timeRequired;
}
public void setTimeRequired(String timeRequired) {
this.timeRequired = timeRequired;
}
public String getVideoUrl() {
return videoUrl;
}
public void setVideoUrl(String videoUrl) {
this.videoUrl = videoUrl;
}
public Long getPostingDate() {
return postingDate;
}
public void setPostingDate(Long postingDate) {
this.postingDate = postingDate;
}
public String getActive() {
return active;
}
public void setActive(String active) {
this.active = active;
}
}
如果你的“models”包下有多个class,那么你只能使用下面一行:
-keepclassmembers class com.tubevibe.android.models.* {*;}
因为我看到你在你的“CampaignModel”中使用了“@Keep”注释class,这是正确的,下面两行代码也必须添加到你的“proguard- rules.pro" 文件:
-keepattributes Signature
-keepattributes *Annotation*
就在上面这行代码之前。请记住,您之所以会出现此行为,是因为您使用 Proguard 来确保安全,它会在您创建应用程序的 APK 后立即打乱代码,以便其他人无法看到它:
- Firebase firestore variable name changed
适用于 Cloud Firestore,但适用相同的规则。
此外,“日历”class 不是 Firebase 实时数据库supported data-type。我没有测试过,但很可能您还需要添加以下行:
-keepnames class java.util.Calendar
如果这不起作用,您很可能应该从模型中取出“c”对象 class 并创建它的新实例,仅在您需要的 class 中那。这样,对象“c”将不再存在于数据库中。
要查看它是否正常运行,请使用更改后的代码再次发布该应用。
Alex 解释了为什么 c
会出现在您的数据库中,但我想指出另外两种方法来确保它不会出现。
将字段标记为
private
,这意味着 Firebase 在读取 from/writing 到数据库时忽略它:private Calendar c = Calendar.getInstance(); private int utcOffset = c.get(Calendar.ZONE_OFFSET) + c.get(Calendar.DST_OFFSET);
明确告诉 Firebase 在读取 from/writing 数据库时忽略该字段:
@Exclude private Calendar c = Calendar.getInstance(); @Exclude private int utcOffset = c.get(Calendar.ZONE_OFFSET) + c.get(Calendar.DST_OFFSET);