aidl.exe'' finished with non-zero exit value 1问题解决【转载】

PS:Android Studio用AIDL时,碰到一个非常棘手的问题,但是百度之,压根非法解决,FQ出去,终于找到了一篇解决问题的文章,特地转载之。

之前使用aidl传递的都是基本的数据类型比如int 、boolean之类的还有就是String类型的参数,并没有传递自己定义的class。 最近在开发的过程中重构代码时遇到了这个问题,网上也有文章提供了解决的办法,不过不太全面。我东拼西凑才把问题给解决了。这里记录一下。

一、直接在aidl中的方法参数传递一个自定义类参数。

看一下我们的aidl文件

// IJDMAService.aidl
package com.jingdong.jdlogsys;

import com.jingdong.jdlogsys.model.CommonParamInfo;

interface IJDFileLogService {

    void setCommonParamInfo(CommonParamInfo info);
    void changeUser(String uid,String uuid,String pin);

}

  

这里的setCommonParamInfo方法的参数就是一个我们自己定义的类CommonParamInfo,虽然上面import了这个类,但是编译项目时会报如下的错误信息(使用Android Studio)。

Error:Execution failed for task ‘:JDLogSys:compileReleaseAidl‘.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process ‘command ‘D:\Android\sdk\build-tools\19.1.0\aidl.exe‘‘ finished with non-zero exit value 1
Error:(5) couldn‘t find import for class com.jingdong.jdlogsys.model.CommonParamInfo
F:\JD_GIT\JDLogSys\JDLogSys\res\com\jingdong\jdlogsys\IJDFileLogService.aidl

  

看到这么一行信息Error:(5) couldn‘t find import for class com.jingdong.jdlogsys.model.CommonParamInfo。意思就是找不到这个类。

二、网上提供了一个解决这个问题的方法

首先新建一个CommonParamInfo.aidl文件,文件的内容如下:

package com.jingdong.jdlogsys.model;

parcelable CommonParamInfo;

  

要注意的是这里的package要和原本定义的类的包名一样,其次是下面的parcelable CommonParamInfo;这行代码。

当然最重要的一点是你自己定义的类要实现Parcelable接口并按照规范重写一系列方法。这里我就不做介绍了。

接着重新编译,是的不再报上面那个错误信息,但是报了另外一个错误:

:JDLogSys:compileReleaseAidl
F:\JD_GIT\JDLogSys\JDLogSys\res\com\jingdong\jdlogsys\IJDFileLogService.aidl:14 parameter 1: ‘CommonParamInfo info‘ can be an out parameter, so you must declare it as in, out or inout.
Error:Execution failed for task ‘:JDLogSys:compileReleaseAidl‘.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process ‘command ‘D:\Android\sdk\build-tools\19.1.0\aidl.exe‘‘ finished with non-zero exit value 1

  

看到这么一行信息IJDFileLogService.aidl:14 parameter 1: ‘CommonParamInfo info‘ can be an out parameter, so you must declare it as in, out or inout.

意思就是我们需要把这个参数声明成in或者inout类型的,

三、于是我们修改一下aidl中的setCommonParamInfo方法,一开始我是设置的inout:

void setCommonParamInfo(inout CommonParamInfo info);

于是,不出意外接着报错:

Error:(144, 5) 错误: 找不到符号
符号:   方法 readFromParcel(Parcel)
位置: 类型为 CommonParamInfo 的变量 info
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
Error:Execution failed for task ‘:JDLogSys:compileReleaseJava‘.
> Compilation failed; see the compiler error output for details.
1 个错误
注: 某些输入文件使用或覆盖了已过时的 API。
F:\JD_GIT\JDLogSys\JDLogSys\build\generated\source\aidl\release\com\jingdong\jdlogsys\IJDFileLogService.java

  

啥状况呢,就是说找不到readFromParcel方法。我看了一下CommonParamInfo类,确实没有这个方法,但是之前该重写的方法都重写了啊,之前一直也是这么做的。 于是我又接着搜索,找到了解决这个问题的方法,就是在CommonParamInfo类中自己添加一个readFromParcel方法

四、修改CommonParamInfo类,添加readFromParcel方法

package com.jingdong.jdlogsys.model;

import android.os.Parcel;
import android.os.Parcelable;

/**
 * Created by zhengqing on 2014/12/18.
 */
public class CommonParamInfo implements Parcelable {
    public static final Parcelable.Creator<CommonParamInfo> CREATOR = new Creator<CommonParamInfo>() {
        @Override
        public CommonParamInfo[] newArray(int size) {
            return new CommonParamInfo[size];
        }

        @Override
        public CommonParamInfo createFromParcel(Parcel in) {
            return new CommonParamInfo(in);
        }
    };
    public String strUid;           //用户id
    public String strUuid;          //用户唯一标识,根据设备串号等唯一编码

