android工作室更新了,代码太大了

juzqafwq  于 2021-07-08  发布在  Java
关注(0)|答案(2)|浏览(402)

我有一个系统已经生产了两年了。它是用于控制公司设备的emm系统。
它使用 FireBase 将在设备上执行的功能从服务器应用程序发送到设备。
您可以向设备发送大约400个可能的命令,所有这些命令最初都在一个类中处理,这会覆盖 onMessageReceived()FireBaseMessagingService 班级。
旧版本的androidstudio构建了apk,目前正在生产中。我已经开始在我的系统的版本2工作了大约一年后。所以我把我的android工作室更新到了最新版本(4)。
问题是:
当我尝试构建项目并将其推到设备上时,我得到了

  1. error: code too large public void onMessageReceived(RemoteMessage remoteMessage) {

如前所述 onMessageReceived 方法可以处理来自服务器应用程序的400种不同类型的推送通知,因此方法体中有许多if/else语句。
既然as升级了,这就不起作用了,有什么原因吗?
有什么我可以改变的环境来克服这个问题吗?
我尝试过:
我考虑将if/else的一半放在另一个服务类中,以减少方法代码。这将涉及通过 remoteMessageMap 到另一个类进行if/else处理。 remoteMessageMap from firebase是一个Map,Map在扩展接口时不可序列化,因此无法传递它。

  1. public class MyAndroidFirebaseMsgService extends FirebaseMessagingService {
  2. private static final String TAG = "MyAndroidFCMService";
  3. AppObj appObj;
  4. @Override
  5. public void onMessageReceived(RemoteMessage remoteMessage) {
  6. Log.e(TAG, "remoteMessage.getData() = " + remoteMessage.getData());
  7. Map remoteMessageMap = remoteMessage.getData();
  8. String message = (String)remoteMessageMap.get("message");

谢谢
[编辑1]

  1. else if(message.trim().equalsIgnoreCase("CLEARCACHE_REMOVE_APP_WL")){
  2. Log.e(TAG, "received CLEARCACHE_REMOVE_APP_WL");
  3. String pushGuid = (String)remoteMessageMap.get("pushguid");
  4. Log.e(TAG, "pushGuid = " + pushGuid);
  5. String clearCacheRemoveWhitelist = (String)remoteMessageMap.get("clear_cache_app_names");
  6. Intent intentExecutePushCommand = new Intent( getApplicationContext(), ExecutePushCommandIntentService.class);
  7. intentExecutePushCommand.putExtra("compID", MenuActivity.companyID);
  8. intentExecutePushCommand.putExtra("command", message);
  9. intentExecutePushCommand.putExtra("pushguid", pushGuid);
  10. intentExecutePushCommand.putExtra("clear_cache_app_names", clearCacheRemoveWhitelist);
  11. startService(intentExecutePushCommand);
  12. }else if(message.trim().equalsIgnoreCase("CLEARCACHE_GET_PACKAGENAMES_WL")){
  13. Log.e(TAG, "received CLEARCACHE_GET_PACKAGENAMES_WL");
  14. String pushGuid = (String)remoteMessageMap.get("pushguid");
  15. Log.e(TAG, "pushGuid = " + pushGuid);
  16. Intent intentExecutePushCommand = new Intent( getApplicationContext(), ExecutePushCommandIntentService.class);
  17. intentExecutePushCommand.putExtra("compID", MenuActivity.companyID);
  18. intentExecutePushCommand.putExtra("command", message);
  19. intentExecutePushCommand.putExtra("pushguid", pushGuid);
  20. startService(intentExecutePushCommand);
  21. }else if(message.trim().equalsIgnoreCase("CLEARCACHE_ADD_PACKAGENAME_WL")){
  22. Log.e(TAG, "received CLEARCACHE_ADD_PACKAGENAME_WL");
  23. String pushGuid = (String)remoteMessageMap.get("pushguid");
  24. Log.e(TAG, "pushGuid = " + pushGuid);
  25. String packageName = (String)remoteMessageMap.get("package_name");
  26. Intent intentExecutePushCommand = new Intent( getApplicationContext(), ExecutePushCommandIntentService.class);
  27. intentExecutePushCommand.putExtra("compID", MenuActivity.companyID);
  28. intentExecutePushCommand.putExtra("command", message);
  29. intentExecutePushCommand.putExtra("pushguid", pushGuid);
  30. intentExecutePushCommand.putExtra("package_name", packageName);
  31. startService(intentExecutePushCommand);
  32. }
fruv7luv

fruv7luv1#

似乎您多次重复相同的代码行,只需将这些代码行以及可能更多的代码行放在一个单独的方法中,该方法对每个代码行都进行调用 else if 这将缩小 onMessageReceived() ```
Intent intentExecutePushCommand = new Intent( getApplicationContext(), ExecutePushCommandIntentService.class);
intentExecutePushCommand.putExtra("compID", MenuActivity.companyID);
intentExecutePushCommand.putExtra("command", message);
intentExecutePushCommand.putExtra("pushguid", pushGuid);

vmpqdwk3

vmpqdwk32#

没有必要通过考试 remoteMessageMap 去另一个班级。问题的根源是java方法大小的限制。以下是与此问题相关的oracle官方文档:
代码长度
code_length项的值给出此方法的代码数组中的字节数。
代码长度的值必须大于零(因为代码数组不能为空)并且小于65536。
关键是你的 onMessageReceived 方法太长,已编译代码的大小大于64kb。奇怪的是,为什么在以前版本的androidstudio中编译得很好:)
无论如何,解决方法是将方法分解成更小的片段。我的建议是通过一些消息类型进行分段。例如:

  1. private static final String COMMAND_1 = "COMMAND_1";
  2. private static final String COMMAND_2 = "COMMAND_2";
  3. @Override
  4. public void onMessageReceived(RemoteMessage remoteMessage) {
  5. Log.e(TAG, "remoteMessage.getData() = " + remoteMessage.getData());
  6. Map remoteMessageMap = remoteMessage.getData();
  7. String message = (String) remoteMessageMap.get("message");
  8. String type = extrated_from_received_message;
  9. switch (type) {
  10. case COMMAND_1:
  11. handleCommand1(remoteMessageMap);
  12. break;
  13. case COMMAND_2:
  14. handleCommand2(remoteMessageMap);
  15. break;
  16. // more commands ...
  17. default:
  18. // ...
  19. }
  20. }
  21. private void handleCommand1(Map remoteMessageMap){
  22. // do whatever related to command 1
  23. }
  24. private void handleCommand2(Map remoteMessageMap){
  25. // do whatever related to command 2
  26. }

这样可以优化方法的大小,大大提高调用方法的性能。

展开查看全部

相关问题