美文网首页
AIDL使用遇到的问题记录

AIDL使用遇到的问题记录

作者: duoduo7628 | 来源:发表于2020-12-07 11:38 被阅读0次
    aidl文件修改完成后,需要Rebuild Project,而不是Clean Project 。

    Clean Project 仅仅会删除项目下Build文件夹,而不会生成aidl文件所对应的Java文件,但Rebuild Project会生成java文件(Rebuild Project命令包含Clean Project命令)。
    需要注意的是:
    直接选择Android Studio的 Build -- Rebuild Project会Rebuild所有的项目,耗时较长。
    应该选择右侧的Gradle窗口 -- module name -- Tasks -- build -- build 会更快。

    aidl中定义的方法不能同名

    代码

    // MistakeNoteStateListener.aidl
    package com.noahedu.mistakequestion.service;
    import com.noahedu.mistakequestion.service.MistakeNoteBean;
    
    // Declare any non-default types here with import statements
    
    interface MistakeNoteStateListener {
    
    
            void onSuccess();
            void onSuccess(in MistakeNoteBean bean, int successType, String successMsg);
            void onFail(in MistakeNoteBean bean, int errorType, String errorMsg);
    }
    

    这样的代码会报错:

    Execution failed for task ':noah_mistakequestion:compileDebugAidl'.
    > java.io.IOException: com.android.ide.common.process.ProcessException: Error while executing process D:\AndroidSetup\sdk\build-
    tools\27.0.3\aidl.exe with arguments {-pD:\AndroidSetup\sdk\platforms\android-28\framework.aidl -
    oD:\workspace_eclipse_formal\All_P712\apps\MistakeNoteP712\noah_mistakequestion\build\generated\source\aidl\debug -
    ID:\workspace_eclipse_formal\All_P712\apps\MistakeNoteP712\noah_mistakequestion\src\debug\aidl -
    ID:\workspace_eclipse_formal\All_P712\apps\MistakeNoteP712\noah_mistakequestion\src -
    ID:\workspace_eclipse_formal\All_P712\apps\MistakeNoteP712\base_lib\build\intermediates\packaged-aidl\debug -
    ID:\workspace_eclipse_formal\All_P712\apps\MistakeNoteP712\base_pro_aicommon\build\intermediates\packaged-aidl\debug -
    ID:\workspace_eclipse_formal\All_P712\apps\MistakeNoteP712\base_pro_camfinger\build\intermediates\packaged-aidl\debug -
    ID:\workspace_eclipse_formal\All_P712\apps\MistakeNoteP712\base_lib_mycamera\build\intermediates\packaged-aidl\debug -
    dC:\Users\shaoqw\AppData\Local\Temp\aidl7732171557994486593.d 
    D:\workspace_eclipse_formal\All_P712\apps\MistakeNoteP712\noah_mistakequestion\src\com\noahedu\mistakequestion\service\MistakeNoteStateListener.aidl}
    

    网上有人说,是要用的类没有导包,实体类与管理类包名不一致导致的,
    但是我这里是因为 方法名相同导致的,有两个onSuccess方法,改成onSuccess2就好了

    interface MistakeNoteStateListener {
    
            void onSuccess();
            void onSuccess2(in MistakeNoteBean bean, int successType, String successMsg);
            void onFail(in MistakeNoteBean bean, int errorType, String errorMsg);
    }
    
    编写AIDL文件没有提示

    目前没发现什么解决方法。

    AndroidStudio和Eclipse存放AIDL目录不一样的问题

    androidstudio 存放moduleName/src/main/aidl
    eclipse 存放在 projectName/src
    如果项目是eclipse结构需要在android下添加 aidl.srcDirs = ['src']

        sourceSets {
            main {
                manifest.srcFile 'AndroidManifest.xml'
                java.srcDirs = ['src']
                resources.srcDirs = ['src']
                aidl.srcDirs = ['src']
                renderscript.srcDirs = ['src']
                res.srcDirs = ['res']
                assets.srcDirs = ['assets']
            }
        }
    
    一定要对异常做处理
            try {
                mistakeNoteManager.removeMistakeNoteByListener(mMistakeNoteBean, mMistakeNoteStateListener);
            } catch (RemoteException e) {
                e.printStackTrace();
                //处理异常
                handleException();
            }
    

    一定要对异常做处理,比如消失弹框,状态重置,弹出提醒等
    不做处理很难发现错误所在,因为可能是服务端出错引起的异常。

    复杂对象要放后面

    复杂对象(需要in、out、inout的对象)要放后面,不然传到服务端可能会为空。
    这种问题原因很难说,出现这种问题,先看看对象是不是真的传的是空,如果不是,就看看复杂对象是不是放前面了。
    如下可能会发生为空的错误:

    interface BookManager {
    
        boolean addBook(in Book book, int index);
    }
    

    需改为 int在前,Book在后

    interface BookManager {
    
        boolean addBook(int index, in Book book) ;
    }
    
    复杂对象有out inout修饰时,需要实现readFromParcel(Parcel in)方法

    不然会报错,out inout 会同步服务端修改的对象的数据,需要调用readFromParcel(Parcel in)方法


    参考文章:AIDL Parcelable readFromParcel(Parcel) out inout相关错误

    参考文章:
    Android AIDL使用详解
    带你一起剖析Android AIDL跨进程通信的实现原理
    AIDL自定义类型的错误 java.io.IOException: com.android.ide.common.process.ProcessException

    相关文章

      网友评论

          本文标题:AIDL使用遇到的问题记录

          本文链接:https://www.haomeiwen.com/subject/yovzwktx.html