项目场景:
公司计划开发杰发AC8025-Android 12版本车载平台,前期预研需要构建Android studio版的CarSystemUI工程
问题描述
AAOS车载项目里面的CarSystemUI源码默认无Android studio版本,为了后期快速开发调试需要构建Android studio能直接编译出来apk的工程,构建的过程先不表总之巨麻烦,构建完的工程结构如下图:
构建是完成了,编出来debug版的apk没问题,但是我编release版的apk编译不过。studio编译报下面的故障:
java
Type com.android.systemui.BuildConfig is defined multiple times: D:\andy_cao\CarSystemUI\app\build\intermediates\project_dex_archive\release\out\com\android\systemui\BuildConfig.dex, D:\andy_cao\CarSystemUI\systemui\build\.transforms\a8853c444618b4986e274bb805eaaac9\transformed\release\com\android\systemui\BuildConfig.dex
这里跑个题:我为啥执着非要编出来release版的apk?
Debug 版本
Debug 是"调试"的意思,Debug 版本就是为调试而生的,编译器在生成 Debug 版本的程序时会加入调试辅助信息,并且很少会进行优化,程序还是"原汁原味"的。
你没听错,不是任何一个程序都可以调试的,程序中必须包含额外的辅助信息才能调试,否则调试器也无从下手。
Release 版本
Release 是"发行"的意思,Release 版本就是最终交给用户的程序,编译器会使尽浑身解数对它进行优化,以提高执行效率,虽然最终的运行结果仍然是我们期望的,但底层的执行流程可能已经改变了。
编译器还会尽量降低 Release 版本的体积,把没用的数据一律剔除,包括调试信息。
最终,Release 版本是一个小巧精悍、非常纯粹、为用户而生的程序。
总结
Debug 版本的存在是为了方便程序员开发和调试,性能和体积不是它的重点;Release 版本是最终交给用户的程序,性能和体积是需要重点优化的两个方面。
在开发过程中,我们一般使用 Debug 版本,只有等到开发完成,确认没有任何 Bug 之后,希望交给用户时再生成 Release 版本。
原因分析:
授人以鱼不如授人以渔
看is defined multiple times意思是BuildConfig被多次定义,但是你用is defined multiple times关键字去搜怎么都搜不到对应的博客,自己又是无数次的尝试无数次的修改始终不行。
解决方案:
后面跟一个前同事聊到此事,他给了个解决方案是在app包下面的build.gradle中曾加如下字段:
java
afterEvaluate {
generateReleaseBuildConfig.enabled = false
generateDebugBuildConfig.enabled = false
}
添加后就可以编译出release版的apk,大家往上看截图里面我选中的就是生成release版的apk
然后我用generateReleaseBuildConfig.enabled能搜到几篇对应解决办法的博客我贴到下面:
https://blog.csdn.net/why1happy/article/details/105765140
https://www.jianshu.com/p/21b4065e58a7
总结
吾日三省吾身,每天进步一点点