几个星期以来,我一直在寻找(这个网站和其他网站)的答案。我很确定我的问题在于我如何在 proguard-project.txt 中定义我的保留选项。
我在我的应用程序中添加了一个 java 接口,因此它能够使用 TelephonyManager 来获取 IMEI。当我在构建中不使用 ProGuard 时,这可以正常工作。当我使用 Proguard 时,getIMEI 功能不再起作用。
这是 GetNativeTelephonyManager.java 代码:
package com.abc.myapp1;
import org.apache.cordova.DroidGap;
import android.content.Context;
import android.telephony.TelephonyManager;
import android.webkit.WebView;
public class GetNativeTelephonyManager {
private WebView mAppView;
private DroidGap mGap;
public GetNativeTelephonyManager(DroidGap gap, WebView view){
mAppView = view;
mGap = gap;
}
public String getIMEI(){
TelephonyManager tm = (TelephonyManager) mGap.getSystemService(Context.TELEPHONY_SERVICE);
String imeiId = tm.getDeviceId();
return imeiId;
}
}
这是 MainActivity.java 代码:
package com.abc.myapp1;
import android.os.Bundle;
import org.apache.cordova.DroidGap;
public class MainActivity extends DroidGap {
GetNativeTelephonyManager gntm;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.init();
gntm = new GetNativeTelephonyManager(this, appView);
appView.addJavascriptInterface(gntm, "GetNativeTelephonyManager");
super.loadUrl("file:///android_asset/www/index.html");
}
}
这是 proguard-project.txt 选项:
-keep public class * extends com.phonegap.api.Plugin
-keep public class * extends org.apache.cordova.api.Plugin
-keep public class org.apache.cordova.DroidGap
-keep public class org.apache.cordova.**
-keep public class **.GetNativeTelephonyManager { *; }
-keepclassmembers public class **.GetNativeTelephonyManager { *; }
-libraryjars libs/cordova-2.1.0.jar
-dontwarn android.webkit.*
-dontwarn org.apache.**
使用 dex2jar 和 JD-GUI,我已经能够在 proguard 运行后检查 MainActivity 和 GetNativeTelephonyManager 类。代码略有变化,当我在我的设备上运行应用程序时,使用 window.GetNativeTelephonyManager.getIMEI() 时,imei 不再可用
这是proguard之后的MainActivity.java:
package com.abc.myapp1;
import android.os.Bundle;
import org.apache.cordova.CordovaWebView;
import org.apache.cordova.DroidGap;
public class MainActivity
extends DroidGap
{
GetNativeTelephonyManager a;
public void onCreate(Bundle paramBundle)
{
super.onCreate(paramBundle);
super.b();
this.a = new GetNativeTelephonyManager(this, this.d);
this.d.addJavascriptInterface(this.a, "GetNativeTelephonyManager");
super.a("file:///android_asset/www/index.html");
}
}
这是proguard之后的GetNativeTelephonyManager.java:
package com.abc.myapp1;
import android.telephony.TelephonyManager;
import android.webkit.WebView;
import org.apache.cordova.DroidGap;
public class GetNativeTelephonyManager
{
private WebView mAppView;
private DroidGap mGap;
public GetNativeTelephonyManager(DroidGap paramDroidGap, WebView paramWebView)
{
this.mAppView = paramWebView;
this.mGap = paramDroidGap;
}
public String getIMEI()
{
return ((TelephonyManager)this.mGap.getSystemService("phone")).getDeviceId();
}
}
它一直让我发疯。我确定以前已经这样做过,但我找不到答案。真的很感激一点帮助。干杯。