android - Android AIDL、proguard、debug 和 release 模式让人头疼
问题描述
这个问题可能是由于我的 IPC 服务 APK(将作为独立进程运行)在 Android Studio 中配置为模块而不是单独的项目。该项目包含一个应用程序和三个模块,一个模块是蓝牙库,另外两个模块创建独立的 IPC 服务 APK。蓝牙库通过 AIDL 使用这些服务。在调试模式下,我可以将 Android Studio 中的服务安装为无活动 APK。我还可以安装使用 Android Studio 中的蓝牙库的主应用程序。它在调试模式下工作正常。
但是,当我尝试在发布模式下构建整个项目时,当我尝试安装 AIDL API 重复的服务(不是主应用程序)时出现构建错误(蓝牙库中存在相同的 classes.jar 'build' 目录与服务构建目录一样)。实际消息是
Type com.pcha.proprietary.handler.IConnectionCallback$Default is defined multiple times:
有人明白这个吗?我的猜测是,如果我将服务设为一个单独的项目(在 Android Studio 中必须出现在一个单独的窗口中,这很痛苦),那就没问题了。
截至 2020 年 4 月 2 日,我拥有最新版本的 AS
我尝试删除 IPC 服务模块中的 AIDL 文件副本,并指向主蓝牙服务中的单个 AIDL 文件。再次,这确实在调试模式下工作,但是一旦我开始发布,我就会得到相同的定义多次错误。
一些进展:在每个 IPC 服务中,我删除了 AIDL 目录,并在 gradle.build 文件中排除了对源集中的aidl 文件的任何引用。这允许我在发布模式和调试模式下构建,但 IPC 和主要服务仅在 minifyEnabled 为 false 时才有效。在 minfiyEnabled true 中,主服务找不到 IPC 服务。
解决方案
问题比我想象的要复杂。在调试模式下,似乎可以摆脱任何事情。但不释放。
该项目有一个使用蓝牙库服务和两个 IPC 服务的应用程序。但是,IPC 服务作为模块构建在同一个项目中。为什么?不是 Eclipse 中的 Android Studio - 每个窗口只有一个项目!然而,模块带来了问题。但这里是如何通过 proguard 最小化让它在发布中工作:
- 两个模块 IPC 服务中没有 AIDL 文件的副本(如果它们被构建为单独的项目,则需要)
- 不要在 IPC 服务 gradle 文件中引用 AIDL 文件(就像在独立项目中需要做的那样)。
如果在四个 build.gradle 文件中的每一个中都设置了“minifyEnabled false”,这将允许一个构建发布,部署两个 IPC 服务 APK 和应用程序并运行它。
如果您想设置“minifyEnabled true”以减小应用程序的 APK 大小,则只能在应用程序 build.gradle 文件中执行此操作。但是,请务必“保留”您定义的每个 AIDL 接口和对象。例如,在我的本地 proguard 文件中:
-keep class com.pcha.proprietary.handler.IConnectionCallback
-keep class com.pcha.proprietary.handler.IStatusEventCallback
-keep class com.pcha.proprietary.handler.IIntermediaryCallback
-keep class com.pcha.proprietary.handler.ILogCallback
-keep class com.pcha.btmanager.PhdInformation
-keep class com.pcha.btmanager.ProprietaryDriverPhdInfo
-keep class com.lni.codephg.inter.MdsIntermediary
-keep class com.lni.codephg.inter.CompoundEntry
-keep class com.lni.codephg.inter.EnumEntry
-keep class com.lni.codephg.inter.Facets
-keep class com.lni.codephg.inter.NumericEntry
-keep class com.lni.codephg.inter.ProfuctionSpecOid
-keep class com.lni.codephg.inter.RtsaEntry
-keep class com.lni.codephg.inter.SpecializationStruct
-keep class com.lni.codephg.fhir.MderFloat
-keep class com.lni.codephg.inter.TimeStruct
要缩小蓝牙库 aars 和 IPC 服务 APKs 需要独立于构建完成的更多工作。缩小库 aars/jars 需要对构建文件进行第二次处理......至少我知道没有其他方法可以做到这一点。
然而,这超出了最初的问题,但仍然是我想做的事情。寻求任何帮助并进一步了解这一混乱局面。
推荐阅读
- java - How to get only characters from a file in java
- brightway - 确定哪些活动或哪些产品导致了非方形技术圈矩阵
- javascript - 将一个 div 的内容溢出到另一个 div
- android - Android 上 Delphi Firemonkey 中的模态弹出窗口
- c# - 如何在 C# 中读取 JsonResult 对象
- javascript - 如何在 Angular 6 中使用 jquery-ui
- excel - 将数据从一张纸移动到另一张纸,无需在 Excel VBA 中复制粘贴
- sql - 这个查询可以优化吗?
- python - 在python中组合由一个系列分隔的两个文本
- c - 如何静态编译 ps(procps)