日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

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

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

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

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

如果需要對項目進行全局混碼,只需要進行一步操作:

將project.properties的中

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

如 果有一些代碼不能被混淆,比如需要加入了so文件,需要調(diào)用里面的方法,那么調(diào)用JNI訪問so文件的方法就不能被混碼。在導出的時候,可能不會報錯。但 是在手機上運行的時候,需要調(diào)用so文件的時候,就會報某某方法無法找到。這個時候就需要用到proguard-project.txt。

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

==================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' 【引用的庫的jar,用于解析injars所指定的jar類】

-optimizationpasses 5

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

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

-dontpreverify 【不預校驗】

-verbose

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

-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

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

public protected <methods>; ?【所有方法不進行混淆】

}

-keep public class com.asqw.android{

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

}

-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 class * extends android.app.Activity {【保護指定類的成員,如果此類受到保護他們會保護的更好 】

public void *(android.view.View);

}

-keepclassmembers enum * {

public static **[] values();

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

}

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

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

}

=====================================常見異常===================================

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

加入第三方jar包之后常出現(xiàn)的幾個異常:

proguard returned with error code 1.See console

情況1:

Proguard returned with error code 1. See console

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

后來發(fā)現(xiàn)是因為將整個工程放到了桌面上,而桌面的目錄是C:/Documents and Settings/Administrator/桌面,在這里面有空格,而proguard進行發(fā)編譯的時候是不允許有空格的

如果換了正確路徑還不好用的話,直接刪除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

?

我把項目中生成的proguard文件夾(此時文件夾是空的)刪掉,然后再重新運行項目,就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)

拋出這樣的異常的原因是第三方jar的引用路徑不對,沒有找到這個需要忽略混淆的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

  參見

ProGuard Manual ?

ProGuard ReTrace Manual ?

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

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

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

?

啟用混淆器Enabling ProGuard

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

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

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

proguard.config=proguard.cfg

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

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

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

? ? ?運行混淆器之后輸出的文件有:

dump.txt

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

mapping.txt

列出了源代碼與混淆后的類,方法和屬性名字之間的映射。這個文件對于在構建之后得到的bug報告是有用的,因為它把混淆的堆棧跟蹤信息反翻譯為源代碼中的類,方法和成員名字。更多信息,查看解碼混淆過的堆棧跟蹤信息。

seeds.txt

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

usage.txt

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

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

?

  • <project_root>/bin/proguard?當你使用Ant時

  • <project_root>/proguard?當你使用Eclipse時

  • ?

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

    ?

    ?

    混淆器配置(proguard config)

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

    ?

  • 一個僅引用于AndroidManifest.xml文件的類。

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

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

  • ?

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

    你可以在proguard.cfg文件中添加-keep這一行來修復這些錯誤。例如:

    -keep?publicclass<MyClass>

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

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

    當混淆代碼并輸出了一個堆棧調(diào)試信息時,這些方法名字是混淆過的,雖然可以進行調(diào)試,但是調(diào)試變得困難。幸運的是,每當混淆器運行時候,它都會輸出到文件<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/目錄下。運行retrace工具的命令語法是:

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

    例如:

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

    如果你沒有為<stracktrace_file>指定值,那么retrace工具從標準輸入讀取。

    ?

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

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

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

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

    ?

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

    總結

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

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