1. 程式人生 > >Java maven 環境下使用proguard-maven-plugin 外掛混淆程式碼

Java maven 環境下使用proguard-maven-plugin 外掛混淆程式碼

相關連結

 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版本
<?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>
proguard.cfg檔案
 

# ----------------------------------
#  通過指定數量的優化能執行
#  -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>;
}