導航:首頁 > 操作系統 > androidbackupagent

androidbackupagent

發布時間:2024-04-15 07:25:35

android項目中加入zxing,混淆打包出錯,求解決

寫在視圖xml中的onClick響應出錯. 因為寫在xml中的onClick是通過反射調用的, proguard認為它們沒有在代碼中被調用過, 所以將它們從代碼中除掉或改名了. 解決方法:
在proguard.cfg中添加以下代碼, 就可以防止被配在視圖xml中的onClick方法被proguard優化掉
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}123123

jni反調java方法
這些類或方法同樣可能會被proguard認為沒有調用過而被除掉, 或都被改名. 這些方法最好統一寫在一個類中, 然後這個類不作優化, 或是找出所有jni調用過的類與方法, 在proguard.cfg中配置, 不對它們作優化
其它反射調用的java類與方法
使用反射時一定要注意proguard可能會認為那些方法未被調用過, 會在代碼優化過程中將它們改名或除去. 在使用反射的地方一定要在proguard.cfg中配置, 不優化反射調用過的類和方法
最後在proguard優化過後會產生一些文件
mp.txt – 描述.apk文件中所有類文件間的內部結構
mapping.txt – 列出了原始的類,方法和欄位名與混淆後代碼間的映射。這個文件很重要,當你從release版本中收到一個bug報告時,可以用它來翻譯被混淆的代碼。
seeds.txt – 列出了未被混淆的類和成員
usage.txt – 列出了從.apk中刪除的代碼
要注意分析mapping.txt與usage.txt看xml視圖中寫的onClick響應函數, jni調用到的java類與方法, 反射調用過的類與方法是否被混淆或重命名
-keep class com.badlogic.gdx.backends.Android.**{ *;}
的只是不混淆:這個包下的類(不包括子包里的東西),用到一個第三文的類就要把這個類所在的包,像上面加上
還要注意的是android-support-v4.jar這個包問題,這里加上了對這個jar包的處理
第三方jar的混淆,
-optimizationpasses 5
-dontusemixedcaseclassnames
-
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-keep public class * extends android.app.Activity // 繼承activity,application,service,broadcastReceiver,contentprovider....不進行混淆
-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.
-libraryjars /libs/android-support-v4.jar
-libraryjars /libs/gdx-backend-android.jar
-libraryjars /libs/gdx.jar123123
// 這里不對第三方的jar包的提出WARN
-dontwarn com.badlogic.**
-dontwarn android.support`這里寫代碼片`.v4.**
-dontwarn android.support.v4.view.**12341234
// 這里對第三方jar包的類不進行混淆
-keep class com.badlogic.gdx.backends.android.**{ *;}
-keep class com.badlogic.gdx.**{ *;}
-keep class com.badlogic.gdx.graphics.g2d.**{ *;}
-keep class com.badlogic.gdx.graphics.**{ *;}
-keep class android.support.v4.view.**{ *;}123456123456
// 這里第三方JAR包處理結束
-keepclasseswithmembernames class * { // natvie 方法不混淆
native ;
} 12341234
-keepclasseswithmembers class * {
// 對於所有類,有這個構造函數不進行混淆,主要是為了在layout中的,自定義的view
public (android.content.Context, android.util.AttributeSet);
} 12341234
-keepclasseswithmembers class * {
public (android.content.Context, android.util.AttributeSet, int);
} 123123
-keepclassmembers class * extends android.app.Activity {
// 這個主要是在layout 中寫的onclick方法android:onclick="onClick",不進行混淆
public void *(android.view.View);
} 12341234
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
} 12341234
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}

㈡ Android是如何使用AndroidManifest.xml的

一、關於AndroidManifest.xml

AndroidManifest.xml 是每個android程序中必須的文件。它位於整個項目的根目錄,描述了package中暴露的組件(activities, services, 等等),他們各自的實現類,各種能被處理的數據和啟動位置。 除了能聲明程序中的Activities, ContentProviders, Services, 和Intent Receivers,還能指定permissions和instrumentation(安全控制和測試)

二、AndroidManifest.xml結構

