应用程序在调试版本中运行良好,但在生产中无法运行

Posted

技术标签:

【中文标题】应用程序在调试版本中运行良好,但在生产中无法运行【英文标题】:App is working fine in debug build but not working in production 【发布时间】:2021-11-13 23:51:26 【问题描述】:

我的应用在实时环境中遇到问题。当我生成用于测试的调试版本并对其进行彻底测试时,一切正常,但是当我将我的应用程序上传到谷歌播放控制台然后在生产应用程序中时,我遇到了很多问题。例如,当我尝试登录应用程序时,在输入正确的凭据并单击登录按钮后,会生成一个加载程序,加载几秒钟后,它会在登录屏幕本身上停止。理想情况下,用户应该能够登录,但屏幕不会将用户重定向到主屏幕。

我已经检查了在邮递员中点击登录 api url,它工作正常。我还通过 USB 电缆连接生产应用程序检查了 logcat,logcat 显示正在调用 api,我也可以看到响应。

请问可能是什么原因..

这是用于调用 rest api 以进行登录的改造代码。

    private void userLoginApi() 
        if (Util.isConnectingToInternet(getActivity())) 
            CommonMethods.showLoading(getActivity());

            MultipartBody.Builder builder = new MultipartBody.Builder();
            builder.setType(MultipartBody.FORM);
            builder.addFormDataPart(Constants.MOBILE, mobileEt.getText().toString());
            builder.addFormDataPart(Constants.PASSWORD, passwordEt.getText().toString());
            builder.addFormDataPart(Constants.DEVICE_ID, token);
            builder.addFormDataPart(Constants.LANGUAGE, SharedPref.getSharedPreferences(getActivity(), Constants.LANGUAGE));

            MultipartBody requestBody = builder.build();
            RetrofitClient.getAPIService().user_login(requestBody).enqueue(new Callback<RetroResponse>() 
                @Override
                public void onResponse(Call<RetroResponse> call, Response<RetroResponse> response) 
                    CommonMethods.dismissLoading();
                    try 
                        if (response.body().getStatus() == 200) 

                            Pref.with(getApplicationContext()).getSharedPreferences().edit().putBoolean("isLogin", false)
                                    .putString("admin_id", response.body().getId())
                                    .putString("first_name", response.body().getData().getFirstName())
                                    .putString("email", response.body().getData().getEmail())
                                    .apply();

                            userID = response.body().getData().getUser_id();

                            SharedPref.setSharedPreference(getActivity(), Constants.USER_ID, response.body().getData().getUser_id());
                            SharedPref.setSharedPreference(getActivity(), Constants.ADMIN_ID, response.body().getId());
                            SharedPref.setSharedPreference(getActivity(), Constants.FIRST_NAME, response.body().getData().getFirstName());
                            SharedPref.setSharedPreference(getActivity(), Constants.LAST_NAME, response.body().getData().getLastName());
                            SharedPref.setSharedPreference(getActivity(), Constants.EMAIL, response.body().getData().getEmail());
                            SharedPref.setSharedPreference(getActivity(), Constants.MOBILE, response.body().getData().getMobile());
                            SharedPref.setSharedPreference(getActivity(), Constants.USER_MOBILE, response.body().getData().getMobile());
                            SharedPref.setSharedPreference(getActivity(), Constants.PROFILE_CITY, response.body().getData().getCity());
                            

                           
                            startActivity(new Intent(getActivity(), UserHomeActivity.class)
                                    .putExtra("screen_type", "")
                                    .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK));
                            getActivity().finish();

                         else if (response.body().getStatus() == 204) 
                            Util.ShowToastMessage(getActivity(), response.body().getMessage());

                            mobileEt.setText("");
                            passwordEt.setText("");
                            captchaCheck.setChecked(false);
                            captchaVerified = false;

                         else if (response.body().getStatus() == 401) 
                            Util.ShowToastMessage(getActivity(), "Something went wrong");
                        
                     catch (Exception e) 
                        e.printStackTrace();
                    
                

                @Override
                public void onFailure(Call<RetroResponse> call, Throwable t) 
                    CommonMethods.dismissLoading();
                
            );
         else 
            Util.ShowToastMessage(getActivity(), R.string.internet_connection);
        
    

这个 api 被成功调用,我在 logcat 中检查了它。但在此之后,用户不会被重定向到预期的屏幕。

【问题讨论】:

Hey Umang,请发布您遇到问题的代码。 发布您的 androidManifest.xml 文件以及您正在测试的 API 级别。 嘿@JamesPalfrey 我已经更新了用于登录的代码,我的项目有问题,请检查一下。 @SurajBahadur 我不确定我是否可以发布 AndroidManifest.xml 文件对不起,但我可以告诉你我在项目中的以下详细信息:minSdkVersion 21 targetSdkVersion 30 useLibrary 'org.apache.http.legacy ' versionCode 25 versionName "1.4.2" multiDexEnabled true testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" ,我不会在测试或生产时更改这些东西。 Android studiogradle 版本为:4.2.1 @UmangUpadhyay 请检查答案,让我知道它是否有效 【参考方案1】:

此行为的可能原因可能是由于build.gradle 文件中设置的 proguard 规则

minifyEnabled true 更改为minifyEnabled false

注意:

    Proguard 是一个免费的 Java 类文件收缩器、优化器、混淆器和预验证器。它检测并删除未使用的类、字段、方法和属性。移动应用开发公司在 android 中使用 proguard,它会优化字节码并删除未使用的指令。 这是一个临时解决方案,当minifiyEnabletrue 时,您需要手动找出错误。

【讨论】:

嘿@SurajBahadur 我会做你建议的改变,但我怀疑设置 minifyEnabled false 不会增加应用程序的大小,因为 minifyEnabled true 到现在较小? 将status改为true后,调用API时可以在logcat上看到报错。修复后,您可以使用 proguard 规则。 我在 AndroidManifest.xml 文件中设置了 minifyEnabled true,当我将 Play Store 中的应用程序与我的 Android Studio 连接时,我可以在 logcat 中看到一些信息,问题是在进行 api 调用时,没有该特定 api 调用中的错误或异常,这是我面临的问题。

以上是关于应用程序在调试版本中运行良好,但在生产中无法运行的主要内容,如果未能解决你的问题,请参考以下文章

由于反向代理,无法在生产中获取客户端的 IP

server.timeout 在本地完美运行,但在生产中无法在节点 js 中运行

Symfony3 - 资产在生产中无法正常工作

带有 Knex 的 nestjs:无法在生产中迁移和运行种子

iOS推送通知在生产中不起作用

无法连接到远程服务器(ftp 在开发中有效,但在生产中无效)