注:本文假设你已经拥有Android系统源码,且对Android源码有一定认识。

apk签名不同,导致无法安装的问题。
    场景一:

(具有系统权限),无法安装在我们自己的Android机器上,提示以下错误,导致无法安装。


    

android 程序不签名 android apk签名不一致_android 程序不签名



    这是由于该APK具有系统权限,而系统签名与我们的Android设备系统签名不一致。Android检测到系统签名不一致,由于安全因素考虑,就阻止安装了。   

解决方法:使用自己的Android签名工具给apk重新签名。

    (1) Android的签名文件存放于系统源码的 build/target/product/security/目录下

    

android 程序不签名 android apk签名不一致_签名文件_02


    该目录下有 media.pk8、media.x509.pem、platform.pk8、platform.x509.pem、shared.pk8、shared.x509.pem、testkey.pk8、testkey.x509.pem等签名文件,不同的签名文件,对应不同的权限。Android默认的签名文件为testkey.pk8、testkey.x509.pem。

    (2) Android自带的签名工具为 signapk.jar, 可以在源码编译目录out中找到,具体路径为:out/host/linux-x86/framework/signapk.jar    以上APK具有系统权限,重新签名应该使用platform签名文件进行签名。

    签名方法:将对应权限的签名文件platform.pk8、platform.x509.pem, 签名工具 signapk.jar, 以及需要签名的apk(假设 old.apk) 放到同一目录下,打开linux终端(windows cmd也可以),进入该目录,进行重新签名:

java -jar signapk.jar platform.x509.pem platform.pk8 old.apk new.apk

    重新生成的new.apk就可以安装在我们的Android设备上了。

    

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




android 程序不签名 android apk签名不一致_android 程序不签名_03




ndroid系统源码的环境下用make来编译,需要编写Android.mk,加入LOCAL_CERTIFICATE := platform,

可以直接使用mm编译apk, 编译出来的APK同样可以顺利安装在我们自己的Android设备上。

一个简单的Android.mk(APK源码只包含java文件,不含JNI代码)文件可以参考以下写法,其中 XXX 修改为你的apk名字。

android 程序不签名 android apk签名不一致_签名文件_04

进入该源码目录,执行mm命令,即可在out/target/product/$PRODUCT_NAME/system/app目录下生成 xxx.apk