android源碼被混淆了還原方法為:
在樺川等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、成都網(wǎng)站制作 網(wǎng)站設(shè)計制作定制網(wǎng)站開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計,營銷型網(wǎng)站建設(shè),外貿(mào)網(wǎng)站制作,樺川網(wǎng)站建設(shè)費用合理。
1、得到 classes.dex文件;直接用機器上的解壓軟件 打開 .apk 文件,解壓出 classes.dex 文件。
2、還原.jar文件;這一步需要用到一個工具 dex2jar (谷歌的代碼庫里有)下載完了,解壓,然后把第一步的 產(chǎn)物(即那個classes.dex文件)放到 dex2jar的解壓目錄(解壓目錄里 有 dex2jar.bat 文件,檢查一下,沒有的話說明目錄不對)。
3、查看.jar文件;這一步就是傳統(tǒng)的 反編譯 了,需要工具輔助,這里用到的工具是jd-gui()下載系統(tǒng)對應(yīng)的版本,解壓,(xp系統(tǒng))會看到一個 .exe文件,沒錯就是 單文件綠色版,雙擊,選擇 第二步 生成的 .jar,即可。
Android代碼混淆,是為了你的apk被他人反編譯之后拿到源碼,如果你混淆了,那反編譯后的apk所有的java類都被改成了a.java/c.java之類的文件名,類里面的屬性也變成abc之類的了,想拿到你的源碼就不可能了,直接在gradle(app)文件的android節(jié)點下加上下邊代碼。
buildTypes?{
release?{
minifyEnabled?false
proguardFiles?getDefaultProguardFile('proguard-android.txt'),?'proguard-rules.pro'
}
}
2.3SDK的兩個新特點:
1.剛安裝上2.3時,查看sdk目錄,發(fā)現(xiàn)在\tools下新增了一文件夾“proguard”,如下圖,我就在想是不是Google終于官方對proguard考慮進去了。理論上,對java的混淆都是可以的,但關(guān)鍵在于如何編寫proguard的混淆腳本。
2.使用SDK2.3后,新建的工程下和之前相比,都會多了一個文件“proguard.cfg”。一打開,相當驚喜,這就是混淆所需的proguard腳本啊。
如下圖:
其代碼如下:
view plaincopy to clipboardprint?
-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 com.android.vending.licensing.ILicensingService
-keepclasseswithmembernames class * {
native ;
}
-keepclasseswithmembernames class * {
public (android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembernames class * {
public (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 *;
}
-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 com.android.vending.licensing.ILicensingService
-keepclasseswithmembernames class * {
native ;
}
-keepclasseswithmembernames class * {
public (android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembernames class * {
public (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 *;
}
從腳本中可以看到,混淆中保留了繼承自Activity、Service、Application、BroadcastReceiver、ContentProvider等基本組件。
并保留了所有的Native變量名及類名,所有類中部分以設(shè)定了固定參數(shù)格式的構(gòu)造函數(shù),枚舉等等。(詳細信息請參考\examples中的例子及注釋。)
好了,進行得差不多了,下面就來看看如何真正的生成混淆APK吧。這兒又得提醒一下,SDK新的特性在文檔里都是有的,所以文檔很重要。
查看SDK2.3的文檔,在路徑“/docs/guide/developing/tools/proguard.html”的“Enabling
ProGuard ”中是這樣描述的:
To enable ProGuard so that it runs as part of an Ant or Eclipse build, set
the proguard.config property in the /default.properties file. The path can be an
absolute path or a path relative to the project's root.
好的,那就這樣做吧。
在工程的"default.properties"中添加這樣一句話“proguard.config=proguard.cfg”,如下圖:
這樣就已經(jīng)設(shè)置好ADT的混淆操作了。接下來就是正常的打包和簽名了。。
下圖是我混淆SDK Demo中自帶的Notepad效果圖:
注意要點:
1.混淆以后的包會比混淆前的包小一點,一定要注意這點.
如果混淆不成功,請在第2步,將proguard.config=proguard.cfg修改為proguard.config=E:\Mobile_Develop\Google_Android\publicGoldenBeach_new\proguard.cfg這種類似的用絕對路徑,請注意絕對路徑中的文件夾名不能含有空格,如果有空格請?zhí)鎿Q為"_".
2.android在用proguard混淆時,一般情況下使用系統(tǒng)自帶的配置文件就可以保持大部分外部需要引用的類,比如Activity,view擴展等等,但是有些情況下一些引入的外部lib,如果被混淆也會出現(xiàn)各種各樣的問題,如果不想混淆這些包,就要加上
-keep class packagename.** {*;}
這樣就能完整保持原有class了
根據(jù) SDK 的版本不同有 2 中不同的代碼混淆方式,以上的 proguard.cfg 參數(shù)詳解中所涉及到的信息是在較低版本 SDK 下的混淆腳本,事實上在高版本的 SDK 下混淆的原理和參數(shù)也與低版本的相差無幾,只是在不同 SDK 版本的環(huán)境下引入混淆腳本的方式有所不同。具體方法如下:
低版本 SDK 下,項目中同時包含 proguard.cfg 和 project.properties 文件,則只需在 project.properties 文件末尾添加 proguard.config=proguard.cfg 再將項目 Export 即可。
高版本 SDK 下,項目中同時包含 proguard-project.txt 和 project.properties 文件,這時需要在 proguard-project.txt 文件中進行如下信息的配置,然后再將項目 Export 即可。下面以真實的文件進行演示說明。
復制代碼
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system edit
# "ant.properties", and override values to adapt the script to your
# project structure.
#
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
# Project target.
target=android-16
復制代碼
以上的配置信息即是 project.properties 文件中內(nèi)容,藍色文字為我們在代碼混淆過程中需要添加的配置信息,其中:sdk.dir 為你在當前機器上 SDK 的安裝路徑。如果想保留某個包下的文件不被混淆,可以在 proguard-project.txt 文件中加入保留對應(yīng)包名的語句即可。
復制代碼
# To enable ProGuard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in ${sdk.dir}/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the ProGuard
# include property in project.properties.
#
# For more details, see
#
# Add any project specific keep options here:
-dontwarn com.cnki.android.cnkireader.**
-keep class com.cnki.android.cnkireader.** { *; }
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
復制代碼