前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Maven - 代码混淆Proguard踩坑记

Maven - 代码混淆Proguard踩坑记

作者头像
小小工匠
发布2024-05-26 13:42:16
1270
发布2024-05-26 13:42:16
举报
文章被收录于专栏:小工匠聊架构小工匠聊架构

Pre

Maven - 代码混淆proguard-maven-plugin vs 代码加密classfinal

概述

ProGuard是一个Java代码混淆工具,它可以让你的Java程序变得更小、更快,同时也更安全。因为Java代码很容易被反编译,所以有时候需要对代码进行混淆,以保护你的知识产权。

ProGuard主要做了三件事:

  1. 压缩代码 - 它会删除程序中没有用到的类、属性和方法,让程序变小。
  2. 优化代码 - 它会优化代码结构,让程序运行更快。
  3. 混淆代码 - 它会把类名、属性名和方法名改成难懂的名字,让代码变得很难看懂。

ProGuard会自动混淆大部分代码,但有些代码不应该被混淆,比如注解、native方法、反射用到的方法等,需要在配置文件中指定保留

代码语言:javascript
复制
-keep class com.example.** { *; }

混淆后的代码虽然很难看懂,但还是可以被反编译的。所以ProGuard只是增加了反编译的难度,并不能完全防止代码被反编译。

总之,ProGuard是一个很好用的Java代码混淆工具,可以保护你的代码,让你的程序变小变快。只要会一点点配置,就可以很容易地使用它了。


proguard-maven-plugin 代码混淆

官网地址

https://github.com/wvengen/proguard-maven-plugin

https://wvengen.github.io/proguard-maven-plugin/


实战

proguard.cfg

代码语言:javascript
复制
# 指定Java编译目标版本为1.8
-target 1.8

# Proguard配置项:指定不进行代码缩小优化
-dontshrink

# 指定不进行字节码级别的优化
-dontoptimize

# 混淆时不生成大小写混合的类名
-dontusemixedcaseclassnames

# 混淆时使用唯一类成员命名策略
-useuniqueclassmembernames

# 同上,再次指定不生成大小写混合的类名
-dontusemixedcaseclassnames

# 混淆类名后,对使用Class.forName('className')等进行相应替代
-adaptclassstrings

# 保留异常、内部类、签名、弃用注解、源文件、行号表、注解、封装方法等信息
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod

# 保留所有接口的原始名称不进行混淆
-keepnames interface ** { *; }

# 保留所有包中原始接口文件不进行混淆
# -keep interface * extends * { *; }

# 保留方法参数名
-keepparameternames

# 保留枚举成员及方法
-keepclassmembers enum * { *; }

# 不混淆所有类,保留特定注解的原始定义注释
-keepclassmembers class * {
@org.springframework.context.annotation.Bean *;
@org.springframework.beans.factory.annotation.Autowired *;
@org.springframework.beans.factory.annotation.Value *;
@org.springframework.stereotype.Service *;
@org.springframework.stereotype.Component *;
}

# 忽略warn消息
-ignorewarnings

# 忽略note消息
-dontnote

# 打印配置信息
-printconfiguration

# 保持启动类不被混淆
-keep public class com.artisan.pg.example.ProguardApplication {
public static void main(java.lang.String[]);
}

重点关注 -keep


pom中引入插件

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         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">
    <parent>
        <artifactId>boot2</artifactId>
        <groupId>com.artisan</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>boot-proguard</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>


    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
    </dependencies>


    <!-- 定义构建插件 -->
    <build>
        <plugins>
            <!-- Proguard Maven 插件配置,用于代码混淆 -->
            <plugin>
                <groupId>com.github.wvengen</groupId>
                <artifactId>proguard-maven-plugin</artifactId>
                <version>2.6.0</version>
                <executions>
                    <!-- 配置执行阶段为package,即在打包时执行代码混淆 -->
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>proguard</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!-- 指定输入Jar文件名 -->
                    <injar>${project.build.finalName}.jar</injar>
                    <!-- 指定输出Jar文件名,与输入Jar同名,实现覆盖 -->
                    <outjar>${project.build.finalName}.jar</outjar>
                    <!-- 混淆开关,默认为true -->
                    <obfuscate>true</obfuscate>
                    <!-- 指向proguard配置文件 -->
                    <proguardInclude>${project.basedir}/proguard.cfg</proguardInclude>
                    <!-- 添加额外的jar包路径,通常为项目编译所需 -->
                    <libs>
                        <lib>${java.home}/lib/rt.jar</lib>
                        <lib>${java.home}/lib/jce.jar</lib>
                        <lib>${java.home}/lib/jsse.jar</lib>
                    </libs>
                    <!-- 过滤输入Jar中的文件,例如不处理META-INF目录下的文件 -->
                    <inLibsFilter>!META-INF/**,!META-INF/versions/9/**.class</inLibsFilter>
                    <!-- 指定输出目录 -->
                    <outputDirectory>${project.basedir}/target</outputDirectory>
                    <!-- 混淆配置的细节选项,例如指定哪些类不进行混淆,可选配置项 -->
                    <options>
                        <!-- 具体的混淆配置可在此处或外部配置文件中定义 -->
                    </options>
                </configuration>
            </plugin>
            <!-- Spring Boot Maven 插件配置,用于打包可执行的Jar包 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <!-- 配置执行阶段为repackage,即重新打包 -->
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                        <!-- 指定主类路径 -->
                        <configuration>
                            <mainClass>com.artisan.pg.example.ProguardApplication</mainClass>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>


</project>

打包


混淆包


常见问题和解决方法

  • 类/方法未找到错误:确保Proguard配置中保留了所有必要的类和方法。可以尝试使用Proguard的-keep指令保留这些类。
  • 反射相关错误:如果项目中使用了反射,确保在Proguard配置中保留相关类和方法。
  • 运行时错误:检查混淆后的JAR包中是否有必要的资源文件,并确保它们在混淆过程中未被移除。

推荐

推荐 代码加密classfinal , 不推荐Proguard,太复杂

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Pre
  • 概述
  • proguard-maven-plugin 代码混淆
    • 官网地址
    • 实战
      • proguard.cfg
        • pom中引入插件
          • 打包
            • 混淆包
              • 常见问题和解决方法
              • 推荐
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档