Android 混淆proguard的实现(图文)

本文详细介绍了如何在Eclipse环境中手动使用ProGuard对Android工程进行混淆,包括将class文件打包为jar,使用ProGuard混淆jar,配置混淆规则,生成混淆后的classes.dex,并最终将混淆代码集成到apk中。
摘要由CSDN通过智能技术生成

1、  Eclipse中的工程编译运行后,在目录bin下面有生成一些文件,其中classes.dex是未经过混淆生成的。而我们要混淆的话,就要重新生成一个混淆过的classes.dex。本文主要讲怎样手动生成混淆proguard

2、  生成一个混淆过的classes.dex:要先对目录bin下面的classes目录(在Eclipse中看不到,系统文件管理中可查看)的class文件打包成jar, 再对jar进行proguard混淆,混淆后再用android dx 命令生成混淆的classes.dex

3、  class文件打包成jar:控制台CMD进入classes目录,调用jar cvfM classes.jar android cn com,其中classes.jar是你要生成的jar包名称,android cn com 是指classes下面的目录

4、  jar进行proguard混淆,首先确定你的工程已经有混淆文件proguard.cfg。在android sdk目录下找到:C:\android-sdk-windows\tools\proguard\bin\proguardgui.bat

Android命令行打包,多渠道打包,加上混淆proguard的实现 - liangroger - liangroger的个人主页
 

InputOutput选项中,选择你的Add input…文件,上面打好的classes.jarAdd output命名你的输出混淆jar(classes_out.jar),在Library jars,wars,ears,zips and directories一栏中Add进你选择编译的android sdk版本源包(C:\android-sdk-windows\platforms\android-7\android.jar),再添加你的工程中libs引用的第三方jar

 

点击“process”,再点击“save configuration”,在弹出的对话框中,输入要保存的配置文件名称(这里我的是test.pro),最后点击保存

Android命令行打包,多渠道打包,加上混淆proguard的实现 - liangroger - liangroger的个人主页
 

用编辑器编辑刚才保存下来的“test.pro”,用记事本什么都可以。要里面有关的proguard信息替换成你工程中定好的proguard.cfg内容,保存。

重新打开progrard,执行 bin目录下的proguardgui.bat

   点击第一个选项“Proguard”,再点击“Load configuration”,选择我们刚才保存的“test.pro”进行加载。

  

Android命令行打包,多渠道打包,加上混淆proguard的实现 - liangroger - liangroger的个人主页
 

开始混代码,点击右边“process”,再点击“process!”

在等待处理完成后,输出的“classes_out.jar”,就是混过的jar包。

以上有关使用proguardgui.bat的参照自:http://java-server.iteye.com/blog/1166114

 

5、  对已经混淆的classes_out.jar包,放进工程的bin目录下,生成classes.dex

//android sdk目录下的platform-tools\dx.bat

其实也可以直接用我之前发布的打包工具中的createUnsignedApk这个方法。

参看:http://blog.csdn.net/hytfly/article/details/24458133

这样生成classes.dex然后在签名打包的,就是混淆以后的代码了。

6.为了方便,其实可以自己也写到那个打包工具中去打包。自己生成classes.jar和out.jar,然后再自动打包。分享两个方法:

/**
     * 在bin下生成纯净的classes.jar文件
     */
    public static void createJar(){
    	try{
            System.out.println("create jar start");
            Process process = null;
            String cmd;
            //相当于先cd到 -C的目录下,然后执行没有C的这部分语句,注意.代表当前目录
            cmd = "cmd.exe /C jar cvf "+PROJECT_PATH+"bin\\classes.jar "
            		+"-C "+PROJECT_PATH+"bin\\classes .";
            System.out.println(cmd);
            process = Runtime
                    .getRuntime()
                    .exec(cmd); // 生成jar文件
            new MyThread(process.getErrorStream()).start();

            new MyThread(process.getInputStream()).start();
            process.waitFor();
            process.destroy();
            System.out.println("create jar over"); // 一条渠道的打包完成。文件会输出到指定目录
        }catch(Exception e){
            e.printStackTrace();
            System.exit(0);
        }
    }
    
    /**
     * 在bin下生成混淆后的classes_out.jar文件(在PROGUARD_PATH配置文件中写)
     * 运行proguard程序如果报错,请在cmd查看错误,可能是路径问题,自己修改proguard.bat文件
     */
    public static void createProguardJar(){
    	try{
            System.out.println("create ProguardJar start");
            File file=new File(PROGUARD_PATH);
            if(!file.exists()) System.out.println("not found "+PROGUARD_PATH);
            file=new File(PROJECT_PATH+"bin\\classes_out.jar ");
            if(file.exists()) file.delete();
            Process process = null;
            String jarsigner;
            jarsigner = androidSDK_PATH+"tools\\proguard\\bin\\proguard.bat " +
            		"-include "+PROGUARD_PATH;
            System.out.println(jarsigner);
            process = Runtime
                    .getRuntime()
                    .exec(jarsigner); // 生成混淆后的jar文件
            new MyThread(process.getErrorStream()).start();

            new MyThread(process.getInputStream()).start();
            process.waitFor();
            process.destroy();
            System.out.println("create ProguardJar over"); 
        }catch(Exception e){
            e.printStackTrace();
            System.exit(0);
        }
    }

再分享一下proguard.pro配置文件的一些方法:http://blog.csdn.net/yunyu5120/article/details/13024359 这个老兄写的ok了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值