1、什么是混淆?為什么要混淆?這個問題不多說明,簡單講,就是為了保護軟件項目的所有權,防止別人反編譯,將代碼打亂,人看著會很費勁,但對計算機執行沒有障礙。
2、當前項目的結構:項目采用的框架是ssh(spring、struts2、hibernate)的,其中還用了Annotation 注釋標簽。代碼形如:
(1)一個bo的代碼
- /**
- *@preserve all
- */
- @Entity
- @Table(name = "crm_code_clientSort")
- public class ClientSort
- {
- @Id
- @GeneratedValue(generator = "uuidGenerator")
- @GenericGenerator(name = "uuidGenerator", strategy = "uuid")
- @Column(length = 32)
- private String id;//標識
-
- @Column(length = 6)
- private String code; //編號
-
- @Column(length = 20)
- private String name; //名稱
-
- }
(2)action的代碼
- /**
- *@preserve all
- */
- @Controller
- @Scope("prototype")
- @ParentPackage(value = "abc-default")
- @Namespace("/crm/backlog")
- @Results(
- {
- @Result(name = "showInfo", location = "/jsp/crm/backlog/showInfo.jsp"),
- @Result(name = "common", location = "/jsp/crm/backlog/list.jsp"),
- @Result(name = "addBacklog", location = "/jsp/crm/backlog/addBacklog.jsp"),
- @Result(name = "updateBacklog", location = "/jsp/crm/backlog/updateBacklog.jsp")
-
- })
- @InterceptorRef("isLogin")
- public class BacklogAction {
-
- @Resource
- private CRM_BacklogService cRM_backlogService; //此對象是spring自動注入的,因為加了@Resource標簽
-
- @Resource
- private CodeBean codeBean;
-
- private Object fere;
- private Backlog dto;
- //以下略
-
- }
(3)service代碼
- @Service
- public class UserService
- {
- @Resource
- public Dao dao;
-
- public String getTheNum()
- {
- //省略代碼
- return "";
- }
-
-
- /**
- * @preserve public
- */
- public void updateObject(User user)
- {
- dao.updateObject(user);
- }
-
- //********省略其他
- }
3、混淆介紹。
(1)整體混淆級別設置。設置為public的。對所有的代碼混淆。具體配置文件我使用方法,參見jocky的說明文件,附件的壓縮包中有。
- <property name="jocky.scramble.level" value="public"/>
(2)對于不需要混淆的類,加上注釋 @preserve all 將其除外。如上面的bo、action代碼。本項目中不能混淆的類有:
A、action類,可能是由于struts2管理的原因,如果混淆,項目會報錯,找不到相應的action.
B、bo類,該類是和數據庫表一一對應的,改變了,就亂了。因為用的是hibernate自動映射的。
C、其他會被jsp頁面中引用到的類,如dto類,工具類,dwr類等。
(3)對于可以混淆的類,但不能混淆的方法,加上@preserve public 注釋。如上面的service類。因為涉及到事務的控制,如果方法名被混淆了,在方法內改變數據的某些操作時,就會報錯。本項目中在sping.xml內配置了所有service方法中,只有以save,update,delete開頭的方法,才能改變數據庫,否則會報錯。參見如下:
- <!-- 配置事務的傳播特性 -->
- <tx:advice id="txAdvice" transaction-manager="transactionManager">
- <tx:attributes>
- <tx:method name="save*" propagation="REQUIRED" />
- <tx:method name="update*" propagation="REQUIRED" />
- <tx:method name="delete*" propagation="REQUIRED" />
- <tx:method name="*" read-only="true" />
- </tx:attributes>
- </tx:advice>
-
-
- <!-- 那些類的哪些方法參與事務 -->
- <aop:config>
- <aop:pointcut id="commonServiceMethod" expression="execution(* com.abc.domain.common.service.*.*(..))" />
- <aop:pointcut id="khServiceMethod" expression="execution(* com.abc.domain.*.*.inside.service.*.*(..))" />
-
- <aop:advisor pointcut-ref="commonServiceMethod" advice-ref="txAdvice" />
- <aop:advisor pointcut-ref="khServiceMethod" advice-ref="txAdvice" />
- </aop:config>