代码之家  ›  专栏  ›  技术社区  ›  turtleboy

Android工作室更新,现在代码太大

  •  0
  • turtleboy  · 技术社区  · 4 年前

    我有一个已经生产了两年的系统。它是一个用于控制公司设备的EMM系统。

    它使用 FireBase 将设备上执行的功能从服务器应用程序发送到设备。

    您可以向设备发送大约400个可能的命令,所有这些命令最初都在一个类中处理,该类覆盖了 onMessageReceived() FireBaseMessagingService 类。

    旧版本的Android studio构建了现在正在生产的apk。大约一年后,我开始开发我的系统版本2。所以我将我的Android工作室更新到了最新版本(4)。

    问题:

    当我试图构建项目并推送到设备上时,我得到了

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

    如前所述 onMessageReceived 方法可以处理来自服务器应用程序的400种不同类型的推送通知,因此方法体中有很多if/else语句。

    AS升级后,这不起作用,有什么原因吗?

    我可以在AS中更改任何设置来克服这个问题吗?

    我所尝试的:

    我考虑将一半的if/else放在另一个服务类中,以减少方法代码。这将涉及通过 remoteMessageMap 到另一个类进行if/else处理。

    远程消息地图 来自FireBase的是一个Map,而Map在扩展接口时是不可序列化的,因此无法传递它。

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

    谢谢

    [编辑1]

    else if(message.trim().equalsIgnoreCase("CLEARCACHE_REMOVE_APP_WL")){
    
    
                Log.e(TAG, "received CLEARCACHE_REMOVE_APP_WL");
    
                String pushGuid =  (String)remoteMessageMap.get("pushguid");
                Log.e(TAG, "pushGuid = " + pushGuid);
    
                String clearCacheRemoveWhitelist =  (String)remoteMessageMap.get("clear_cache_app_names");
    
    
                Intent intentExecutePushCommand = new Intent( getApplicationContext(), ExecutePushCommandIntentService.class);
                intentExecutePushCommand.putExtra("compID", MenuActivity.companyID);
                intentExecutePushCommand.putExtra("command", message);
                intentExecutePushCommand.putExtra("pushguid", pushGuid);
                intentExecutePushCommand.putExtra("clear_cache_app_names", clearCacheRemoveWhitelist);
    
    
    
                startService(intentExecutePushCommand);
    
            }else if(message.trim().equalsIgnoreCase("CLEARCACHE_GET_PACKAGENAMES_WL")){
    
    
                Log.e(TAG, "received CLEARCACHE_GET_PACKAGENAMES_WL");
    
                String pushGuid =  (String)remoteMessageMap.get("pushguid");
                Log.e(TAG, "pushGuid = " + pushGuid);
    
    
                Intent intentExecutePushCommand = new Intent( getApplicationContext(), ExecutePushCommandIntentService.class);
                intentExecutePushCommand.putExtra("compID", MenuActivity.companyID);
                intentExecutePushCommand.putExtra("command", message);
                intentExecutePushCommand.putExtra("pushguid", pushGuid);
    
                startService(intentExecutePushCommand);
    
            }else if(message.trim().equalsIgnoreCase("CLEARCACHE_ADD_PACKAGENAME_WL")){
    
    
                Log.e(TAG, "received CLEARCACHE_ADD_PACKAGENAME_WL");
    
                String pushGuid =  (String)remoteMessageMap.get("pushguid");
                Log.e(TAG, "pushGuid = " + pushGuid);
    
                String packageName =  (String)remoteMessageMap.get("package_name");
    
    
                Intent intentExecutePushCommand = new Intent( getApplicationContext(), ExecutePushCommandIntentService.class);
                intentExecutePushCommand.putExtra("compID", MenuActivity.companyID);
                intentExecutePushCommand.putExtra("command", message);
                intentExecutePushCommand.putExtra("pushguid", pushGuid);
                intentExecutePushCommand.putExtra("package_name", packageName);
    
                startService(intentExecutePushCommand);
    
            }
    
    0 回复  |  直到 4 年前
        1
  •  5
  •   aminography    4 年前

    没有必要通过 remoteMessageMap 去另一个班。问题的根源是java方法大小的限制。这是一块 official documentation of oracle 这与这个问题有关:

    代码长度
    code_length项的值给出了此方法的代码数组中的字节数。
    code_length的值必须大于零(因为代码数组不能为空)且小于65536。

    关键是你的 onMessageReceived 方法太长,超过64KB的编译代码。奇怪的是,为什么它在以前版本的Android Studio中编译得很好:)

    无论如何,解决方案是将方法分解为更小的片段。我的建议是按某些消息类型进行碎片化。例如:

    private static final String COMMAND_1 = "COMMAND_1";
    private static final String COMMAND_2 = "COMMAND_2";
    
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        Log.e(TAG, "remoteMessage.getData() = " + remoteMessage.getData());
    
        Map remoteMessageMap = remoteMessage.getData();
    
        String message = (String) remoteMessageMap.get("message");
        
        String type = extrated_from_received_message;
    
        switch (type) {
            case COMMAND_1:
                handleCommand1(remoteMessageMap);
                break;
            case COMMAND_2:
                handleCommand2(remoteMessageMap);
                break;
    
            // more commands ...
    
            default:
                // ...
        }
    }
    
    private void handleCommand1(Map remoteMessageMap){
        // do whatever related to command 1
    }
    
    private void handleCommand2(Map remoteMessageMap){
        // do whatever related to command 2
    }
    

    这样,方法大小将得到优化,调用它的性能将大大提高。

        2
  •  0
  •   from56    4 年前

    看起来你重复了很多次相同的代码行,只需将这些代码行以及可能更多的代码行放在一个单独的方法中,每个方法都会调用这些代码行 else if 这将减小 onMessageReceived()

       Intent intentExecutePushCommand = new Intent( getApplicationContext(), ExecutePushCommandIntentService.class);
       intentExecutePushCommand.putExtra("compID", MenuActivity.companyID);
       intentExecutePushCommand.putExtra("command", message);
       intentExecutePushCommand.putExtra("pushguid", pushGuid);