【问题标题】:Android AIDL, proguard, debug and release mode headachesAndroid AIDL、proguard、调试和发布模式令人头疼
【发布时间】:2020-04-02 13:48:04
【问题描述】:

这个问题可能是由于我的 IPC 服务 APK(将作为独立进程运行)在 Android Studio 中配置为 模块 而不是单独的项目。该项目包含一个应用程序和三个模块,一个模块是蓝牙库,另外两个模块创建独立的 IPC 服务 APK。蓝牙库通过 AIDL 使用这些服务。在调试模式下,我可以将 Android Studio 中的服务安装为无活动 APK。我还可以安装使用 Android Studio 中的蓝牙库的主应用程序。它在调试模式下工作正常。

但是,当我尝试在发布模式下构建整个项目时,当我尝试安装 AIDL API 重复的服务(不是主应用程序)时出现构建错误(相同的 classes.jar 存在于蓝牙库“构建”目录与服务构建目录中的一样)。实际消息是

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 服务。

【问题讨论】:

  • 您可能应该检查所有依赖项并查看它们是否具有特定的 proguard 配置。您通常需要将一些类设置为 -keep ,它会起作用。你的依赖是什么?
  • @AviParshan 使用 minifyEnabled true 时发生的情况是 Android 删除了所有不公开的类和方法。最终结果是,如果您的模块是一个库,您必须对使用 minifyEnabled false 生成的 aar 文件使用 proguard。所以这是一个两步过程 - 生成 aar,然后单独使用 proguard。有特殊的 proguard '方法'来处理库。它有点难看,但我以前做过小规模的。您希望将 minifyEnabled 排除在初始库构建之外!

标签: android android-studio aidl


【解决方案1】:

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

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

  1. 两个模块 IPC 服务中没有 AIDL 文件的副本(如果将它们构建为单独的项目,则需要)
  2. 不要在 IPC 服务 gradle 文件中引用 AIDL 文件(在独立项目中需要这样做)。

这将允许构建发布,部署两个 IPC 服务 APK 和应用程序,如果在四个 build.gradle 文件中的每一个中设置了“minifyEnabled false”,则运行它。

如果您想设置 '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 服务 APK 需要更多的工作,这些工作需要独立于构建完成。缩小库 aars/jars 需要对构建文件进行第二次处理……至少我知道没有其他方法可以做到这一点。

但这超出了最初的问题,但仍然是我想做的事情。寻求任何帮助并进一步了解这个烂摊子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-25
    • 2015-09-21
    • 1970-01-01
    • 2020-08-17
    • 2013-06-08
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多