首页 > 解决方案 > 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 服务。

标签: androidandroid-studioaidl

解决方案


问题比我想象的要复杂。在调试模式下,似乎可以摆脱任何事情。但不释放。

该项目有一个使用蓝牙库服务和两个 IPC 服务的应用程序。但是,IPC 服务作为模块构建在同一个项目中。为什么?不是 Eclipse 中的 Android Studio - 每个窗口只有一个项目!然而,模块带来了问题。但这里是如何通过 proguard 最小化让它在发布中工作:

  1. 两个模块 IPC 服务中没有 AIDL 文件的副本(如果它们被构建为单独的项目,则需要)
  2. 不要在 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 需要对构建文件进行第二次处理......至少我知道没有其他方法可以做到这一点。

然而,这超出了最初的问题,但仍然是我想做的事情。寻求任何帮助并进一步了解这一混乱局面。


推荐阅读