日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android 混淆文件project.properties和proguard-project.txt

發(fā)布時(shí)間:2025/7/14 Android 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 混淆文件project.properties和proguard-project.txt 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

參考文檔:http://blog.csdn.net/xueyepiaoling/article/details/8202359

? ? ? ? ? ? ? http://glblong.blog.51cto.com/3058613/1263969

在新版本的ADT創(chuàng)建項(xiàng)目時(shí),混碼的文件不再是proguard.cfg,而是project.properties和proguard-project.txt。

如果需要對(duì)項(xiàng)目進(jìn)行全局混碼,只需要進(jìn)行一步操作:

將project.properties的中

“# ?proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt”的“#”去掉就可以了。

如 果有一些代碼不能被混淆,比如需要加入了so文件,需要調(diào)用里面的方法,那么調(diào)用JNI訪問(wèn)so文件的方法就不能被混碼。在導(dǎo)出的時(shí)候,可能不會(huì)報(bào)錯(cuò)。但 是在手機(jī)上運(yùn)行的時(shí)候,需要調(diào)用so文件的時(shí)候,就會(huì)報(bào)某某方法無(wú)法找到。這個(gè)時(shí)候就需要用到proguard-project.txt。

在老版本中,創(chuàng)建項(xiàng)目的時(shí)候,會(huì)給出proguard.cfg,但是在的新版中創(chuàng)建項(xiàng)目則不會(huì)有任何提示。這個(gè)時(shí)候需要只要將proguard.cfg的內(nèi)容加入到proguard-project.txt中,再根據(jù)自己的需要進(jìn)行編輯即可。

==================proguard.cfg防反編譯方法==================================

To enable ProGuard so that it runs as part of an Ant or Eclipse build, set the?proguard.config?property in the<project_root>/project.properties?file. The path can be an absolute path or a path relative to the project's root.

If you left the?proguard.cfg?file in its default location (the project's root directory), you can specify its location like this:

proguard.config=proguard.cfg

You can also move the the file to anywhere you want, and specify the absolute path to it:

proguard.config=/path/to/proguard.cfg

When you build your application in release mode, either by running?ant release?or by using the?Export Wizardin Eclipse, the build system automatically checks to see if the?proguard.config?property is set. If it is, ProGuard automatically processes the application's bytecode before packaging everything into an?.apk?file. Building in debug mode does not invoke ProGuard, because it makes debugging more cumbersome.

=======================混淆文件proguard.cfg詳解======================================

-injars ?androidtest.jar【jar包所在地址】

-outjars ?out【輸出地址】

-libraryjars ? ?'D:\android-sdk-windows\platforms\android-9\android.jar' 【引用的庫(kù)的jar,用于解析injars所指定的jar類】

-optimizationpasses 5

-dontusemixedcaseclassnames 【混淆時(shí)不會(huì)產(chǎn)生形形色色的類名 】

-dontskipnonpubliclibraryclasses 【指定不去忽略非公共的庫(kù)類。 】

-dontpreverify 【不預(yù)校驗(yàn)】

-verbose

-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 【優(yōu)化】

-keep public class * extends android.app.Activity  【不進(jìn)行混淆保持原樣】

-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

-keep public abstract interface com.asqw.android.Listener{

public protected <methods>; ?【所有方法不進(jìn)行混淆】

}

-keep public class com.asqw.android{

public void Start(java.lang.String); 【對(duì)該方法不進(jìn)行混淆】

}

-keepclasseswithmembernames class * { 【保護(hù)指定的類和類的成員的名稱,如果所有指定的類成員出席(在壓縮步驟之后)】

native <methods>;

}

-keepclasseswithmembers class * { 【保護(hù)指定的類和類的成員,但條件是所有指定的類和類成員是要存在。】

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

}

-keepclasseswithmembers class * {

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

}

-keepclassmembers class * extends android.app.Activity {【保護(hù)指定類的成員,如果此類受到保護(hù)他們會(huì)保護(hù)的更好 】

public void *(android.view.View);

}

-keepclassmembers enum * {

public static **[] values();

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

}

-keep class * implements android.os.Parcelable {【保護(hù)指定的類文件和類的成員】

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

}

=====================================常見(jiàn)異常===================================

參考:http://blog.csdn.net/vrix/article/details/7100841

加入第三方j(luò)ar包之后常出現(xiàn)的幾個(gè)異常:

proguard returned with error code 1.See console

情況1:

Proguard returned with error code 1. See console

Error: C:/Documents (系統(tǒng)找不到指定文件)

后來(lái)發(fā)現(xiàn)是因?yàn)閷⒄麄€(gè)工程放到了桌面上,而桌面的目錄是C:/Documents and Settings/Administrator/桌面,在這里面有空格,而proguard進(jìn)行發(fā)編譯的時(shí)候是不允許有空格的

