1. 程式人生 > >程式碼混淆與反射的衝突(小小解決方案)~!

程式碼混淆與反射的衝突(小小解決方案)~!

程式碼混淆與反射的衝突



編譯Android的程式碼,大部分人都知道了,防反編譯的方法也大部分都知道了(儘管它不一定一直有效,但起碼像我這種水平的人,沒辦法看到混淆之後的Java程式碼, 最可惡的是沒有註釋= =)。

最近才發現,我的程式碼在很久之後設定了混淆,也在很久之前不知道什麼時候不小心把程式碼混淆給弄沒了(好吧,你可以去反編譯我的專案了,我不介意,因為程式碼很爛,實在是爛)。

於是,這兩個又在搞混淆程式碼了,混淆程式碼的方法很簡單:
1.在專案下新建一個檔案,命名為“proguard.cfg”,正常情況下包括以下內容:

-optimizationpasses 5

-dontusemixedcaseclassnames

-dontskipnonpubliclibraryclasses

-dontpreverify

-verbose

-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-keep public class * extends android.app.Activity

-keep public class * extends android.app.Application

-keep public class * extends android.app.Service

-keep public class * extends android.content.BroadcastReceiver

-keep public class * extends android.content.ContentProvider

-keep public class * extends android.app.backup.BackupAgentHelper

-keep public class * extends android.preference.Preference

-keep public class com.android.vending.licensing.ILicensingService

-keepclasseswithmembernames class * {

    native <methods>;

}

-keepclasseswithmembers class * {

    public <init>(android.content.Context, android.util.AttributeSet);

}

-keepclasseswithmembers class * {

    public <init>(android.content.Context, android.util.AttributeSet, int);

}

-keepclassmembers enum * {

    public static **[] values();

    public static ** valueOf(java.lang.String);

}

-keep class * implements android.os.Parcelable {

  public static final android.os.Parcelable$Creator *;

}


2.後編輯專案下的“project.properties”檔案,在最後加上一句:proguard.config=proguard.cfg

OK,大功告成,記住了,只有打包的時候程式碼才會混淆,直接執行專案然後去bin目錄下找的那個apk包是不會混淆的。


麼簡單的事情,當然就不會特意來這分享了~
我想說說我遇到的問題,那就是,當代碼混淆遇上Java反射時,一堆麻煩來了。


==============別睡著了啊,真正的問題來了============

是的,我們會發現,Java的反射再也找不到它想找的類,或者方法,或者屬性了。
是的,因為程式碼混淆的原因,原本的類名、方法名、屬性名都改變了,而反射它還是按照原來的名字去反射,結果只能射出一個程式崩潰。

決的方法當然有~
那就是,讓和反射有關的那些程式碼或者類,不進行混淆,那就不會有上述的問題了~!

看看proguard.cfg檔案,裡面那麼多程式碼,不可能沒有用的,來,先隨便整一句看看:

-keep public class * extends android.app.Activity



簡單的,這句話的意思是,保留所有繼承Activity的類,不進行混淆。來,馬上舉一反三:
-keep public class com.mutou.test.HelloWorld

句更加簡單了,保留HelloWorld,不進行混淆。

注意了,所有的類必須指出完整的包路徑(廢話了,這個檔案裡又沒有import語句,當然要完整路徑了,不然它哪知道那個類在哪兒~)。

不進行混淆的意思就是,當我們的android專案的程式碼被反編譯工具反編譯出來之後,程式碼看起來不會像天書一樣,不會所有變數名、方法名都變成a、b、c、d什麼的。

注意了,有一個比較糾結的地方,一定要小心,通過上面兩種方式防止混淆的程式碼,並不代表,反編譯之後和原始碼一模一樣,它的類名什麼的都和原始碼一樣,但是變數名、方法名就不一定了,它也有可能是abcd什麼的。這個我也不知道為嘛。總之,小心就是了。

也正因為如此,在有反射的程式碼裡(吶,別問我什麼叫做反射啊,我只是要用的時候百度了一下,現在已經忘了具體用法了),不能通過以上兩種方式來防止程式碼混淆。



==============真正的主題在不華麗的分割線下面============
,沒有辦法了嗎?
有啊~木了個頭的,沒有辦法我就不來發帖了~~

