安卓AIDL、proguard、调试和发布模式头疼的问题

问题描述 投票:1回答:1

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

但是当我试图在发布模式下构建整个项目时,当我试图安装服务(而不是主应用程序)时,我得到了一个构建错误,即AIDL APIs是重复的(在蓝牙库 "构建 "目录中存在一个与服务构建目录相同的classes.jar)。实际的信息是

Type com.pcha.proprietary.handler.IConnectionCallback$Default is defined multiple times:

有没有人明白这个道理?我猜想,如果我把服务做成一个 单独项目 (在Android Studio中,它必须出现在一个单独的窗口中,这很麻烦),这将是罚款。

我有最新版本的AS,截至422020年

我试着删除IPC服务模块中的AIDL文件副本,并指向主蓝牙服务中的单个AIDL文件。再次,这在调试模式下确实有效,但只要我转到发布模式,我就会得到同样的定义多次的错误。

一些进展: 在每一个IPC服务中,我都删除了AIDL目录,并且在gradle.build文件中,我排除了源代码中对aidl文件的任何引用。这样我就可以在发布模式和调试模式下进行构建,但是IPC和主服务只有在minifyEnabled为假的情况下才能工作。在minfiyEnabled为真时,主服务找不到IPC服务。

android android-studio aidl
1个回答
0
投票

这个问题比我想象的要复杂。在调试模式下,似乎可以摆脱任何东西。但不能发布。

该项目有一个单一的应用,使用一个蓝牙库服务和两个IPC服务。但是,IPC服务是作为一个模块建立在同一个项目中的。为什么呢?Android Studio中不是Eclipse--每个Window只能有一个项目! 模块,但是,引入了问题。但这里是如何让它在发布时与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

要对蓝牙库ars和IPC服务APKs进行最小化 需要做更多的工作 需要独立于build的工作。Minifying library aarsjars需要对构建的文件进行第二次处理......至少我不知道有什么其他的方法可以做到这一点。

然而这超出了原来的问题,但仍然是我想做的事情。望能得到任何帮助,进一步了解这个乱七八糟的问题。

© www.soinside.com 2019 - 2024. All rights reserved.