<?xmlversion="1.0"encoding="utf-8"?>
<manifest>
<application>
<activity>
<intent-filter>
<action/>
<category/>
</intent-filter>
</activity>
<activity-alias>
<intent-filter></intent-filter>
<meta-data/>
</activity-alias>
<service>
<intent-filter></intent-filter>
<meta-data/>
</service>
<receiver>
<intent-filter></intent-filter>
<meta-data/>
</receiver>
<provider>
<grant-uri-permission/>
<meta-data/>
</provider>
<uses-library/>
</application>
<uses-permission/>
<permission/>
<permission-tree/>
<permission-group/>
<instrumentation/>
<uses-sdk/>
<uses-configuration/>
<uses-feature/>
<supports-screens/>
</manifest>

三、各個節點的詳細介紹

上面就是整個am(androidManifest).xml的結構,下面以外向內開始闡述~~

1、第一層(<Manifest>):(屬性)

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.woody.test"
android:sharedUserId="string"
android:sharedUserLabel="string resource"
android:versionCode="integer"
android:versionName="string"
android:installLocation=["auto" | "internalOnly" | "preferExternal"] >
</manifest>

A、xmlns:android

定義android命名空間,一般為http://schemas.android.com/apk/res/android,這樣使得Android中各種標准屬性能在文件中使用,提供了大部分元素中的數據。


B、package

指定本應用內java主程序包的包名,它也是一個應用進程的默認名稱


C、sharedUserId

表明數據許可權,因為默認情況下,Android給每個APK分配一個唯一的UserID,所以是默認禁止不同APK訪問共享數據的。若要共享數據,第一可以採用Share Preference方法,第二種就可以採用sharedUserId了,將不同APK的sharedUserId都設為一樣,則這些APK之間就可以互相共享數據了。詳見:http://wallage.blog.163.com/blog/static/17389624201011010539408/

D、sharedUserLabel

一個共享的用戶名,它只有在設置了sharedUserId屬性的前提下才會有意義


E、versionCode

是給設備程序識別版本(升級)用的必須是一個interger值代表app更新過多少次,比如第一版一般為1,之後若要更新版本就設置為2,3等等。。。


F、versionName

這個名稱是給用戶看的,你可以將你的APP版本號設置為1.1版,後續更新版本設置為1.2、2.0版本等等。。。


G、installLocation

安裝參數,是Android2.2中的一個新特性,installLocation有三個值可以選擇:internalOnly、auto、preferExternal

選擇preferExternal,系統會優先考慮將APK安裝到SD卡上(當然最終用戶可以選擇為內部ROM存儲上,如果SD存儲已滿,也會安裝到內部存儲上)

選擇auto,系統將會根據存儲空間自己去適應

選擇internalOnly是指必須安裝到內部才能運行

(註:需要進行後台類監控的APP最好安裝在內部,而一些較大的游戲APP最好安裝在SD卡上。現默認為安裝在內部,如果把APP安裝在SD卡上,首先得設置你的level為8,並且要配置android:installLocation這個參數的屬性為preferExternal)


2、第二層(<Application>):屬性

一個AndroidManifest.xml中必須含有一個Application標簽,這個標簽聲明了每一個應用程序的組件及其屬性(如icon,label,permission等)

<application android:allowClearUserData=["true" | "false"]
android:allowTaskReparenting=["true" | "false"]
android:backupAgent="string"
android:debuggable=["true" | "false"]
android:description="string resource"
android:enabled=["true" | "false"]
android:hasCode=["true" | "false"]
android:icon="drawable resource"
android:killAfterRestore=["true" | "false"]
android:label="string resource"
android:manageSpaceActivity="string"
android:name="string"
android:permission="string"
android:persistent=["true" | "false"]
android:process="string"
android:restoreAnyVersion=["true" | "false"]
android:taskAffinity="string"
android:theme="resource or theme" >
</application>

A、android:allowClearUserData('true' or 'false')

用戶是否能選擇自行清除數據,默認為true,程序管理器包含一個選擇允許用戶清除數據。當為true時,用戶可自己清理用戶數據,反之亦然


B、android:allowTaskReparenting('true' or 'false')

是否允許activity更換從屬的任務,比如從簡訊息任務切換到瀏覽器任務


C、android:backupAgent

這也是Android2.2中的一個新特性,設置該APP的備份,屬性值應該是一個完整的類名,如com.project.TestCase,此屬性並沒有默認值,並且類名必須得指定(就是個備份工具,將數據備份到雲端的操作)


D、android:debuggable

這個從字面上就可以看出是什麼作用的,當設置為true時,表明該APP在手機上可以被調試。默認為false,在false的情況下調試該APP,就會報以下錯誤:

Device XXX requires that applications explicitely declare themselves as debuggable in their manifest.