嘻嘻,看看:
-keepclasseswithmembernames class com.kogame.god.thing.creature.**
{
*;
}

糕~這個有點複雜,彆著急~
先看看這個名字:keepclasseswithmembernames 顧名思義,就是保留類以及它的成員的名字。
那花括號裡面那個”*;”又是什麼東西呢?它代表類裡的所有成員(包括變數、方法)的名字都不會被混淆,都保留原汁原味的樣子。

於是,整段程式碼的意思就是,保留所有繼承creature類的程式碼以及它的變數和方法,不進行混淆。

好喇~~
謝謝觀賞。

如果沒有聽懂的,請移步(更簡單明瞭詳細而不復雜的文章):
http://www.apkbus.com/android-57338-1-1.html

相關推薦

程式碼混淆反射衝突(小小解決方案)~

程式碼混淆與反射的衝突 反編譯Android的程式碼,大部分人都知道了,防反編譯的方法也大部分都知道了(儘管它不一定一直有效,但起碼像我這種水平的人,沒辦法看到混淆之後的Java程式碼, 最可惡的是沒有註釋= =)。 最近才發現,我的程式碼在很久之後設定了混淆,也在很久之前不知道什麼時候不小心把程式碼混淆給

程式碼混淆反射衝突

因為之前寫的一個專案太亂,最近準備釋出一個新版本,所以把之前的程式碼重構了一遍,而重構後因為用到了反射,在混淆完成後打包出來發現一個很嚴重的bug,NoSuchMethodError,於是把包重新反編譯跟了一遍發現,是因為反射用到了類中的方法因為混淆把方法名給改了,但是在f

xercesImpl.jarcxf衝突解決方案

在使用cxf做webserive時,第一次沒有新增與資料庫操作時一切正常,當添加了commons-pool.jar包以後就報如下錯誤: java.lang.AbstractMethodError: org.apache.xerces.dom.DeferredDocumentI

dubbo 註解spring 事務註解衝突完美解決方案

這幾天碰到dubbo 註解與spring 事務註解同時啟用dubbo註解無法生效的問題. 在網上找了大部分程式設計師們貼出的解決方案都沒有解決問題。最終在自己的分析下成功解決問題。 解決步驟如下,後面會貼出詳細分析原因。我用的Dubbo版本為2.5.3;spring MVC版本為3.2.13

VS:“模組計算機型別“x64”目標計算機型別“X86”衝突解決方案

問題 遇到 “模組計算機型別x64”與目標計算機型別“X86”衝突的問題, 網上查了好多資料,都是配置“連結器-》高階-》目標計算機”和選擇X64平臺編譯器,可是怎麼試都不行, 最後發現是“命令列”裡依然是“X86”的問題,下面給出詳細的解決步驟: 1、“連結器-》高階-》目標計

拉取遠端程式碼時與原生代碼衝突解決方案之一

一、本解決方案基於IDEA開發工具講解 ①基於stash     首先,右擊專案--》git---》repository----》pull 拉取遠端專案,出現failed時,不要慌張不要悲傷,黎明的時光會到來,穩住心態,開啟滅 ‘’滅霸模式‘’。     接著我們繼續操

SpringMVC3 AnnotationMethodHandlerAdaptermvc:annotation-driven衝突解決方案

1、問題 在使用SpringMVC3時,需要對response到頁面的資料進行編碼設定則需要自定義註解資料格式化類來對頁面傳過來的字串進行格式化。 編碼設定: <bean class="org.springframework.web.servlet.mvc.anno

軟刪除唯一索引衝突解決方案

