Java maven 環境下使用proguard-maven-plugin 外掛混淆程式碼
阿新 • • 發佈:2019-02-09
相關連結
maven配置:
<?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.yunshouhu</groupId> <artifactId>ApkProtect</artifactId> <version>1.0</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> <java.version>1.7</java.version> </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>${java.version}</source> <target>${java.version}</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.yunshouhu.apkprotect.MainHelper</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> <plugin> <groupId>com.pyx4me</groupId> <artifactId>proguard-maven-plugin</artifactId> <executions> <execution> <phase>package</phase> <goals> <goal>proguard</goal> </goals> </execution> </executions> <configuration> <obfuscate>true</obfuscate> <proguardInclude>${basedir}/proguard.conf</proguardInclude> <!-- 新增依賴,這裡你可以按你的需要修改 --> <libs> <lib>${java.home}/lib/rt.jar</lib> <lib>lib/fcexporter_jdk1.5.jar</lib> <lib>lib/fcexporthandler.jar</lib> <lib>lib/jsp-api.jar</lib> <lib>lib/servlet-api.jar</lib> </libs> <addMavenDescriptor>false</addMavenDescriptor> </configuration> <dependencies> <!-- 使用4.8版本來混淆 --> <dependency> <groupId>net.sf.proguard</groupId> <artifactId>proguard</artifactId> <version>4.4</version> <scope>runtime</scope> </dependency> </dependencies> </plugin> </plugins> </build> </project>
ok版本
<?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.yunshouhu</groupId> <artifactId>ApkProtect</artifactId> <version>1.0</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <java.version>1.8</java.version> </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>${java.version}</source> <target>${java.version}</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.yunshouhu.apkprotect.MainHelper</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> <plugin> <groupId>com.github.wvengen</groupId> <artifactId>proguard-maven-plugin</artifactId> <version>2.0.11</version> <executions> <execution> <phase>package</phase> <goals> <goal>proguard</goal> </goals> </execution> </executions> <configuration> <attach>true</attach> <attachArtifactClassifier>proguard</attachArtifactClassifier> <!-- attach 的作用是在 install 與 deploy 時將生成的 pg 檔案也安裝與部署 --> <options> <!-- 詳細配置方式參考 ProGuard 官方文件 --> <!--<option>-dontobfuscate</option>--> <option>-ignorewarnings</option> <!--忽略所有告警--> <option>-dontshrink</option> <!--不做 shrink --> <option>-dontoptimize</option> <!--不做 optimize --> <option>-dontskipnonpubliclibraryclasses</option> <option>-dontskipnonpubliclibraryclassmembers</option> <!--不要重構包名 <option>-repackageclasses org.noahx.proguard.example.project2.pg</option> --> <!--平行包結構(重構包層次),所有混淆的類放在 pg 包下--> <!--保護程式入口--> <option>-keep public class com.yunshouhu.apkprotect.MainHelper { public static void main(java.lang.String[]);}</option> <!-- 以下為 Keep,哪些內容保持不變,因為有一些內容混淆後(a,b,c)導致反射或按類名字串相關的操作失效 --> <option>-keep class **.package-info</option> <!--保持包註解類--> <option>-keepattributes Signature</option> <!--JAXB NEED,具體原因不明,不加會導致 JAXB 出異常,如果不使用 JAXB 根據需要修改--> <!-- Jaxb requires generics to be available to perform xml parsing and without this option ProGuard was not retaining that information after obfuscation. That was causing the exception above. --> <option>-keepattributes SourceFile,LineNumberTable,*Annotation*</option> <!--保持原始碼名與行號(異常時有明確的棧資訊),註解(預設會過濾掉所有註解,會影響框架的註解)--> <option>-keepclassmembers enum org.noahx.proguard.example.project2.** { *;}</option> <!--保持列舉中的名子,確保列舉 valueOf 可以使用--> <option>-keep class org.noahx.proguard.example.project2.bean.** { *;}</option> <!--保持 Bean 類,(由於很多框架會對 Bean 中的內容做反射處理,請根據自己的業務調整) --> <option>-keep class org.noahx.proguard.example.project2.Project2 { public void init(); public void destroy(); } </option> <!-- 保持對外的介面性質類對外的類名與方法名不變 --> </options> <outjar>${project.build.finalName}-proguard</outjar> <libs> <lib>${java.home}/lib/rt.jar</lib> </libs> </configuration> </plugin> </plugins> </build> </project>
proguard.cfg 檔案方式配置ok版本
proguard.cfg檔案<?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.yunshouhu</groupId> <artifactId>ApkProtect</artifactId> <version>1.0</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> <java.version>1.7</java.version> </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>${java.version}</source> <target>${java.version}</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.yunshouhu.apkprotect.MainHelper</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> <plugin> <groupId>com.github.wvengen</groupId> <artifactId>proguard-maven-plugin</artifactId> <version>2.0.11</version> <executions> <execution> <phase>package</phase> <goals> <goal>proguard</goal> </goals> </execution> </executions> <configuration> <obfuscate>true</obfuscate> <proguardInclude>${basedir}/proguard.cfg</proguardInclude> <attach>true</attach> <attachArtifactClassifier>proguard</attachArtifactClassifier> </configuration> </plugin> </plugins> </build> </project>
# ----------------------------------
# 通過指定數量的優化能執行
# -optimizationpasses n
# ----------------------------------
-optimizationpasses 3
# ----------------------------------
# 混淆時不會產生形形色色的類名
# -dontusemixedcaseclassnames
# ----------------------------------
-dontusemixedcaseclassnames
# ----------------------------------
# 指定不去忽略非公共的庫類
# -dontskipnonpubliclibraryclasses
# ----------------------------------
#-dontskipnonpubliclibraryclasses
# ----------------------------------
# 不預校驗
# -dontpreverify
# ----------------------------------
# -dontpreverify
# ----------------------------------
# 輸出生成資訊
# -verbose
# ----------------------------------
-verbose
#混淆時應用侵入式過載
-overloadaggressively
#優化時允許訪問並修改有修飾符的類和類的成員
-allowaccessmodification
#確定統一的混淆類的成員名稱來增加混淆
-useuniqueclassmembernames
-ignorewarnings
-dontshrink
-dontoptimize
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-keep public class com.yunshouhu.apkprotect.MainHelper { public static void main(java.lang.String[]);}
-keep class **.package-info
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable,*Annotation*
-keep public class com.yunshouhu.apkprotect.MainHelper {
public static void main(java.lang.String[]);
}
#這裡新增你不需要混淆的類
-keep class com.zsoftware.common.cache.** {*;}
-keep public class * extends javax.servlet.Servlet
-keepattributes **
#-keepnames class * implements java.io.Serializable
# ---------保護所有實體中的欄位名稱----------
-keepclassmembers class * implements java.io.Serializable {
<fields>;
}
# --------- 保護類中的所有方法名 ------------
-keepclassmembers class * {
public <methods>;
}