Application XXX does not have the attribute 'debuggable' set to TRUE in its manifest and cannot be debugged.


E、android:description/android:label

此兩個屬性都是為許可提供的,均為字元串資源,當用戶去看許可列表(android:label)或者某個許可的詳細信息(android:description)時,這些字元串資源就可以顯示給用戶。label應當盡量簡短,之需要告知用戶該許可是在保護什麼功能就行。而description可以用於具體描述獲取該許可的程序可以做哪些事情,實際上讓用戶可以知道如果他們同意程序獲取該許可權的話,該程序可以做什麼。我們通常用兩句話來描述許可,第一句描述該許可,第二句警告用戶如果批准該許可權會可能有什麼不好的事情發生


F、android:enabled

Android系統是否能夠實例化該應用程序的組件,如果為true,每個組件的enabled屬性決定那個組件是否可以被 enabled。如果為false,它覆蓋組件指定的值;所有組件都是disabled。


G、android:hasCode('true' or 'false')

表示此APP是否包含任何的代碼,默認為true,若為false,則系統在運行組件時,不會去嘗試載入任何的APP代碼

一個應用程序自身不會含有任何的代碼,除非內置組件類,比如Activity類,此類使用了AliasActivity類,當然這是個罕見的現象

(在Android2.3可以用標准C來開發應用程序,可在androidManifest.xml中將此屬性設置為false,因為這個APP本身已經不含有任何的JAVA代碼了)

H、android:icon

這個很簡單,就是聲明整個APP的圖標,圖片一般都放在drawable文件夾

I、android:killAfterRestore

J、android:manageSpaceActivity

K、android:name

為應用程序所實現的Application子類的全名。當應用程序進程開始時,該類在所有應用程序組件之前被實例化。

若該類(比方androidMain類)是在聲明的package下,則可以直接聲明android:name="androidMain",但此類是在package下面的子包的話,就必須聲明為全路徑或android:name="package名稱.子包名成.androidMain"

L、android:permission

設置許可名,這個屬性若在<application>上定義的話,是一個給應用程序的所有組件設置許可的便捷方式,當然它是被各組件設置的許可名所覆蓋的

M、android:presistent

該應用程序是否應該在任何時候都保持運行狀態,默認為false。因為應用程序通常不應該設置本標識,持續模式僅僅應該設置給某些系統應用程序才是有意義的。

N、android:process

應用程序運行的進程名,它的默認值為<manifest>元素里設置的包名,當然每個組件都可以通過設置該屬性來覆蓋默認值。如果你想兩個應用程序共用一個進程的話,你可以設置他們的android:process相同,但前提條件是他們共享一個用戶ID及被賦予了相同證書的時候

O、android:restoreAnyVersion

同樣也是android2.2的一個新特性,用來表明應用是否准備嘗試恢復所有的備份,甚至該備份是比當前設備上更要新的版本,默認是false

P、android:taskAffinity

擁有相同的affinity的Activity理論上屬於相同的Task,應用程序默認的affinity的名字是<manifest>元素中設定的package名


Q、android:theme

是一個資源的風格,它定義了一個默認的主題風格給所有的activity,當然也可以在自己的theme裡面去設置它,有點類似style。



不過現在在android stuido 上面 版本控制已經使用Gradle了。

㈢ Android濡備綍浠g爜娣鋒穯錛岄槻姝apk紼嬪簭琚鍙嶇紪璇