如果換了正確路徑還不好用的話,直接刪除proguard就好了

注意:SDK和程序路徑最好不要有空格符

情況2:

Proguard returned with error code 1. See console

異常:

java.lang.ArrayIndexOutOfBoundsException

解決辦法:將proguard.cfg中的"-dontpreverify"改成“-dontoptimize”

參考文章:http://groups.google.com/group/android-developers/browse_thread/thread/eca3b0f5ce6ad00f

?

我把項(xiàng)目中生成的proguard文件夾(此時(shí)文件夾是空的)刪掉,然后再重新運(yùn)行項(xiàng)目,就OK 了。

情況3:

[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0] Proguard returned with error code 1. See console

?

[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0] java.io.IOException: Can't read [proguard.ClassPathEntry@106082] (No such file or directory)

[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]

at proguard.InputReader.readInput(InputReader.java:230)

[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]

at proguard.InputReader.readInput(InputReader.java:200)

[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]

at proguard.InputReader.readInput(InputReader.java:178)

[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]

at proguard.InputReader.execute(InputReader.java:100)

[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]

at proguard.ProGuard.readInput(ProGuard.java:195)

[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]

at proguard.ProGuard.execute(ProGuard.java:78)

[2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0]

at proguard.ProGuard.main(ProGuard.java:499)

拋出這樣的異常的原因是第三方j(luò)ar的引用路徑不對(duì),沒(méi)有找到這個(gè)需要忽略混淆的jar包。

?

?

?

========================官方文檔翻譯=======================================

原文

http://developer.android.com/guide/developing/tools/proguard.html

?

混淆器(ProGuard)

  在本文中(In this document)

Enabling ProGuard

Configuring ProGuard

Decoding Obfuscated Stack Traces

Debugging considerations for published applications

  參見(jiàn)

ProGuard Manual ?

ProGuard ReTrace Manual ?

混淆器通過(guò)刪除從未用過(guò)的代碼和使用晦澀名字重命名類、字段和方法,對(duì)代碼進(jìn)行壓縮,優(yōu)化和混淆。結(jié)果是一個(gè)比較小的.apk文件,該文件比較難進(jìn)行逆向工程。因此,當(dāng)你的應(yīng)用程序?qū)Π踩舾?#xff08;要求高),例如當(dāng)你授權(quán)應(yīng)用程序的時(shí)候,混淆器是一種重要的保護(hù)手段。

混淆器被集成在android 構(gòu)建系統(tǒng)中,所以你不必手動(dòng)調(diào)用它。同時(shí)混淆器僅在發(fā)布模式下進(jìn)行構(gòu)建應(yīng)用程序的時(shí)候才會(huì)運(yùn)行起來(lái),所以在調(diào)試模式下構(gòu)建程序時(shí),你不必處理混淆代碼。讓混淆器運(yùn)行起來(lái)是可選擇的,但是推薦選上。

這個(gè)文檔描述了怎樣啟用并配置混淆器,以及使用跟蹤(retrace)工具對(duì)混淆的堆棧跟蹤信息(stack traces)進(jìn)行解碼。

?

啟用混淆器Enabling ProGuard

