Android AIDL、proguard、调试和发布模式

Android AIDL、proguard、调试和发布模式,android,android-studio,aidl,Android,Android Studio,Aidl,这个问题可能是因为我的IPC服务APK(将作为独立进程运行)被配置为Android Studio中的一个模块,而不是单独的项目。该项目包含一个应用程序和三个模块,一个模块是蓝牙库,另外两个模块创建独立的IPC服务APKs。蓝牙库通过AIDL使用这些服务。在调试模式下,我可以将Android Studio中的服务安装为无活动APK。我还可以安装使用Android Studio蓝牙库的主应用程序。它在调试模式下工作良好 但是,当我尝试以发布模式构建整个项目时,当我尝试安装AIDL API重复的服务(

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

但是,当我尝试以发布模式构建整个项目时,当我尝试安装AIDL API重复的服务(而不是主应用程序)时,就会出现构建错误(蓝牙库“build”目录中存在与服务构建目录中相同的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服务。

问题比我想象的更复杂。在调试模式下,似乎任何事情都可以侥幸逃脱。但不是释放

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

  • 两个模块IPC服务中没有AIDL文件的副本(如果它们是作为单独的项目构建的,则需要这样做)
  • 不要在IPC服务梯度文件中引用AIDL文件(在独立项目中需要这样做)
  • 这将允许一个内置版本,部署两个IPC服务APK和应用程序,并在四个build.gradle文件中的每个文件中设置“minifyEnabled false”时运行它

    如果要设置“minifyEnabled true”以减小应用程序的APK大小,请仅在application 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,需要独立于构建完成更多工作。缩小库AAR/JAR需要对构建的文件进行第二次处理……至少我知道没有其他方法可以做到这一点


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

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

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

  • 两个模块IPC服务中没有AIDL文件的副本(如果它们是作为单独的项目构建的,则需要这样做)
  • 不要在IPC服务梯度文件中引用AIDL文件(在独立项目中需要这样做)
  • 这将允许一个内置版本,部署两个IPC服务APK和应用程序,并在四个build.gradle文件中的每个文件中设置“minifyEnabled false”时运行它

    如果要设置“minifyEnabled true”以减小应用程序的APK大小,请仅在application 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,需要独立于构建完成更多工作。缩小库AAR/JAR需要对构建的文件进行第二次处理……至少我知道没有其他方法可以做到这一点


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

    您可能应该检查所有依赖项,看看它们是否具有特定的proguard配置。您通常需要设置一些要保留的类,这样就可以了。您的依赖关系是什么?@AviParshan使用minifyEnabled时发生的情况是,Android删除了所有非公共的类和方法。最终的结果是,如果您的模块是一个库,则必须对使用minifyEnabled false生成的aar文件使用proguard。因此,这是一个两步过程——生成aar,然后分别使用proguard。有一些特殊的proguard“方法”来处理库。这有点难看,但我以前做过小规模的。您希望在初始库构建中不启用minifyEnabled!您可能应该检查所有依赖项,看看它们是否有特定的proguard配置。您通常需要设置一些要保留的类,这样就可以了。你的依赖关系是什么?@AviParshan使用minifyEnabled时发生的情况是,Android删除了