涓嬮潰鍏蜂綋璇翠竴璇存庝箞鏍瘋㏒DK2.3涓嬬殑proguard.cfg鏂囦歡璧蜂綔鐢錛屽厛鏉ョ湅鐪媋ndroid-sdk-windows\tools\lib\proguard.cfg鐨勫唴瀹癸細view plain 1. -optimizationpasses 5 2. -dontusemixedcaseclassnames 3. - 4. -dontpreverify 5. -verbose 6. -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 7. 8. -keep public class * extends android.app.Activity 9. -keep public class * extends android.app.Application 10. -keep public class * extends android.app.Service 11. -keep public class * extends android.content.BroadcastReceiver 12. -keep public class * extends android.content.ContentProvider 13. -keep public class * extends android.app.backup.BackupAgentHelper 14. -keep public class * extends android.preference.Preference 15. -keep public class com.android.vending.licensing.ILicensingService 16. 17. -keepclasseswithmembernames class * { 18. native <methods>; 19. } 20. 21. -keepclasseswithmembernames class * { 22. public <init>(android.content.Context, android.util.AttributeSet); 23. } 24. 25. -keepclasseswithmembernames class * { 26. public <init>(android.content.Context, android.util.AttributeSet, int); 27. } 28. 29. -keepclassmembers enum * { 30. public static **[] values(); 31. public static ** valueOf(java.lang.String); 32. } 33. 34. -keep class * implements android.os.Parcelable { 35. public static final android.os.Parcelable$Creator *; 36. } 浠庤剼鏈涓鍙浠ョ湅鍒幫紝娣鋒穯涓淇濈暀浜嗙戶鎵胯嚜Activity銆丼ervice銆丄pplication銆丅roadcastReceiver銆丆ontentProvider絳夊熀鏈緇勪歡浠ュ強com.android.vending.licensing.ILicensingService錛 騫朵繚鐣欎簡鎵鏈夌殑Native鍙橀噺鍚嶅強綾誨悕錛屾墍鏈夌被涓閮ㄥ垎浠ヨ懼畾浜嗗滻瀹氬弬鏁版牸寮忕殑鏋勯犲嚱鏁幫紝鏋氫婦絳夌瓑銆) 璁﹑roguard.cfg璧蜂綔鐢ㄧ殑鍋氭硶寰堢畝鍗曪紝灝辨槸鍦╡clipse鑷鍔ㄧ敓鎴愮殑default.properties鏂囦歡涓鍔犱笂涓鍙モ減roguard.config=proguard.cfg鈥濆氨鍙浠ヤ簡 瀹屾暣鐨刣efault.properties鏂囦歡搴旇ュ備笅錛歷iew plain 1. # This file is automatically generated by Android Tools. 2. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! 3. # 4. # This file must be checked in Version Control Systems. 5. # 6. # To customize properties used by the Ant build system use, 7. # "build.properties", and override values to adapt the script to your 8. # project structure. 9. 10. # Project target. 11. target=android-9 12. proguardproguard.config=proguard.cfg 澶у姛鍛婃垚錛屾e父鐨勭紪璇戠懼悕鍚庡氨鍙浠ラ槻姝浠g爜琚鍙嶇紪璇戜簡銆

㈣ android 加入library如何混淆

android工程會看到項目有

project.properties這個文件就是用來開啟項目是否混淆

proguard-project.txt 這個文件就是記錄了代碼混淆的屬性

要開啟混淆,只需要將project.properties 文件中的

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


關於proguard-project.tx混淆的屬性:

通常情況下,我們只需要作以上幾步操作就能滿足需求,如果有一些特殊要求,某些類或者jar包不需要混淆,這個時候就需要修改proguard-project.txt文件了。以下是網上搜索的網友分享的經驗:

1.在proguard-project.txt文件中添加不需要混淆的類和第三方的jar包

這個是保持自己包中不需要混淆的類,如果有些類調用了jni也不需要混淆,不然會出錯。還有如果項目中有其他項目作為library引入,那這些項目的一些類也不能混淆。



2.另外還有其他一些經驗:

-optimizationpasses 5壓縮等級
-dontusemixedcaseclassnames 【混淆時不會產生形形色色的類名 】
- 【指定不去忽略非公共的庫類。 】
-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

-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 *;
}

㈤ android集成分享sdk後怎麼代碼混淆

為了保護代碼被反編譯,android引入了混淆代碼的概念
1.設置混淆
在工程下找到project.properties文件
在文件中加入proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt這個是系統的
也可以用自己的混淆文件(這樣就可以配置一些自己的東西),去sdk.dir}/tools/proguard/ 下復制proguard-android.txt文件到本地工程中
然後設置成proguard.config=proguard-android.txt
project.properties文件:
[java] view plain

#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
proguard.config=proguard-android.txt

# Project target.
target=android-17