    public CommonParamInfo() {
        // TODO Auto-generated constructor stub
    }
    @SuppressWarnings("unchecked")
    public CommonParamInfo(Parcel in) {
        // TODO Auto-generated constructor stub
        strUid = in.readString();
        strUuid = in.readString();
    }
    public void readFromParcel(Parcel in){
        strUid = in.readString();
        strUuid = in.readString();
    }
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(strUid)
          .append(strUuid);
        return sb.toString();
    }
    public String getStrUid() {
        return strUid;
    }
    public void setStrUid(String strUid) {
        this.strUid = strUid;
    }
    public String getStrUuid() {
        return strUuid;
    }
    public void setStrUuid(String strUuid) {
        this.strUuid = strUuid;
    }
    @Override
    public int describeContents() {
        return 0;
    }
    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeString(strUid);
        out.writeString(strUuid);
    }
}

  

其实readFromParcel方法的实现和构造函数中的内容是一样的。这样我们再次编译运行,发现没有任何问题了。

五、接着我又把第三步中的inout修改成了in

发现并没有报找不到readFromParcel方法的错误。



参考文章:

http://blog.csdn.net/jackyu613/article/details/6011606

http://blog.csdn.net/flowingflying/article/details/22276821



THE END.

aidl.exe'' finished with non-zero exit value 1问题解决【转载】

时间: 2024-10-02 01:09:07

aidl.exe'' finished with non-zero exit value 1问题解决【转载】的相关文章

新手写AIDL构建失败:...aidl.exe&#39;&#39; finished with non-zero exit value 1

最近学习aidl,写demo后编译报错,跟着<Android开发艺术探索>以及网上的一些aidl详解博客敲完后一直编译不过,错误日志如下: Process 'command 'C:\Users\DELL\AppData\Local\Android\Sdk\build-tools\27.0.3\aidl.exe'' finished with non-zero exit value 1 打开详细错误后很多,但也没有有效信息: Caused by: org.gradle.process.inter

org.gradle.process.internal.ExecException: Process &#39;command &#39;D:\SDK\AS\sdk\build-tools\23.0.0\aapt.exe&#39;&#39; finished with non-zero exit value 1

AGPBI: {"kind":"error","text":"No resource identifier found for attribute \u0027text_titleText\u0027 in package \u0027 包名 \u0027","sources":[{"file":"D:\\workSpace\\Android Studio\\Bank\\res

【AS扫盲】build-tools\23.0.3\zipalign.exe&#39;&#39; finished with non-zero exit value 1

使用Android Studio(以下简称AS)一段时间了,不得不说,AS真的很智能,个人觉得比EC开发起来快多了,在这个过程中我也不多不少也解决了一些AS的一些错误,觉得有必要记录一下,所以开了此类博文,希望大家喜欢! 昨天遇到这个错误:Error:Execution failed for task ':app:zipalignDebug'.> Process 'command 'C:\Users\Administrator\AppData\Local\Android\sdk\build-to

Android Studio编译大工程报错:java.exe&#39;&#39; finished with non-zero exit value 1

版权声明:本文为博主原创文章,未经博主允许不得转载. Android Studio编译大工程报错:java.exe'' finished with non-zero exit value 1

安卓编译出错: Process &#39;command &#39;C:\Java\jdk1.8.0_51\bin\java.exe&#39;&#39; finished with non-zero exit value 1 解决!

安卓编译出错: Process 'command 'C:\Java\jdk1.8.0_51\bin\java.exe'' finished with non-zero exit value 1 解决! 刚从eclipse转到Android studio,安装完成之后搭建了系统默认的hello world代码工程,却出现了以下错误: Process 'command 'C:\Java\jdk1.8.0_51\bin\java.exe'' finished with non-zero exit va

com.android.dex.DexIndexOverflowException merging dependencies or error that java.exe finished with non-zero exit value 2

这个问题困扰我好一两天了,现在解决了这个麻烦的问题,我觉得有必要以博客的形式描述一下我这段心酸的解决经历,在网上查了好多关于这方面的资料,大多都是说编译的jar包,或者libs重复之类的(我用的是AS),但是我仔细看了好几遍我的builde.gradle文件,没有这个问题的存在,所以我就很纳闷,几番折腾,我觉得还是从错误log中去找bug的根源,发现 java.exe finished with non-zero exit value 2还是由com.android.dex.DexIndexOv

&quot;com.android.ide.s.ProcessException:Process &#39;cand &#39;C:\Program Files\Java\jdk1.8.0_60\bin\java.exe&#39;&#39; finished with non-zero exit value 2&quot;

使用Android Studio 出现该问题: "com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.8.0_60\bin\java.exe'' finished with non-zero exit value 2" 导致原因:项目中出现了重复的依赖.删除依赖项便可

Android Stduio 发生 Process &#39;command &#39;somePath:java.exe&#39;&#39; finished with non-zero exit value 2 异常的解决办法

有时你会发现,在你使用Android Studio 进行编译的时候提示: Error:Execution failed for task ':demo:dexDebug'.> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'java.exe'' finished with non-zero exit value 2 为什么会这

【安卓】aidl.exe E 10744 10584 io_delegate.cpp:102] Error while creating directories: Invalid argument

这几天在使用.aidl文件的时候eclipse的控制台总是爆出如下提示: aidl.exe E 10744 10584 io_delegate.cpp:102] Error while creating directories: Invalid argument 一直无法解决,后来把SDK目录下的\build-tools\24.0.0-preview\aidl.exe用build-tools\23.0.3\aidl.exe文件替换瞬间就不报错了,看来最新的build-tools也不是那么好玩的啊