给第三方apk进行系统签名的几种方式【转】
本文转载自:http://blog.csdn.net/luzhenrong45/article/details/47733053
版权声明:本文为博主原创文章,未经博主允许不得转载。
----------------------------------------------------------------------------
此文章仅作为学习交流所用
转载或引用请务必注明原文地址:
http://blog.csdn.net/luzhenrong45/article/details/47733053
或联系作者:luzhenrong45@gmail.com
谢谢!
----------------------------------------------------------------------------
注:本文假设你已经拥有Android系统源码,且对Android源码有一定认识。
工作中有时会遇到一些apk签名不同,导致无法安装的问题。
场景一:
有一个第三方apk(具有系统权限),无法安装在我们自己的Android机器上,提示以下错误,导致无法安装。
这是由于该APK具有系统权限,而系统签名与我们的Android设备系统签名不一致。Android检测到系统签名不一致,由于安全因素考虑,就阻止安装了。
解决方法:使用自己的Android签名工具给apk重新签名。
(1) Android的签名文件存放于系统源码的 build/target/product/security/目录下
该目录下有 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设备上了。
场景二:具有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
给第三方apk进行系统签名的几种方式【转】的更多相关文章
- Android实践 -- 对apk进行系统签名
对apk进行系统签名 签名工具 网盘下载 ,需要Android系统的签名的文件 platform.x509.pem 和 platform.pk8 这个两个文件在Android源码中的 ./build/ ...
- apk增加系统签名的方法
1.命令行方法给apk加系统签名在Linux环境:java -Djava.library.path=. -jar signapk.jar platform.x509.pem platform.pk8 ...
- 自学Linux Shell9.2-基于Red Hat系统工具包存在两种方式之一:RPM包
点击返回 自学Linux命令行与Shell脚本之路 9.2-基于Red Hat系统工具包存在两种方式之一:RPM包 本节主要介绍基于Red Had的系统(测试系统centos) 1. 工具包存在两种方 ...
- C语言获取系统时间的几种方式[转]
C语言获取系统时间的几种方式 C语言中如何获取时间?精度如何? 1 使用time_t time( time_t * timer ) 精确到秒 2 使用clock_t clock() 得到的是CPU时间 ...
- 内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式.
内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式. 一丶IDT解析. 我们知道.IDT表中存放着各种中断信息.比如当我们调用int 3的时候,则会调用IDT表中的第三项来进行调用. 而函数 ...
- 自学Linux Shell9.4-基于Red Hat系统工具包存在两种方式之二:源码包
点击返回 自学Linux命令行与Shell脚本之路 9.4-基于Red Hat系统工具包存在两种方式之二:源码包 本节主要介绍基于Red Had的系统(测试系统centos) 1. 工具包存在两种方式 ...
- C语言获取系统时间的几种方式
C语言获取系统时间的几种方式 2009-07-22 11:18:50| 分类: 编程学习 |字号 订阅 C语言中如何获取时间?精度如何? 1 使用time_t time( time_t * ...
- Android系统关机或几种方式重启
---------------------------------------------------------------------------------------------------- ...
- apk添加系统签名
上一节,可以通过添加su的方式获取系统权限,但这种存在安全隐患,故不推荐,本文通过获取数字签名方式获取系统权限. 在我们的AndroidManifest.xml中添加 android:share ...
随机推荐
- jQuery实现tab选项卡效果小demo
html页面: <section> <h2>Section Title</h2> <ul class="tab-nav"> < ...
- CDOJ 3 BiliBili, ACFun… And More! 模拟
原题链接:http://acm.uestc.edu.cn/#/problem/show/3 题意: 有个人在看B站视频时有个习惯,就是每当卡住的时候,他总再次从头开始看.另外,他在看视频时会先等待T的 ...
- CDOJ 92 Journey LCA乱搞
原题链接:http://acm.uestc.edu.cn/#/problem/show/92 题意: 给你一棵树,然后在树上连接一条边.现在有若干次询问,每次问你两个点(u,v)之间的距离在加那条边之 ...
- android toolbar 假标题居中
<android.support.v7.widget.Toolbar android:id="@+id/toolbar_top" android:layout_height= ...
- AndroidStudio怎样导入jar包
来自:http://jingyan.baidu.com/article/e6c8503c7190b7e54f1a1893.html AndroidStudio用于开发安卓Apk非常地方便,但是它的很多 ...
- Linux如何显示文件指定行数的内容;显示第一行、中间几行和最后几行
1.tail -n +/-数字 文件名 2.head -n 数字 文件名 3.sed -n "开始行,结束行p" 文件名 4.sed -n '1p;20,40p; "显示 ...
- 写一个dup2功能同样的函数,不能调用 fcntl 函数,而且要有出错处理
实现的时候用到系统原来的dup函数 // mydup2.c // 2015/08/17 Lucifer Zhang version1.0 // write my own dup2 function / ...
- angular - 小结
引入样式: 导入全局 - >styles.css 导入第三方 - > 在package.json配置,然后再 npm install 安装好以后,最后再angular.json里面的sty ...
- Linux mm相关的问题
[S]为什么High MEM是从896M開始的? As the running kernel needs these functions, a region of at least VMALLOC_R ...
- ssm 网页
http://stackoverflow.com/questions/14545872/bean-named-xxx-must-be-of-typexxx-but-was-actually-of-ty ...