龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

使用Proguard混淆J2ME应用程序[组图]

时间:2009-12-23 15:42来源:未知 作者:admin 点击:
分享到:
假如我们的开发的J2ME应用程序直接打包成JAR文件发布,那么存在被其他人反编译的可能。因为反编译class文件并不是一件困难的事情。为了保护我们的程序代码不被破解,我们可以使用

  假如我们的开发的J2ME应用程序直接打包成JAR文件发布,那么存在被其他人反编译的可能。因为反编译class文件并不是一件困难的事情。为了保护我们的程序代码不被破解,我们可以使用混淆器Proguard。非常幸运的是eclipse已经把Proguard集成在一起了。
  
  Proguard是开源的软件,他是基于Java语言写成的,因此他的运行需要java2运行环境。我们可以从http://Proguard.sourceforge.net 免费下载到。目前的最新版本为proguard3.0。把他解压缩安装在C:proguard3.0.1。运行eclipse,选择菜单windows-preferences-j2me-obfuscation,在这里我们应该指定正确的Proguard的根目录,由于我们混淆的时候要保留扩展了MIDlet的类,不然程序将无法执行。所以在Proguard keep eXPressions中应该写public class * extends javax.microedition.midlet.MIDlet。请参考下图
   
  下面我们按照开发J2ME的应用程序一样编写代码、编译、预验证。为了节省时间,在这里略去这些步骤。以下面的代码为例演示如何使用proguard混淆J2ME应用程序:
  
  import javax.microedition.midlet.MIDlet;
  import javax.microedition.midlet.MIDletStateChangeException;
  import javax.microedition.lcdui.*;
  import java.io.*;
  import javax.microedition.io.*;
  
  public class ImageGetter extends MIDlet implements CommandListener
  {
  
  private Display display;
  public static final Command connCommand = new Command("Connect",
  Command.ITEM, 1);
  public static final Command exitCommand = new Command("Exit", Command.EXIT,
  1);
  private Form mainForm;
  private GetterThread gt;
  
  protected void startApp() throws MIDletStateChangeException
  {
  
  display = Display.getDisplay(this);
  mainForm = new Form("Image Getter");
  mainForm.append("Click Connect to get Image");
  mainForm.addCommand(connCommand);
  mainForm.addCommand(exitCommand);
  mainForm.setCommandListener(this);
  display.setCurrent(mainForm);
  gt = new GetterThread(this);
  gt.start();
  
  }
  
  public void setImage(Image image)
  {
  
  mainForm.append(image);
  display.setCurrent(mainForm);
  }
  
  protected void pauseApp()
  {
  
  }
  
  protected void destroyApp(boolean arg0) throws MIDletStateChangeException
  {
  
  }
  
  public void commandAction(Command cmd, Displayable disp)
  {
  if (cmd == connCommand)
  {
  synchronized (this)
  {
  notify();
  }
  } else if (cmd == exitCommand)
  {
  exitMIDlet();
  }
  }
  
  private void exitMIDlet()
  {
  try
  {
  destroyApp(false);
  notifyDestroyed();
  } catch (MIDletStateChangeException e)
  {
  e.printStackTrace();
  }
  }
  
  class GetterThread extends Thread
  {
  private ImageGetter midlet;
  public static final String URL = "http://localhost/j2medev.png";
  private HttpConnection httpConn = null;
  private InputStream is = null;
  
  public GetterThread(ImageGetter midlet)
  {
  this.midlet = midlet;
  }
  
  public void run()
  {
  synchronized (midlet)
  {
  try
  {
  midlet.wait();
  } catch (InterruptedException e)
  {
  e.printStackTrace();
  }
  }
  System.out.println("connect to server...");
  try
  {
  httpConn = (HttpConnection) Connector.open(URL);
  is = httpConn.openInputStream();
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  int ch = 0;
  while ((ch = is.read()) != -1)
  {
  baos.write(ch);
  }
  byte[] imageData = baos.toByteArray();
  Image image = Image.createImage(imageData, 0, imageData.length);
  midlet.setImage(image);
  baos.close();
  is.close();
  httpConn.close();
  
  } catch (IOException e)
  {
  e.printStackTrace();
  }
  
  }
  }
  
  }
  
  右键选择项目GetImage-J2ME-create obfuscated package,这样proguard就会把除MIDlet之外的class文件混淆。如下图所示:
  
  在deploy文件夹内我们可以看到GetImage.jar、GetImage.jad和一些proguard产生的其他文件,你可以用jar命令解开GetImage.jar,发现他的另一个class文件已经被混淆成a.class了,MIDlet类则没有任何改变,Proguard除了混淆的功能之外同时会把我们的jar文件减小,提高一些运行效率。
  
精彩图集

赞助商链接