当在安卓应用中使用Proguard时,反射方法无法正常工作。

12

在使用ProGuard对包含反射使用TelephonyService API的Android应用程序进行混淆时,我遇到了问题。

我定义了一个名为com.android.internal.telephony的包,并在其中复制了ITelephony.aidl文件。

这是我使用反射使用电信方法的代码片段。

Class<?> c = Class.forName(tm.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
com.android.internal.telephony.ITelephony telephonyService = 
     (com.android.internal.telephony.ITelephony) m.invoke(tm);

    if(buttonInAction == acceptButton){
       Log.v(TAG, "Answering the call");
       telephonyService.answerRingingCall();
       finish();
    }
    else{
       Log.v(TAG, "Rejecting the call");
       telephonyService.endCall();
       finish();
    }

现在我可以在不使用proguard的情况下使用这些API,但是当我使用proguard进行编译时,它会抛出ClassCastException异常。我知道我需要在proguard.cfg文件中添加一些内容,并且我也尝试了几个选项,如-dontshrink -dontoptimize,但仍然无法解决。

请告诉我是否遗漏了需要添加到该文件中的内容或任何其他解决此问题的方法。 谢谢 纳瓦布


可能是Proguard和Android中的反射问题的重复问题。 - Peter Knego
1
我已经看过了,但并没有对我有太大帮助。 - nawab
我想我已经找到了答案...我使用了选项-keeppackagenames,它正在工作。我仍在验证它。如果这是解决此问题的正确方法,我会发布的。 - nawab
是的,它已经工作了... :) - nawab
1个回答

18

这解决了问题:

-keep class com.android.internal.telephony.ITelephony { *; }

它运行得很完美,但是当我最初应用这个修复程序时遇到了一个问题,因为我没有注意到。我添加了该行代码,但忘记将文件添加到 build.gradle 中。应该像这样添加:proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-project.txt' - A.Alqadomi
无法工作,它抱怨SecurityException:null from uid 10320不允许执行CALL_PHONE。 - hoot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接