![](/img/trans.png)
[英]What does “dynamically modify resource tables” exactly mean in Android Application
[英]What does exporting an Android application do, exactly?
http://developer.android.com/tools/publishing/preparing.html上的說明表明,在將我的android應用程序發布給公眾之前,我應該先導出它。 導出中執行哪些步驟?
這是我所了解的:
zipalign在已簽名的APK上運行
我在AndroidManifest.xml中手動將android:debuggable設置為false,並比較了調試和導出的apk。 這些是唯一不同的文件:
Binary files ../../release/x//classes.dex and x/classes.dex differ
Binary files ../../release/x//META-INF/CERT.RSA and x/META-INF/CERT.RSA differ
diff -r ../../release/x//META-INF/CERT.SF x/META-INF/CERT.SF
diff -r ../../release/x//META-INF/MANIFEST.MF x/META-INF/MANIFEST.MF
那么我上面的列表是否包括所有內容? 還是不同的classes.dex表示調試和導出的apk之間還有其他區別?
感謝下面的錯誤454的回答,我在每個apk的classes.dex文件上運行了baksmali,發現了一個區別:
diff -r out/xx/xx/xx/BuildConfig.smali ../../../release/x/out//xx/xx/xx/BuildConfig.smali
7c7
< .field public static final DEBUG:Z = true
---
> .field public static final DEBUG:Z
所以我想我可以在此列表中添加第四項:
在類BuildConfig(gen /.../ BuildConfig.java)中,DEBUG設置為false。
除了列出的內容外,proguard還在導出過程中運行。
如果您對classes.dex中差異的本質非常好奇,則可以獲取baksmali ,解壓縮apk並反編譯classes.dex文件:
java -jar baksmali-1.3.3.jar classes.dex
這將創建一個out /文件夾,其中包含您可以在舊/新內容之間進行區分的內容。
BuildConfig.DEBUG標志不同的原因是因為您導出了SDK發行說明修訂版17中所述的發行版與調試版:
添加了一項功能,使您只能在調試模式下運行某些代碼。 現在,生成會生成一個名為BuildConfig的類,其中包含一個DEBUG常量,該常量會根據您的生成類型自動設置。 您可以在代碼中檢查(BuildConfig.DEBUG)常量以運行僅調試功能。
無論目標是debug
還是release
,構建都需要執行許多步驟。 這不是直接的答案,但我建議您查看android-sdk/tools/ant/build.xml
打開文件后,搜索target name="release"
。 您將看到depends
屬性,該屬性列出了將被調用的同一文件中的其他目標。 您可以將release
運行的目標與debug
目標進行比較。 在每個目標內部,您可以具體查看要運行的內容(例如android-sdk/platform-tools
某些實用程序),以及確定是否要運行的內容。
您還可以查看在目標調用期間將哪些參數傳遞給外部實用程序,這使您可以閱讀有關實用程序這些參數的文檔,以查看特定步驟的具體情況。
需要注意的是,雖然您可能會在eclipse中導出應用程序,但是研究ant build.xml可以提供一種系統地標識將為完整構建執行的每個步驟的方法。
舉一個復雜的例子,如果查看target -set-release-mode
,可以看到一個實例,在該實例中可以生成一個用發行密鑰而不是調試密鑰簽名的調試包。
還是不同的classes.dex表示調試和導出的apk之間還有其他區別?
即使使用相同的代碼,生成的classes.dex也不必與以前編譯的版本二進制相同。 這是由於編譯器優化代碼AFAIK的方式不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.