當(dāng)你新建了一個(gè)Android工程之后,一個(gè)proguard.cfg文件會(huì)在工程的根目錄下自動(dòng)創(chuàng)建。這個(gè)文件定義了混淆器是怎樣優(yōu)化和混淆你的代碼的,所以懂得怎樣根據(jù)你的需要來(lái)定制是非常重要的。缺省的配置文件僅覆蓋到了通常情況,所以根據(jù)你的需求,很可能需要編輯它。接下來(lái)的內(nèi)容是關(guān)于通過(guò)定制混淆器配置文件來(lái)對(duì)混淆器配置。

為了讓啟用混淆器作為Ant或者Eclipse構(gòu)建過(guò)程中一部分,可以在<project_root>/default.properties文件中,設(shè)置proguard.config屬性。路徑可以是絕對(duì)路徑或者工程根目錄的相對(duì)路徑。

如果你讓proguard.cfg文件在缺省位置(工程的根目錄),你可以像這樣指定位置:

proguard.config=proguard.cfg

? ? 同樣,你可以把該文件放到任意的位置,并指定它的絕對(duì)路徑。

proguard.config=/path/to/proguard.cfg

當(dāng)你在發(fā)布模式下,或者通過(guò)運(yùn)行ant release,或者通過(guò)使用Eclipse中的Export Wizard構(gòu)建你的應(yīng)用程序的時(shí)候,構(gòu)建系統(tǒng)都會(huì)自動(dòng)地去檢查proguard.config屬性是否被設(shè)置了。如果被設(shè)置了,混淆器在把所有東西打包成.apk文件之前,自動(dòng)地對(duì)應(yīng)用程序字節(jié)碼進(jìn)行混淆處理。而在調(diào)試模式中構(gòu)建則不會(huì)調(diào)用混淆器,因?yàn)槟菢诱{(diào)試會(huì)更加繁重。

? ? ?運(yùn)行混淆器之后輸出的文件有:

dump.txt

? ? ? ? ? ? ? ? ? 描述.apk包中所有class文件的內(nèi)部結(jié)構(gòu)。

mapping.txt

列出了源代碼與混淆后的類,方法和屬性名字之間的映射。這個(gè)文件對(duì)于在構(gòu)建之后得到的bug報(bào)告是有用的,因?yàn)樗鸦煜亩褩8櫺畔⒎捶g為源代碼中的類,方法和成員名字。更多信息,查看解碼混淆過(guò)的堆棧跟蹤信息。

seeds.txt

? ? ? ? ? ? ? ? ? 列出那些未混淆的類和成員。

usage.txt

? ? ? ? ? ? ? ? ? 列出從.apk中剝離的代碼。

這些文件放在以下目錄中:

