項目做的差不多了,要簽名,然後混淆防治被反編譯,記錄下流程
默認各種環境都是配置好了的。
主要分以下幾步
1、生成ant打包所需的配置文件
2、生成應用簽名的keystore,對apk簽名
3、編寫混淆文件,混淆代碼,防止反編譯
第一步,生成ant打包的配置文件
在項目根目錄下執行指令:android update project —path .
會自動生成三個目錄: build.xml,local.properties,proguard-project.txt
還有一個要自己建的ant.properties
一共四個文件
build.xml:Ant的默認生成文件,描述了打包的任務和流程,其語法參考點擊打開鏈接
local.properties:包含本地的環境變量sdk.dir=/Users/xx/eclipse/adt-bundle-mac-x86_64-20131030/sdk
proguard-project.txt:混淆文件,對代碼進行混淆,語法參考點擊打開鏈接
ant.properties:簽名文件的相關配置。
這一步完成就可以用ant打包應用了,進入到應用根目錄,運行ant release,就會在bin目錄下生成打包好的apk,只是都是沒有簽名的,這時候還沒有配置簽名。
第二步、生成keystore,配置簽名
命令:keytool -genkey -keystore jason0539.keystore -keyalg RSA -validity 10000 -alias jason0539.keystore
輸入密鑰庫口令: *********
再次輸入新口令:
您的名字與姓氏是什麼?
[Unknown]: blog.csdn.net/jason0539
您的組織單位名稱是什麼?
[Unknown]: jason0539
您的組織名稱是什麼?
[Unknown]: jason0539
您所在的城市或區域名稱是什麼?
[Unknown]: 秦皇島
您所在的省/市/自治區名稱是什麼?
[Unknown]: 河北
該單位的雙字母國家/地區代碼是什麼?
您的名字與姓氏是什麼?
[Unknown]: blog.csdn.net/jason0539
您的組織單位名稱是什麼?
[Unknown]: jason0539
您的組織名稱是什麼?
[Unknown]: jason0539
您所在的城市或區域名稱是什麼?
[Unknown]: 秦皇島
您所在的省/市/自治區名稱是什麼?
[Unknown]: 河北
該單位的雙字母國家/地區代碼是什麼?
[Unknown]: CN
CN=huodianditu.bmob.cn, OU=jason0539, O=jason0539, L=秦皇島, ST=河北, C=CN是否正確?
[否]: y
[否]: y
輸入 <jason0539.keysotre> 的密鑰口令
(如果和密鑰庫口令相同, 按回車):
回車之後就會在目錄下生成jason0539.keystore文件,就是用來對應用簽名的文件了。
命令參數說明:
-genkey 產生證書文件-keystore 指定密鑰庫的.keystore文件中
-keyalg 指定密鑰的算法
-validity 爲證書有效天數,這裏我們寫的是10000天。
-alias 產生別名
在輸入密碼時沒有回顯,只管輸入就可以了,一般位數建議使用20位,切忌需要記下來後面還要用,
注意:
1、CN(Common Name - 名字與姓氏):其實這個“名字與姓氏”應該是域名,比如說localhost或是blog.devep.net之類的。輸成了姓名,和真正運行的時候域名不符,會出問題。瀏覽器訪問時,彈出一個對話框,提示“安全證書上的名稱無效,或者與站點名稱不匹配”,用戶選擇繼續還是可以瀏覽網頁。但是用http client寫程序訪問的時候,會拋出類似於“javax.servlet.ServletException: HTTPS hostname wrong: should be ”的異常。
2、在用keytool生成數字證書時必須保證:-keystore androidapp.keystore -alias androidapp.keystore 兩者名稱必須相同。否則下一步簽名時會出現錯誤:jarsigner: 找不到 androidapp.keystore 的證書鏈。androidapp.keystore 必須引用包含專用密鑰和相應的公共密鑰證書鏈的有效密鑰庫密鑰條目。
第三步、接下來配置ant.properties,使用keystore對apk簽名
在ant.properties文件中,添加如下內容:
key.store=jason0539.keystore
key.alias=jason0539.keystore
key.store.password=***
key.alias.password=***
android.library=false
其中:
keystore爲私鑰庫文件。
key爲簽名需要使用的私鑰。
key.store.password爲私鑰庫的密碼。
key.alias.password爲私鑰的密碼。
這一步完成,然後命令行直接運行ant release就會打包成功了,並且是簽名過的,在bin目錄下。
這一步遇到的問題:
第一次把別名的keystore輸成了keystroe,結果一直提示build.xml:1151: Signing key jason0539.keystore not found
後來把這個刪掉,想重新生成一個新的keystore,結果提示android Keystore was tampered with, or password was incorrect: Password verification
後來意識到可能跟兩個keystore的名字相同有關,就又刪掉,重新生成一個,名字不叫jason0539.keystore了,改爲jason.keystore,這下就成功了。
第四步、混淆文件
在project.properties裏面有一行被註釋掉的代碼如下
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
把這行註釋取消,然後根據自己的項目,去編寫proguard-project.txt這個文件作混淆就可以了。
具體的混淆語法可參考點擊打開鏈接
這一步主要注意的是,如果項目中用了第三方的jar包,比如百度地圖的,要注意保持裏面一些類不被混淆,否則會crash,具體保持哪些類,在百度開放平臺會有說明,去對應jar包的官網看就好了。
如果用了很多第三方sdk,混淆後可能啓動應用就會crash,
建議根據log找到對應出問題的sdk,然後去對應開放平臺查看混淆注意事項,把需要保持的類保護好。以此類推,把所有第三方sdk配置好就沒問題了。
更多參考