工做中有時會遇到一些apk簽名不一樣,致使沒法安裝的問題。
場景一:java
有一個第三方apk(具備系統權限),沒法安裝在咱們本身的Android機器上,提示如下錯誤,致使沒法安裝。linux
這是因爲該APK具備系統權限,而系統簽名與咱們的Android設備系統簽名不一致。Android檢測到系統簽名不一致,因爲安全因素考慮,就阻止安裝了。 android
解決方法:使用本身的Android簽名工具給apk從新簽名。windows
(1) Android的簽名文件存放於系統源碼的 build/target/product/security/目錄下安全
該目錄下有 media.pk八、media.x509.pem、platform.pk八、platform.x509.pem、shared.pk八、shared.x509.pem、testkey.pk八、testkey.x509.pem等簽名文件,不一樣的簽名文件,對應不一樣的權限。Android默認的簽名文件爲testkey.pk八、testkey.x509.pem。app
(2) Android自帶的簽名工具爲 signapk.jar, 能夠在源碼編譯目錄out中找到,具體路徑爲:out/host/linux-x86/framework/signapk.jar 以上APK具備系統權限,從新簽名應該使用platform簽名文件進行簽名。工具
簽名方法:將對應權限的簽名文件platform.pk八、platform.x509.pem, 簽名工具 signapk.jar, 以及須要簽名的apk(假設 old.apk) 放到同一目錄下,打開linux終端(windows cmd也能夠),進入該目錄,進行從新簽名:ui
java -jar signapk.jar platform.x509.pem platform.pk8 old.apk new.apkspa
從新生成的new.apk就能夠安裝在咱們的Android設備上了。debug
場景二:具備apk源碼,一樣是具有系統權限的,當咱們將apk源碼導入Eclipse中,使用 Run as --> Android application 編譯安裝APK時, Eclise一樣會提示場景一的錯誤信息,緣由也是同樣。咱們一樣能夠將Eclipse生成的apk按照場景一的方法進行從新簽名,再安裝到咱們的設備上。可是,有時可能咱們會常常修改apk源碼進行調試驗證,若是每次都把apk拿出來進行從新簽名,再安裝,這樣確實麻煩了一些。Eclipse是支持使用本身的系統簽名工具進行APK打包簽名的。使用這種方法,能夠快速而方便地對APK進行系統簽名,並將其安裝到咱們的Android設備上。下面說一下具體作法:
步驟一:一樣取源碼目錄build\target\product\security 目錄下的platform.pk8 platform.x509.pem放到某一個目錄下
步驟二:進入該目錄,生成shared.priv.pem
openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out shared.priv.pem -nocrypt
步驟三:生成pkcs12
openssl pkcs12 -export -in platform.x509.pem -inkey shared.priv.pem -out shared.pk12 -name androiddebugkey
Enter Export Password:
Verifying - Enter Export Password:
這裏會提示輸入密碼,默認密碼是android,如是本身製做的key,輸入對應的密碼。
步驟四:生成debug.keystore,Eclipse須要使用該keystore.
keytool -importkeystore -deststorepass android -destkeypass android -destkeystore debug.keystore -srckeystore shared.pk12 -srcstoretype PKCS12 -srcstorepass android -alias androiddebugkey
步驟五:在Eclipse的 Windows/Preferences/Android/Build 中設置"Custom debug keystore"爲剛纔步驟四生成的debug.keystore便可直接run安裝調試apk.這樣的話,就能夠不用再去用signapk.jar,如java -jar signapk.jar platform.x509.pem platform.pk8 *.apk **.apk進行簽名了。
注:場景二其實也能夠直接將APK源碼放在Android系統源碼的環境下用make來編譯,須要編寫Android.mk,加入LOCAL_CERTIFICATE := platform,
能夠直接使用mm編譯apk, 編譯出來的APK一樣能夠順利安裝在咱們本身的Android設備上。
一個簡單的Android.mk(APK源碼只包含java文件,不含JNI代碼)文件能夠參考如下寫法,其中 XXX 修改成你的apk名字。
進入該源碼目錄,執行mm命令,便可在out/target/product/$PRODUCT_NAME/system/app目錄下生成 xxx.apk