问题描述
我的应用发行版存在很大的问题。 (https://play.google.com/store/apps/details?id=com.conta.ftof 请尝试下载它以帮助我) 在调试版本中,一切正常,但在发布版本中,只要我通过电话号码对Firebase进行身份验证或仅进行身份验证,然后单击“回收者视图”按钮,应用程序就会崩溃...我最近添加了sha键-1和sha-256到firebase项目,我添加了新的json文件,因为身份验证不起作用,现在身份验证可以正常工作,但是正如我已经说过的,只要您通过身份验证,该应用程序就会崩溃。我不知道是不是Google广告的问题,这是我在1星期前在contactsactivity中添加的。奇怪的是调试版本可以正常运行...我留给您代码了...
暗恋的LogCat
EndProcessproperty
ContactsActivity:
--------- beginning of crash
2020-10-16 19:11:58.221 22176-22176/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.conta.ftof,PID: 22176
c.e.c.m.d: No properties to serialize found on class c.b.a.d
at c.e.c.m.x.z0.o.a$a.<init>(:11)
at c.e.c.m.x.z0.o.a.e(UnkNown Source:12)
at c.e.c.m.x.z0.o.a.b(:4)
at c.c.a.b.b.a(:5)
at c.c.a.a.a.a(:3)
at com.firebase.ui.database.FirebaseRecyclerAdapter.p(:2)
at androidx.recyclerview.widget.RecyclerView$g.q(UnkNown Source:0)
at androidx.recyclerview.widget.RecyclerView$v.k(:80)
at androidx.recyclerview.widget.linearlayoutmanager$c.c(:3)
at androidx.recyclerview.widget.linearlayoutmanager.t1(UnkNown Source:0)
at androidx.recyclerview.widget.linearlayoutmanager.e1(:2)
at androidx.recyclerview.widget.linearlayoutmanager.s0(:22)
at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(UnkNown Source:38)
at androidx.recyclerview.widget.RecyclerView.dispatchLayout(UnkNown Source:37)
at androidx.recyclerview.widget.RecyclerView.onLayout(UnkNown Source:5)
at android.view.View.layout(View.java:20948)
at android.view.ViewGroup.layout(ViewGroup.java:6279)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1083)
at android.view.View.layout(View.java:20948)
at android.view.ViewGroup.layout(ViewGroup.java:6279)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:325)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:20948)
at android.view.ViewGroup.layout(ViewGroup.java:6279)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1842)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1686)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1595)
at android.view.View.layout(View.java:20948)
at android.view.ViewGroup.layout(ViewGroup.java:6279)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:325)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:20948)
at android.view.ViewGroup.layout(ViewGroup.java:6279)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1842)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1686)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1595)
at android.view.View.layout(View.java:20948)
at android.view.ViewGroup.layout(ViewGroup.java:6279)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:325)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at com.android.internal.policy.DecorView.onLayout(DecorView.java:902)
at android.view.View.layout(View.java:20948)
at android.view.ViewGroup.layout(ViewGroup.java:6279)
at android.view.ViewRootImpl.performlayout(ViewRootImpl.java:3037)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2545)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1636)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7946)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1092)
at android.view.Choreographer.doCallbacks(Choreographer.java:893)
at android.view.Choreographer.doFrame(Choreographer.java:812)
at android.view.Choreographer$FramedisplayEventReceiver.run(Choreographer.java:1078)
at android.os.Handler.handleCallback(Handler.java:907)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:216)
at android.app.ActivityThread.main(ActivityThread.java:7625)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
2020-10-16 19:11:58.227 1272-2391/? E/ActivityManager: The same pid with last one,do not add dropBox and clear mLastCrashedPid. mLastAppCrashedPid==22176
构建gradle:app
//[...import some libraries...]
public class ContactsActivity extends AppCompatActivity {
BottomNavigationView navView;
RecyclerView myContactsList;
ImageView findPeopleBtn;
private DatabaseReference contactsRef,usersRef;
private FirebaseAuth mAuth;
private String currentUserId;
private String userName = "",profileImage="";
private String calledBy = "";
private AdView mAdView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_contacts);
//ads
MobileAds.initialize(this,new OnInitializationCompleteListener() {
@Override
public void onInitializationComplete(InitializationStatus initializationStatus) {
}
});
//ads
AdView adView = new AdView(this);
adView.setAdSize(AdSize.BANNER);
adView.setAdUnitId("ca-app-pub-3400243939195187/7974459299");
mAdView = findViewById(R.id.adView);
AdRequest adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);
mAuth = FirebaseAuth.getInstance();
currentUserId = mAuth.getCurrentUser().getUid();
contactsRef = FirebaseDatabase.getInstance().getReference().child("Contacts");
usersRef = FirebaseDatabase.getInstance().getReference().child("Users");
navView = findViewById(R.id.nav_view);
navView.setonNavigationItemSelectedListener(navigationItemSelectedListener);
findPeopleBtn = findViewById(R.id.find_people_btn);
myContactsList = findViewById(R.id.contact_list);
myContactsList.setLayoutManager(new linearlayoutmanager(getApplicationContext()));
findPeopleBtn.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent findpeopleIntent = new Intent(ContactsActivity.this,FindPeopleActivity.class);
startActivity(findpeopleIntent);
}
});
}
private BottomNavigationView.OnNavigationItemSelectedListener navigationItemSelectedListener = new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
switch (menuItem.getItemId()){
case R.id.navigation_home:
Intent mainIntent = new Intent(ContactsActivity.this,ContactsActivity.class);
startActivity(mainIntent);
break;
case R.id.navigation_settings:
Intent settingsIntent = new Intent(ContactsActivity.this,SettingsActivity.class);
startActivity(settingsIntent);
break;
case R.id.navigation_notifications:
Intent notificationsIntent = new Intent(ContactsActivity.this,NotificationsActivity.class);
startActivity(notificationsIntent);
break;
case R.id.navigation_logout:
FirebaseAuth.getInstance().signOut();
Intent logoutIntent = new Intent(ContactsActivity.this,RegistrationActivity.class);
startActivity(logoutIntent);
finish();
break;
case R.id.navigation_donate:
Intent donateIntent = new Intent(ContactsActivity.this,donate.class);
startActivity(donateIntent);
finish();
break;
}
return true;
}
};
@Override
protected void onStart() {
super.onStart();
checkForReceivingCall();
validateUser();
FirebaseRecyclerOptions<Contacts> options
= new FirebaseRecyclerOptions.Builder<Contacts>()
.setQuery(contactsRef.child(currentUserId),Contacts.class)
.build();
FirebaseRecyclerAdapter<Contacts,ContactsViewHolder> firebaseRecyclerAdapter
=new FirebaseRecyclerAdapter<Contacts,ContactsViewHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull final ContactsViewHolder holder,int i,@NonNull Contacts contacts) {
final String listUserId = getRef(i).getKey();
usersRef.child(listUserId).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
userName = dataSnapshot.child("name").getValue().toString();
profileImage = dataSnapshot.child("image").getValue().toString();
holder.userNameTxt.setText(userName);
Picasso.get().load(profileImage).into(holder.profileImageView);
holder.callBtn.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent callingIntent = new Intent(ContactsActivity.this,CallingActivity.class);
callingIntent.putExtra("visit_user_id",listUserId);
startActivity(callingIntent);
}
});
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
@NonNull
@Override
public ContactsViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.contact_design,parent,false);
ContactsViewHolder viewHolder = new ContactsViewHolder(view);
return viewHolder;
}
};
myContactsList.setAdapter(firebaseRecyclerAdapter);
firebaseRecyclerAdapter.startListening();
}
public static class ContactsViewHolder extends RecyclerView.ViewHolder{
TextView userNameTxt;
Button callBtn;
ImageView profileImageView;
public ContactsViewHolder(@NonNull View itemView) {
super(itemView);
userNameTxt = itemView.findViewById(R.id.name_contact);
callBtn = itemView.findViewById(R.id.call_btn);
profileImageView = itemView.findViewById(R.id.image_contact);
}
}
private void validateUser() {
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
reference.child("Users").child(currentUserId).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Intent settingIntent = new Intent(ContactsActivity.this,SettingsActivity.class);
startActivity(settingIntent);
finish();
}
});
}
private void checkForReceivingCall() {
usersRef.child(currentUserId)
.child("Ringing")
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.hasChild("ringing")){
calledBy = dataSnapshot.child("ringing").getValue().toString();
Intent callingIntent = new Intent(ContactsActivity.this,CallingActivity.class);
callingIntent.putExtra("visit_user_id",calledBy);
startActivity(callingIntent);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
构建gradle项目
apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'
android {
compileSdkVersion 29
buildToolsversion "29.0.3"
lintOptions {
checkReleaseBuilds false
// Or,if you prefer,you can continue to check for errors in release builds,// but continue the build even when errors are found:
abortOnError false
}
defaultConfig {
applicationId "com.conta.ftof"
minSdkVersion 21
targetSdkVersion 29
versionCode 3
versionName "1.2"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro'
}
}
}
dependencies {
implementation filetree(dir: "libs",include: ["*.jar"])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'com.google.firebase:firebase-auth:19.3.1'
implementation 'com.google.firebase:firebase-database:19.3.0'
implementation 'com.google.firebase:firebase-core:17.4.3'
implementation 'com.firebaseui:firebase-ui-database:3.2.2'
implementation 'com.hbb20:ccp:2.1.9'
implementation 'pub.devrel:easypermissions:0.4.0'
implementation 'com.android.support:percent:29.0.0'
implementation 'com.google.android.gms:play-services-ads:19.4.0'
implementation 'com.google.firebase:firebase-storage:19.1.1'
implementation 'com.google.android.material:material:1.1.0'
implementation 'androidx.navigation:navigation-fragment:2.2.2'
implementation 'androidx.navigation:navigation-ui:2.2.2'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation 'com.opentok.android:opentok-android-sdk:2.15.3'
implementation 'pub.devrel:easypermissions:0.4.0'
implementation 'com.squareup.picasso:picasso:2.71828'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation 'com.google.firebase:firebase-analytics:17.4.3'
}
通话活动
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.0.0"
classpath 'com.google.gms:google-services:4.3.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
maven { url 'https://maven.google.com'}
maven { url 'https://tokBox.bintray.com/maven'}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
解决方法
如果您是初学者,那么我建议您在build.gradle中禁用minifyEnabled
。基本上proguard
会混淆代码,并且您可能不会在proguard
规则中转义模型文件
android {
...
buildTypes {
release {
minifyEnabled false // disable proguard
...
}
}
}
[UPDATE]:这是您可以在progaurd中转义文件的方式
在您的proguard-android-optimize.txt
文件中执行以下操作
如果所有模型都在同一文件夹中,则:
-keep public class com.myapp.models.** {
public protected private *;
}
否则,您可以使用以下方式跳过文件:
-keep public class com.myapp.models.MyModel {
public protected private *;
}