java maven 混淆_maven混淆Java代码

Maven 环境下使用 proguard-maven-plugin 插件混淆你的源码

一、场景介绍

两个工程 Project1,Project2(将被混淆的工程)。Project1 将通过 Maven 依赖配置的方式引用混淆后的 Project2。后面我会详细介绍 pom.xml 的配置。

815fcd240a13edb22fb8a0de1a8e3681.png

二、Maven 配置

1、Project1 的 pom.xml

该 pom.xml 比较简单主要通过 classifier 来判断是否使用混淆的 Jar(Project2)

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

org.noahx.proguard.example

project1

1.0-SNAPSHOT

org.noahx.proguard.example

project2

pg

1.0-SNAPSHOT

2、Project2 的 pom.xml

pom.xml 中配置的 proguard-maven-plugin 来做混淆,详细说明见注释。

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

org.noahx.proguard.example

project2

1.0-SNAPSHOT

com.github.wvengen

proguard-maven-plugin

2.0.7

package

proguard

true

pg

-ignorewarnings

-dontshrink

-dontoptimize

-dontskipnonpubliclibraryclasses

-dontskipnonpubliclibraryclassmembers

-repackageclasses org.noahx.proguard.example.project2.pg

-keep class **.package-info

-keepattributes Signature

-keepattributes SourceFile,LineNumberTable,*Annotation*

-keepclassmembers enum org.noahx.proguard.example.project2.** { *;}

-keep class org.noahx.proguard.example.project2.bean.** { *;}

-keep class org.noahx.proguard.example.project2.Project2 { public void init(); public void

destroy(); }

${project.build.finalName}-pg

${java.home}/lib/rt.jar

三、Java 混淆前后内容比较

这里只比较 Project2 类的不同。其它类的比较,请大家使用 jd-gui 等反编译工具进行比较。

1、混淆前的 Project2 类

package org.noahx.proguard.example.project2;

import org.noahx.proguard.example.project2.dao.TestDao;

import org.noahx.proguard.example.project2.impl.User;

/**

* Created by noah on 8/20/14.

*/

public class Project2 {

public void init() {

test1();

test2();

}

private void test1() {

Status on = Status.valueOf("On");

switch (on) {

case On: {

}

break;

case Off: {

}

break;

}

}

private void test2() {

TestDao testDao=new TestDao();

User user=new User();

user.setUserid("abc");

user.setPassword("pwd");

user.setDescription("des");

testDao.save(user);

}

private void test3() {

}

private void test4() {

}

private void throwException() {

throw new RuntimeException("hello");

}

public void destroy() {

test3();

test4();

throwException();

}

}

2、混淆后的 Project2 类

所有没有指定 keep 的内容都变为了 a,b,c...,增大了阅读难度。

package org.noahx.proguard.example.project2;

import org.noahx.proguard.example.project2.pg.a;

public class Project2

{

public void init()

{

b();

c();

}

private void b() {

b localb = b.valueOf("On");

switch (a.a[localb.ordinal()])

{

case 1:

break;

case 2:

}

}

private void c()

{

a locala = new a();

org.noahx.proguard.example.project2.pg.b localb = new org.noahx.proguard.example.project2.pg.b();

localb.a("abc");

localb.b("pwd");

localb.c("des");

locala.a(localb);

}

private void d()

{

}

private void e() {

}

public void a() {

throw new RuntimeException("hello");

}

public void destroy() {

d();

e();

a();

}

}

四、类路径中资源加载问题

使用 ProGuard 产生的 Jar 包,会发生无法定位 Jar 中资源的问题。原因不详,我没有太深入研究。

使用 [类名].class.getResource (),Thread.currentThread().getContextClassLoader().getResource(),不论是否以“/”开头都返回 null。没有混淆的 Jar 是没有这个问题的。

我使用了一种直接读取 Jar 中内容的方式来解决。

final File jarFile = new File([类名].class.getProtectionDomain().getCodeSource().getLocation().getPath()); //定位类所在的 Jar 文件

if(jarFile.isFile()) {

final JarFile jar = new JarFile(jarFile);

Enumeration entries = jar.entries();

while (entries.hasMoreElements()) {

JarEntry entry = entries.nextElement();

if (entry.getName().startsWith("org/noahx")) {

InputStream entryInputStream = jarFile.getInputStream(entry); //遍历包中的内容来获得资源

}

}

jar.close();

}

五、总结

使用 proguard-maven-plugin 插件,既保持了 Maven 的依赖模式,又满足了我的混淆需求。其它详细的参数配置,大家可以参考官方文档。

ProGuard 满足了我的需求。至于是好是坏,希望大家不要围绕这点做没有必要的争论,谢谢。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值