0

几个星期以来,我一直在寻找(这个网站和其他网站)的答案。我很确定我的问题在于我如何在 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();
  }
}

它一直让我发疯。我确定以前已经这样做过,但我找不到答案。真的很感激一点帮助。干杯。

4

1 回答 1

0

事实证明,上面的很好。我已将目标更改为 android-19。对于 android target >= 17,您需要将 @JavascriptInterface 添加到要从 javascript 使用的每个方法中。

注意:还需要添加:import android.webkit.JavascriptInterface;

所以 GetNativeTelephonyManager.java 代码现在是:

import org.apache.cordova.DroidGap;
import android.content.Context;
import android.telephony.TelephonyManager;
import android.webkit.WebView;
import android.webkit.JavascriptInterface;

public class GetNativeTelephonyManager {
    private WebView mAppView;
    private DroidGap mGap;
    public GetNativeTelephonyManager(DroidGap gap, WebView view){
        mAppView = view;
        mGap = gap;
    }
    @JavascriptInterface
    public String getIMEI(){
        TelephonyManager tm = (TelephonyManager) mGap.getSystemService(Context.TELEPHONY_SERVICE);
        String imeiId = tm.getDeviceId();      
        return imeiId;
    }
}

希望以上内容可以帮助遇到同样问题的其他人。

于 2014-05-03T14:50:59.043 回答