android class.getInterfaces()返回空

mum43rcc  于 2024-01-04  发布在  Android
关注(0)|答案(2)|浏览(139)

我的代码是这样的:

  1. // ITest.java
  2. interface ITest {
  3. }
  4. // TestA.java
  5. class TestA implements ITest {
  6. }
  7. // TestB.java
  8. class TestB extends TestA implements ITest {
  9. }
  10. // main function
  11. void main() {
  12. TestB testB = new TestB();
  13. Class[] interfaces = testB.getClass().getInterfaces();
  14. // The count is 0 when gradle version is 7.x
  15. int count = interfaces.length();
  16. }
  17. // build.gradle
  18. android {
  19. buildTypes {
  20. debug {
  21. minifyEnabled true
  22. }
  23. }
  24. }

字符串
如果gradle版本为7.x,则interfaces.length()为0。例如:

  1. Gradle version -> 7.6.3
  2. Android Gradle plugin -> 7.4.2


如果gradle版本为6.x,则interfaces.length()为1。例如:

  1. Gradle version -> 6.5.1
  2. Android Gradle plugin -> 4.1.2


如果gradle版本为7.x,minifyEnabled false,则interfaces.length()为1。例如:

  1. Gradle version -> 7.6.3
  2. Android Gradle plugin -> 7.4.2
  3. android {
  4. buildTypes {
  5. debug {
  6. minifyEnabled false
  7. }
  8. }
  9. }


我必须升级gradle版本到7.x在我的android项目和minifyEnabled true所以,我怎么能解决这个问题?我希望interfaces.length()不是0。

lp0sw83n

lp0sw83n1#

将以下ProGuard规则添加到proguard-rules.pro文件中:

  1. # Keep the ITest interface
  2. -keep interface your.package.name.ITest

字符串
your.package.name替换为ITest所在的实际软件包名称。此规则指示ProGuard保留指定的接口,并防止其在缩小过程中被删除。
添加此规则后,在启用缩小的情况下重新构建项目,interfaces.length()应该返回预期值。

holgip5t

holgip5t2#

我想可能是因为TestA和TestB都实现了ITest,但是TestB继承了TestA,间接实现了ITest。Gradle在编译时对其进行了优化,去掉了TestB直接实现的ITest接口。但是如何避免这种优化呢?

相关问题