暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ProGuard+Maven 混淆

匠工精神 2020-11-14
831

哪里有抱怨,哪里就有商业机会。


一个人的认知模型决定了他所能看到的事实。


时间就像海绵里的水,挤挤总是有的。再忙,也要抽时间让自己的心灵安静下来,思考自己真正想要的东西。实话讲最近确实很忙,但却忙的充实吧,公司因数字化转型,电商这边忙着分仓的项目,因前期也做了大量的调研,不至于临时抱佛脚而乱忙。最近一段时间大家议论最多的应该蚂蚁金服的事件,抛开其他因素,从国家、社会的大局观角度看(罗老师在脱口秀的经典台词),我觉得马老师做的过分了,借着互联网搞金融,想避开国家的法规。到最后还是被国家约谈,暂缓上市。在中国,A和T目前两家独大,所有人都在围绕他们的平台转,让后起之秀很难生存,可以说是垄断了中国互联网行业。今年的疫情若不是国人手中还有积蓄,国内早发生金融危机,再看看支付宝在地铁里给花呗打的广告,借用情怀来鼓励人们超前消费。万物有道,这是我一直坚信的真理,人一定要学会谦卑,感恩(圣经里也有一句经典:太初有道,神就是道)。周易里面的乾坤二卦就是最好的佐证:

“天行健,君子以自强不息。”

“地势坤,君子以厚德载物。”

君子处事,应像天一样,奋发图强,当你有了成就后需要像大地一样,厚德载物,回馈社会。


回归正题,今天先带大家简单了解下我们java的混淆编译处理,做android开发应该对此非常熟悉,第三方给到的一些sdk都会通过该技术方案来处理源码。


在准备该专题的时候也遇到了好些坑,所以特此记录下,也方便有需要的小伙伴参考。接下来直接上代码:


<?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">
<modelVersion>4.0.0</modelVersion>

<groupId>com.villiam</groupId>
<artifactId>spring.boot.proguard</artifactId>
<version>2.2.0</version>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
</parent>

<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<proguard.version>6.2.0</proguard.version>
<proguard.maven.plugin.version>2.2.0</proguard.maven.plugin.version>
<lombok.version>1.18.10</lombok.version>
</properties>

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

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>

<build>
<finalName>${artifactId}</finalName>
<plugins>
<plugin>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<version>${proguard.maven.plugin.version}</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>proguard</goal>
</goals>
</execution>
</executions>
<configuration>
<proguardVersion>${proguard.version}</proguardVersion>
<injar>${project.build.finalName}.jar</injar>
<outjar>${project.build.finalName}.jar</outjar>
<obfuscate>true</obfuscate>
<options>
<option>-dontshrink</option>
<option>-dontoptimize</option>

<!-- 优化时允许访问并修改有修饰符的类和类的成员 -->
<option>-allowaccessmodification</option>

<!-- 确定统一的混淆类的成员名称来增加混淆-->
<option>-useuniqueclassmembernames</option>

<!-- 不混淆所有包名-->
<option>-keeppackagenames</option>
<option>-keepdirectories</option>
<option>-dontnote javax.annotation.*</option>
<option>-dontnote org.apache.logging.log4j.util.*</option>
<option>-dontnote module-info</option>
<!-- This option will replace all strings in reflections method invocations with new class names.
For example, invokes Class.forName('className')-->
<option>-adaptclassstrings</option>
<!-- This option will save all original annotations and etc. Otherwise all we be removed from files.-->
<option>-keepattributes
Exceptions,
InnerClasses,
Signature,
Deprecated,
SourceFile,
LineNumberTable,
*Annotation*,
EnclosingMethod
</option>
<!-- This option will save all original names in interfaces (without obfuscate).-->
<option>-keepnames interface **</option>
<!-- This option will save all original methods parameters in files defined in -keep sections,
otherwise all parameter names will be obfuscate.-->
<option>-keepparameternames</option>
<!-- This option will save all original class files (without obfuscate) but obfuscate all
in domain and service packages.-->
<option>-keep
class com.villiam.proguard.example.spring.boot.Application {
public static void main(java.lang.String[]);
}
</option>
<!-- This option ignore warnings such as duplicate class definitions and classes in incorrectly
named files-->
<option>-ignorewarnings</option>
<!-- This option will save all original class files (without obfuscate) in service package-->
<!--<option>-keep class com.villiam.proguard.example.spring.boot.service { *; }</option>-->
<!-- This option will save all original interfaces files (without obfuscate) in all packages.-->
<option>-keep interface * extends * { *; }</option>
<!-- This option will save all original defined annotations in all class in all packages.-->
<option>-keepclassmembers class * {
@org.springframework.beans.factory.annotation.Autowired *;
@org.springframework.beans.factory.annotation.Value *;
}
</option>
</options>
<injarNotExistsSkip>true</injarNotExistsSkip>
<libs>
<!--Put here your libraries if required-->
<lib>/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/rt.jar</lib>
</libs>
</configuration>
<dependencies>
<dependency>
<groupId>net.sf.proguard</groupId>
<artifactId>proguard-base</artifactId>
<version>${proguard.version}</version>
</dependency>
</dependencies>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>

<!-- Maven assembly must be run after proguard obfuscation so it take already obfuscated files.-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<mainClass>com.villiam.proguard.example.spring.boot.Application</mainClass>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>


具体的配置说明都有注释。如果有什么问题可以给我留言。扫码关注,回复proguard 即可获取demo源码。


长按关注,欢迎一起探讨技术

文章转载自匠工精神,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论