-injars androidtest.jar【jar包所在地址】
-outjars out【輸出地址】
-libraryjars 'D:\android-sdk-windows\platforms\android-9\android.jar' 【引用的庫的jar,用於解析injars所指定的jar類】
-optimizationpasses 5
-dontusemixedcaseclassnames 【混淆時不會產生形形色色的類名 】
- 【指定不去忽略非公共的庫類。 】
-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
-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包之後常出現的幾個異常:
proguard returned with error code 1.See console
情況1:
Proguard returned with error code 1. See console
Error: C:/Documents (系統找不到指定文件)
後來發現是因為將整個工程放到了桌面上,而桌面的目錄是C:/Documents and Settings/Administrator/桌面,在這裡面有空格,而proguard進行發編譯的時候是不允許有空格的
如果換了正確路徑還不好用的話,直接刪除proguard就好了
注意:SDK和程序路徑最好不要有空格符
情況2:
Proguard returned with error code 1. See console
異常:
java.lang.
解決辦法:將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 ?
混淆器通過刪除從未用過的代碼和使用晦澀名字重命名類、欄位和方法,對代碼進行壓縮,優化和混淆。結果是一個比較小的.apk文件,該文件比較難進行逆向工程。因此,當你的應用程序對安全敏感(要求高),例如當你授權應用程序的時候,混淆器是一種重要的保護手段。
混淆器被集成在android 構建系統中,所以你不必手動調用它。同時混淆器僅在發布模式下進行構建應用程序的時候才會運行起來,所以在調試模式下構建程序時,你不必處理混淆代碼。讓混淆器運行起來是可選擇的,但是推薦選上。
這個文檔描述了怎樣啟用並配置混淆器,以及使用跟蹤(retrace)工具對混淆的堆棧跟蹤信息(stack traces)進行解碼。

啟用混淆器Enabling ProGuard
當你新建了一個Android工程之後,一個proguard.cfg文件會在工程的根目錄下自動創建。這個文件定義了混淆器是怎樣優化和混淆你的代碼的,所以懂得怎樣根據你的需要來定製是非常重要的。預設的配置文件僅覆蓋到了通常情況,所以根據你的需求,很可能需要編輯它。接下來的內容是關於通過定製混淆器配置文件來對混淆器配置。
為了讓啟用混淆器作為Ant或者Eclipse構建過程中一部分,可以在<project_root>/default.properties文件中,設置proguard.config屬性。路徑可以是絕對路徑或者工程根目錄的相對路徑。
如果你讓proguard.cfg文件在預設位置(工程的根目錄),你可以像這樣指定位置:
proguard.config=proguard.cfg

同樣,你可以把該文件放到任意的位置,並指定它的絕對路徑。
proguard.config=/path/to/proguard.cfg

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

運行混淆器之後輸出的文件有:
mp.txt
描述.apk包中所有class文件的內部結構。
mapping.txt

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

seeds.txt
列出那些未混淆的類和成員。
usage.txt
列出從.apk中剝離的代碼。
這些文件放在以下目錄中:

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

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

一個僅引用於AndroidManifest.xml文件的類。
一個通過JNI調用的方法。
動態引用的屬性和方法。
<project_root>/bin/proguard 當你使用Ant時
<project_root>/proguard 當你使用Eclipse時

解碼混淆過的堆棧跟蹤信息(Decoding Obfuscated Stack Traces)
當混淆代碼並輸出了一個堆棧調試信息時,這些方法名字是混淆過的,雖然可以進行調試,但是調試變得困難。幸運的是,每當混淆器運行時候,它都會輸出到文件<project_root>/bin/proguard/mapping.txt中,該文件包含了從原始類,方法和屬性名字到混淆後名字的映射。
Windows系統中retrace.bat腳本命令或者Linux和Mac OS X系統中retrace.sh腳本命令能把混淆後的堆棧調試信息轉換為可以理解的文件。它被放在<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工具從標准輸入讀取。

已發布應用程序的調試注意事項(Debugging considerations for published applications)
保存好每一個已發布給用戶的程序的mapping.txt文件。通過保存發布構建版本的mapping.txt文件拷貝,確保當用戶碰到bug,並把混淆後的堆棧調試跟蹤信息提交給你時,你可以進行調試從而修復問題。程序的mapping.txt文件在每次發布構建時都會被覆蓋,所以你一定要注意保存正確的版本。
例如,假設你已經發布了一個應用程序並在繼續在新的版本中開發添加新的功能。接著你馬上啟動混淆器並創建一個新的發布版本。該操作把mapping.txt文件覆蓋了。一個用戶提交了來自當前發布版本的bug報告,該報告包含了堆棧調試信息。你再也不能對用戶的堆棧信息進行調試了,因為這個對應用戶本機上版本的mapping.txt文件不存在了。其他覆蓋mapping.txt文件的情況還有很多,所以對於每一個可能需要調試的版本,你都要確保有一份拷貝。

㈥ android開發要哪些jar