我們現在刪除資料庫表資料的時候大都會用軟刪除,或者用某個欄位標記為無效,但如果該表某個欄位需要有一個唯一索引,但是無效或軟刪除的記錄不應該在唯一索引範圍內。 說了一大堆,舉個例子,比如有一張user表 CREATE TABLE USER_TEST ( id BIGIN

手勢控制元件事件衝突解決方案

在日常的開發中我們可能會遇到手勢與UI控制元件事件出現衝突造成監聽事件混亂的情況,其實解決方案非常簡單。在這裡我用點選手勢與UICollectionView的item點選事件作為案例對此方法做一下簡單的介紹。比如有如下案例: 圖中下邊綠色的為UIColle

markdown語法文字內容衝突解決方案

在使用markdown書寫部落格時,有可能會出現文字中的字元是markdown語法,那麼markdown翻譯器就會誤將這些符號也翻譯成某種功能,就會出現顯示錯誤的情況。此時需要使用反斜槓('\')來將這些字元進行轉義。可以使用反斜槓('\')轉義的符號如下: \   反斜線

Ultimus BPM 房地產建築行業應用解決方案

Ultimus BPM 房地產與建築行業應用解決方案 行業應用需求 房地產與建築行業客戶業務特點是集團化管控,多區域、多項目、多業態管理,而行業業務往往項目周期長,涉及專業復雜,客戶越來越重視管理和跟蹤項目的全過程,增加項目管理的透

webpack漸入佳境系列一:webpack環境配置打包基礎【附帶各種 "坑" 解決方案持續更新中...】

utf 環境配置 lan 配置 要求 完全 需要 構建 樣式 首先介紹傳統模塊化開發的主流方案: 1.基與CMD的sea.js,玉伯提出的解決方案,據說原來京東團隊在使用。用時才定義,就近加載。最近在瀏覽seajs官方文檔時發現seajs的域名已經在轉賣,驚恐萬分之余又想

java 項目 存入mysql後 變問號 MySql 5.6 (X64) 解壓版 1067錯誤編碼問題的解決方案

都是 無法 small amd odi 方式 amp www 如何 環境 Java環境JDK1.8 安裝好了 mysql-5.6.38-winx64 idea2016(64) 問題是這樣: idea 調試 eclips 項目 存入數據庫後 變問號 首先e

Netty2:粘包/拆包問題使用LineBasedFrameDecoder的解決方案

substr string 技術分享 query coder 消息頭 handle decode sync 什麽是粘包、拆包 粘包、拆包是Socket編程中最常遇見的一個問題,本文來研究一下Netty是如何解決粘包、拆包的,首先我們從什麽是粘包、拆包開始說起: TCP是個

Java並發編程高並發解決方案 視頻教程

ren 發布 優勢 一致性 原子 red 代碼 sync 可見性 第1章 課程準備 1-1 課程導學 1-2 並發編程初體驗 1-3 並發與高並發基本概念第2章 並發基礎 2-1 CPU多級緩存-緩存一致性 2-2 CPU多級緩存-亂序執行優化 2

安全隔離視頻交換解決方案

原理 mark 監管 高性能服務器 type 系統 資源 處理 通過 市場分析 近年來,公安以及各大企業事業單位均建設了不同規模的視頻監控系統。為了最大化地利用這些視頻監控資源為公安或企業集團使用,來實現“資源共享、互聯互控”和“視頻監管一網控”,各個城市已經開始將各個分

Solution of issue: Android soft keyboard overlap with input div on browser【Android虛擬鍵盤輸入框重疊解決方案

Android soft keyboard overlap with input div on browser 【Android虛擬鍵盤與輸入框重疊】 給個英文標題,因為我知道絕大部分人搜資料都用英文搜。 問題: 在Android裝置瀏覽器上開啟自己的頁面,當點選頁面底部的輸入框時,虛擬

Jenkins代碼上線解決方案

servlet容器 perf png ant rtc 技術分享 acl tomcat com Jenkins是一個用Java編寫的開源的持續集成工具。在與Oracle發生爭執後,項目從Hudson項目獨立。 Jenkins提供了軟件開發的持續集成服務。它運行在Serv

公司簡介: Faceunity(杭州相芯科技有限公司)專注智慧圖形技術的創新應用,為移動網際網路、VR/AR等領域提供3D內容生成互動的行業解決方案,致力於好萊塢特效技術在消費級應用的普及。 Fac

歡迎使用Markdown編輯器 你好! 這是你第一次使用 Markdown編輯器 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章,瞭解一下Markdown的基本語法知識。 新的改變 我們對Markdown編輯器進行了一些功能拓展與語法支援,除了

flutter/dart 依賴衝突解決方案

有時候flutter更新sdk版本後不知道該不該更新 有時候pub庫更新後和自己的其他類庫發生了衝突 類似於圖上的情況 遇到這樣的問題應該怎麼解決呢 我們一步步解決 首先,這種依賴一般是pub中引用的,先檢視下原作者有沒有最新版,也許就解決了呢 無奈我們用到的類庫是