?

  • <project_root>/bin/proguard?當(dāng)你使用Ant時(shí)

  • <project_root>/proguard?當(dāng)你使用Eclipse時(shí)

  • ?

    注意:每次在發(fā)布模式下構(gòu)建時(shí),這些文件都會(huì)被最新的文件覆蓋。所以每次發(fā)布程序時(shí)候,為了反混淆來(lái)自構(gòu)建時(shí)產(chǎn)生的bug報(bào)告,請(qǐng)保存這些文件的一個(gè)拷貝。對(duì)于為什么要保存這些文件的重要性的更多信息,請(qǐng)查看程序發(fā)布調(diào)試注意事項(xiàng)。

    ?

    ?

    混淆器配置(proguard config)

    某些情況下,proguard.cfg文件的缺省配置可以滿足需求了。但是,對(duì)于混淆器來(lái)說(shuō),大多數(shù)情況做出正確的分析是困難的,并且它或許會(huì)刪除在它看來(lái)是無(wú)用的,但對(duì)于程序來(lái)說(shuō)卻確實(shí)需要的代碼。一些例子如下:

    ?

  • 一個(gè)僅引用于AndroidManifest.xml文件的類。

  • 一個(gè)通過(guò)JNI調(diào)用的方法。

  • 動(dòng)態(tài)引用的屬性和方法。

  • ?

    缺省的proguard.cfg文件試圖覆蓋普通的情況,但是你可能碰到類似ClassNotFoundException的異常,這個(gè)異常出現(xiàn)在當(dāng)你的程序去訪問(wèn)一個(gè)被混淆器移除了的類的時(shí)候。

    你可以在proguard.cfg文件中添加-keep這一行來(lái)修復(fù)這些錯(cuò)誤。例如:

    -keep?publicclass<MyClass>

    -Keep設(shè)置有很多可選項(xiàng)和注意地方,所以為了獲得更多關(guān)于配置信息,強(qiáng)烈推薦你閱讀混淆器用戶手冊(cè)。特別有用的有Keep選項(xiàng)綜述和舉例部分。在混淆器手冊(cè)問(wèn)題解決方案部分,介紹了代碼在混淆過(guò)程中你可能碰到的其他常見(jiàn)問(wèn)題。

    解碼混淆過(guò)的堆棧跟蹤信息(Decoding Obfuscated Stack Traces)

    當(dāng)混淆代碼并輸出了一個(gè)堆棧調(diào)試信息時(shí),這些方法名字是混淆過(guò)的,雖然可以進(jìn)行調(diào)試,但是調(diào)試變得困難。幸運(yùn)的是,每當(dāng)混淆器運(yùn)行時(shí)候,它都會(huì)輸出到文件<project_root>/bin/proguard/mapping.txt中,該文件包含了從原始類,方法和屬性名字到混淆后名字的映射。

    Windows系統(tǒng)中retrace.bat腳本命令或者Linux和Mac OS X系統(tǒng)中retrace.sh腳本命令能把混淆后的堆棧調(diào)試信息轉(zhuǎn)換為可以理解的文件。它被放在<sdk_root>/tools/proguard/目錄下。運(yùn)行retrace工具的命令語(yǔ)法是:

    retrace.bat|retrace.sh?[-verbose]?mapping.txt?[<stacktrace_file>]

    例如:

    retrace.bat?-verbose mapping.txt obfuscated_trace.txt

    如果你沒(méi)有為<stracktrace_file>指定值,那么retrace工具從標(biāo)準(zhǔn)輸入讀取。

    ?

    已發(fā)布應(yīng)用程序的調(diào)試注意事項(xiàng)(Debugging considerations for published applications)

    保存好每一個(gè)已發(fā)布給用戶的程序的mapping.txt文件。通過(guò)保存發(fā)布構(gòu)建版本的mapping.txt文件拷貝,確保當(dāng)用戶碰到bug,并把混淆后的堆棧調(diào)試跟蹤信息提交給你時(shí),你可以進(jìn)行調(diào)試從而修復(fù)問(wèn)題。程序的mapping.txt文件在每次發(fā)布構(gòu)建時(shí)都會(huì)被覆蓋,所以你一定要注意保存正確的版本。

    例如,假設(shè)你已經(jīng)發(fā)布了一個(gè)應(yīng)用程序并在繼續(xù)在新的版本中開(kāi)發(fā)添加新的功能。接著你馬上啟動(dòng)混淆器并創(chuàng)建一個(gè)新的發(fā)布版本。該操作把mapping.txt文件覆蓋了。一個(gè)用戶提交了來(lái)自當(dāng)前發(fā)布版本的bug報(bào)告,該報(bào)告包含了堆棧調(diào)試信息。你再也不能對(duì)用戶的堆棧信息進(jìn)行調(diào)試了,因?yàn)檫@個(gè)對(duì)應(yīng)用戶本機(jī)上版本的mapping.txt文件不存在了。其他覆蓋mapping.txt文件的情況還有很多,所以對(duì)于每一個(gè)可能需要調(diào)試的版本,你都要確保有一份拷貝。

    如何保存mapping.txt文件由你決定。例如,你可以根據(jù)版本和構(gòu)建號(hào)來(lái)重命名它們,或者連同你的源代碼進(jìn)行版本控制。

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/spring87/p/4337670.html

    總結(jié)

    以上是生活随笔為你收集整理的Android 混淆文件project.properties和proguard-project.txt的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。