am.jar:終端下執行am命令時所需的java庫。源碼目錄:framework/base/cmds/am
android.policy.jar:鎖屏界面需要用到的jar包,該包引用了android.test.runner.jar,源碼目錄:framework/base/policy
android.test.runner.jar:測試應用所需的jar包,該包引用了core.jar,core-junit.ajr以及framework.jar,源碼目錄:framework/base/test-runner
bmgr.jar:adb shell命令下對Android Device所有package備份和恢復的操作時所需的java庫。 不過這個android服務默認是Disabled,而且要backup的應用必須實現BackupAgent,在AndroidManifest.xml的application標簽中加入android:backupAgent屬性。源碼目錄:framework/base/cmds/bmgr
bouncycastle.jar: java三方的密匙庫,網上資料說用來apk簽名、https鏈接之類,官網 :http://www.bouncycastle.org/java.html
com.android.future.usb.accessory.jar:用於管理USB的上層java庫,在系統編譯時hardware層會調用到。源碼目錄:frameworks/base/libs/usb
com.android.location.provider.jar:
com.android.nfc_extras.jar:NFC外部庫。android/nfc/NfcAdapter.java會調用到包中的NfcAdapterExtras.java。源碼目錄:frameworks/base/nfc-extras
core-junit.jar :junit核心庫,在運行*Test.apk時被調用。
core-junitrunner.jar:未知,公司話機上有。
core-tests*.jar:framework下的一系列測試jar包,不做測試時可刪除。
core.jar:核心庫,啟動桌面時首先載入這個。源碼目錄:
ext.jar:android外部三方擴展包,源碼主要是external/nist-sip(java下的sip三方庫)、external/apache-http(apache的java三方庫)、external/tagsoup(符合SAX標準的HTML解析器)。其實這個jar包可以添加外部擴展jar包,只需在framework/base/Android.mk中的ext-dir添加src目錄即可。
framework-res.apk:android系統資源庫。
framework.jar:android的sdk中核心代碼。
ime.jar:ime命令所需jar包,用於查看當前話機輸入法列表、設置輸入法。源碼目錄:framework/base/cmds/ime
input.jar:input命令所需的jar包,用於模擬按鍵輸入。源碼目錄:framework/baes/cmds/input
javax.obex.jar:java藍牙API,用於對象交換協議。源碼目錄:framework/base/obex
monkey.jar:執行monkey命令所需jar包。源碼目錄:framework/base/cmds/monkey
pm.jar:執行pm命令所需的jar包,pm詳情見adb shell pm,源碼目錄:framework/base/cmds/pm
services.jar:話機框架層服務端的編譯後jar包,配合libandroid_servers.so在話機啟動時通過SystemServer以循環閉合管理的方式將各個service添加到ServiceManager中。源碼目錄:framework/base/service
sqlite-jdbc.jar: sqlite的Java DataBase Connextivity jar包。
svc.jar:svc命令所需jar包,可硬用來管理wifi,power和data。源碼目錄:framework/base/cmds/svc

㈦ 如何混淆android工程打成的jar包

混淆android工程打成的jar包方式如下:

從SDK2.3開始、在android-sdk-windows ools下面多了一個proguard文件夾讓proguard.cfg起作用的做法很簡單,就是在eclipse自動生成的default.properties文件中加上一句「proguard.config=proguard.cfg」就可以,如下圖:

閱讀全文

與androidbackupagent相關的資料

熱點內容
2021世界程序員節 瀏覽:480
php翼支付 瀏覽:880
盈通伺服器ip地址 瀏覽:787
3des演算法的c語言實現 瀏覽:871
網上怎樣購買伺服器地址 瀏覽:813
新氧app都在哪個城市 瀏覽:731
十二大加密貨幣圖片 瀏覽:315
資料庫日誌自動壓縮 瀏覽:929
手機表格文檔用哪個app 瀏覽:77
找人開發app的公司怎麼樣 瀏覽:651
android藍牙發送數據 瀏覽:428
範文瀾中國通史pdf 瀏覽:755
php常用的設計模式 瀏覽:889
安卓手機怎麼一個一個的截圖 瀏覽:980
javajsondate 瀏覽:356
matlab圖像處理演算法 瀏覽:670
安卓如何禁止手機自動降頻 瀏覽:697
一份加密不緊急的上行文 瀏覽:417
伺服器c5是什麼意思 瀏覽:444
基礎程序員證 瀏覽:425