Android杂谈--代码混淆及proguard一些错误处理

迷途d书童 发布于 2012/03/26 18:47
阅读 1K+
收藏 0

 

原文地址:http://www.iteye.com/topic/1118875

 

代码混淆说简单的其实就是为了防止别人反编译你的源代码,因为JAVA程序比较容易被反编译,所以如果程序中有一些比较重要的逻辑的话,通过代码混淆来处理的确可以阻止一下被人反编译。

反编译教程可以参考:http://hualang.iteye.com/admin/blogs/994686

不过代码混淆还是不能阻止被反编译xml格式的布局文件,混淆的是JAVA文件。但是混淆后的代码如果经验多的话,可是可以分析出来的,但这是少数

 

下面开始说说这个东西是如何使用的

有两种方式可以实现代码混淆,一种是直接在eclipse中,android 2.3开始支持这个功能;另一种是使用ant。

首先我们会在项目中看到proguard.cfg文件,就不打开了。

只需要在progect.properties中添加如下一句话就可以了



 另外proguard只在发行版本(release)中运行,所以在调试(debug)模式下不必对其进行处理

 

这样就可以了,我们把它(apk文件)倒出来看看与源码到底有什么区别

操作如下:项目--鼠标右键--Android Tools--Export unsigned Applicaiton Package


 

为了看看混淆到底是混淆了什么,我们将apk文件解压,反编译classes.dex。

下面是源代码的样子。

LoveMusicActivity.java

 

Java代码 复制代码  收藏代码
  1. package com.louliljun.lovemusic;   
  2.   
  3. import android.app.Activity;   
  4. import android.content.Intent;   
  5. import android.os.Bundle;   
  6. import android.view.View;   
  7. import android.widget.Button;   
  8.   
  9. public class LoveMusicActivity extends Activity {   
  10.     private Button startBtn,stopBtn;   
  11.     @Override  
  12.     public void onCreate(Bundle savedInstanceState) {   
  13.         super.onCreate(savedInstanceState);   
  14.         setContentView(R.layout.main);   
  15.         startBtn = (Button)findViewById(R.id.startMusic);   
  16.         stopBtn = (Button)findViewById(R.id.stopMusic);   
  17.            
  18.         startBtn.setOnClickListener(new Button.OnClickListener()   
  19.         {   
  20.   
  21.             @Override  
  22.             public void onClick(View arg0) {   
  23.                 startService(new Intent("com.loulijun.lovemusic.ACTION"));   
  24.                    
  25.             }   
  26.                
  27.         });   
  28.            
  29.         stopBtn.setOnClickListener(new Button.OnClickListener()   
  30.         {   
  31.   
  32.             @Override  
  33.             public void onClick(View v) {   
  34.                 stopService(new Intent("com.loulijun.lovemusic.ACTION"));   
  35.                    
  36.             }   
  37.                
  38.         });   
  39.     }   
  40. }  

 

 MusicService.java

 

Java代码 复制代码  收藏代码
  1. package com.louliljun.lovemusic;   
  2.   
  3. import android.app.Service;   
  4. import android.content.Intent;   
  5. import android.media.MediaPlayer;   
  6. import android.os.IBinder;   
  7.   
  8. public class MusicService extends Service {   
  9.     private MediaPlayer mp;   
  10.     @Override  
  11.     public IBinder onBind(Intent arg0) {   
  12.         // TODO Auto-generated method stub   
  13.         return null;   
  14.     }   
  15.     @Override  
  16.     public void onDestroy() {   
  17.         // TODO Auto-generated method stub   
  18.         super.onDestroy();   
  19.         mp.stop();   
  20.     }   
  21.     @Override  
  22.     public void onStart(Intent intent, int startId) {   
  23.         // TODO Auto-generated method stub   
  24.         super.onStart(intent, startId);   
  25.         mp = MediaPlayer.create(this, R.raw.nala);   
  26.         mp.start();   
  27.     }      
  28.   
  29. }  
 

 

下面是混淆编译后的样子。

 

这里Activity也变得缺胳膊少腿的,让人看了很蛋疼



 

 


不过仔细分析下还是可以还原源程序的,但是代码量很大的情况下就比较恼火了,几乎无法被原样破解

 

注意:

在添加了"proguard.config=proconfig.cfg"这句话后,如果导出apk的时候有如下的问题的话,说明是proguard的版本问题,当然网上也有将版本号降低来解决的,但是我没有解决。我的解决方案是:最彻底的方法是将 Android SDK 2.3 包含的 ProGuard v4.4 升级到 v4.6,就能彻底解决该问题。

 

即下载http://proguard.sourceforge.net/中最新的4.6版本的proguard,然后解压后将里面的bin目录和lib目录覆盖到android-sdk-windows/tools/proguard目录下的bin和lib目录即可,然后再导出项目就没问题了




 

 

如果还想了解更多,推荐几篇文章

http://www.cnblogs.com/over140/archive/2011/04/22/2024528.html#ConfiguringProGuard

http://proguard.sourceforge.net/index.html#/manual/introduction.html

http://www.iteye.com/topic/1012395

 

有关ant的文章

http://www.java3z.com/cwbwebhome/article/article2/2764.html

http://www.cnblogs.com/tankaixiong/archive/2010/11/24/1887156.html


原文链接:http://blog.csdn.net/liao3841054/article/details/7096461
加载中
返回顶部
顶部