将旧Eclipse Android项目迁移至AS3.0.1后Release编译Dex返回码1问题求助
我之前帮同事处理过类似从Eclipse迁移到Android Studio 3.0.1的Release编译问题,结合你提到的AIDL文件和dex返回码1的报错,给你几个实用的排查方向:
先排查Dex相关的基础配置问题
- 检查Release构建的
minifyEnabled和shrinkResources配置:有时候开启混淆后,旧项目的混淆规则没适配AS,尤其是AIDL相关的类被误删了。可以先临时把这两个设为false,如果能编译过,就说明是混淆规则的问题,需要给AIDL生成的类(一般是*.Stub、*.Proxy这类)加上混淆白名单,比如在proguard-rules.pro里添加:
-keep public class * extends android.os.IInterface -keepclassmembers class **$Stub { public static android.os.IInterface asInterface(android.os.IBinder); } -keepclassmembers class * implements android.os.IInterface { public static final android.os.IBinder DESCRIPTOR; }
- 检查
multiDexEnabled配置:如果你的项目方法数超过65536,Debug模式下AS默认可能开启了multidex,但Release没配置。在build.gradle的android.defaultConfig里加上multiDexEnabled true,同时确保依赖了com.android.support:multidex:1.0.3(适配AS3.0.1的版本);如果是自定义Application,要继承MultiDexApplication或者在attachBaseContext方法里调用MultiDex.install(this)。
针对AIDL文件的专项排查
- 检查AIDL文件的存放路径:Eclipse里AIDL常放在
src/main/aidl以外的路径,迁移到AS后要确保所有AIDL文件都在src/main/aidl目录下,且包名和Java代码的包名一致。如果有跨模块的AIDL,要确保依赖模块正确引入AIDL目录,比如在模块的build.gradle里添加:
sourceSets { main { aidl.srcDirs = ['src/main/aidl', '你的其他AIDL路径'] } }
- 检查AIDL文件的语法错误:Release编译对语法的检查比Debug更严格,比如有没有遗漏import语句,或者自定义Parcelable类没在AIDL里用
parcelable关键字声明。可以执行./gradlew assembleRelease --info查看详细日志,AIDL的编译错误可能被dex的笼统报错掩盖了。
其他可能的排查点
- 清理构建缓存:旧项目迁移后缓存容易有冲突,执行
./gradlew clean,然后删除AS的.idea、build文件夹,再重新同步项目试试。 - 检查依赖冲突:Debug和Release的依赖可能不一致?比如有些依赖只在Debug里引入,Release里缺失;或者重复依赖了相同库,导致dex合并冲突。用
./gradlew dependencies查看Release的依赖树,找到重复库后用exclude去掉冗余部分。 - 查看详细报错日志:默认的报错信息太笼统,执行
./gradlew assembleRelease --stacktrace --debug,定位dex process失败的具体原因——比如是类重复定义,还是内存不足导致编译失败。如果是内存问题,可以在gradle.properties里加大堆内存:
org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
内容的提问来源于stack exchange,提问作者Eduardo Antonio Bortolini
相关产品推荐
相关产品推荐

