android apk 签名(平台和普通签名)

android apk 签名(平台和普通签名)因为做了太多的终端项目,客户总会有自己的apk提供,这时候各种签名问题就来了,最近整理了一下相关知识,分享给大家。签名的用处:1.应用程序升级:如果你希望用户无缝升级到新的版本,那么你必须用同一个证书进行签名。这是由于只有以同一个证书签名,系统才会允许安装升级的应用程序。如果你采用了不同的证书,那么系统会要求你的应用程序采用不同的包名称,在这种情况下相当于安装了一个全新的应用程…

大家好,又见面了,我是你们的朋友全栈君。

      因为做了太多的终端项目,客户总会有自己的apk提供,这时候各种签名问题就来了,最近整理了一下相关知识,分享给大家。

签名的用处:

1.应用程序升级:如果你希望用户无缝升级到新的版本,那么你必须用同一个证书进行签名。这是由于只有以同一个证书签名,系统才会允许安装升级的应用程序。如果你采用了不同的证书,那么系统会要求你的应用程序采用不同的包名称,在这种情况下相当于安装了一个全新的应用程序。如果想升级应用程序,签名证书要相同,包名称要相同!

2.应用程序模块化:Android系统可以允许同一个证书签名的多个应用程序在一个进程里运行,系统实际把他们作为一个单个的应用程序,此时就可以把我们的应用程序以模块的方式进行部署,而用户可以独立的升级其中的一个模块  

3.代码或者数据共享:Android提供了基于签名的权限机制,那么一个应用程序就可以为另一个以相同证书签名的应用程序公开自己的功能。以同一个证书对多个应用程序进行签名,利用基于签名的权限检查,你就可以在应用程序间以安全的方式共享代码和数据了。

举个例子,如果你里面的apk是签名A,但是外面同包名的apk是签名B,那是install不进去的;

再比如一个apk你使用它自身的签名预置进系统,那它只会有普通权限,而如果签了平台签名,则会有很多系统权限,具体权限可以查看frameworks/base/core/res/AndroidManifest.xml文件。

一.平台签名

      首先说一下接触最多的平台签名(platform signature),也称为系统签名.

      下面方法中platform.x509.pem和platform.pk8文件可能是alps/build/target/product/security/ 中的,也有可能alps/device/mediatek/common/security/中的,具体需要查看MTK_SIGNATURE_CUSTOMIZATION这个宏为yes的就是alps/device/mediatek/common/security/,反之,具体逻辑如下:

  ifeq ($(MTK_SIGNATURE_CUSTOMIZATION),yes)
    ifeq ($(wildcard device/mediatek/security/$(strip $(MTK_TARGET_PROJECT))),)
      $(error Please create device/mediatek/security/$(strip $(MTK_TARGET_PROJECT))/ and put your releasekey there!!)
    else
      PRODUCT_DEFAULT_DEV_CERTIFICATE := device/mediatek/security/$(strip $(MTK_TARGET_PROJECT))/releasekey
    endif

1.在N之前的签名方法为

      在已经编译好的工程中 :out/host/linux-x86/framework/路径 取出 signapk.jar 文件 ,然后从 alps/build/target/product/security/    下面取出另外两个文件 platform.x509.pem 和 platform.pk8
然后三个文件+apk文件,放在同一个路径下。 

执行签名操作:
    java -jar signapk.jar platform.x509.pem platform.pk8 input.apk(原始的apk) output.apk(生成的apk)
    然后apk就相当于系统签名了,获取了系统权限(以后会有一篇讲权限的)。

2.在N或者之后

在alps路径下:

java -Xmx2048m -Djava.library.path=”out/host/linux-x86/lib64″   -jar out/host/linux-x86/framework/signapk.jar  build/target/product/security/platform.x509.pem     build/target/product/security/platform.pk8  input.apk(原始的apk) output.apk(生成的apk)

当然也可以拿出out/host/linux-x86/lib64/  ,out/host/linux-x86/framework/signapk.jar,build/target/product/security/platform.x509.pem,build/target/product/security/platform.pk8等文件拿出来放在一起,但是路径就得记得修改了,所以建议直接在alps下运行该命令。

3.查看是否签名成功

1)解压apk

2)进入解压出来的文件夹,其中有一个META-INF文件夹,在该文件夹位置打开终端,输入:

keytool -printcert -file XXXX.RSA(一般来讲会是CERA.RSA)

然后就可以从下面这些信息看出是否成功:

android apk 签名(平台和普通签名)

还有一种方式是运行jarsigner -verify -verbose -certs xxx.apk(你的签完的apk) >log.txt

log.txt会打出签名信息,也能够看出。

4.生成平台签名的步骤

平台签名步骤

在alps路径下:
    1、development/tools/make_key releasekey  ‘/C=xx/ST=xx/L=xx/O=xx/OU=xx/CN=xx/emailAddress=xxx@xx.com’
    development/tools/make_key platform  ‘/C=xx/ST=xx/L=xx/O=xx/OU=xx/CN=xx/emailAddress=xxx@xx.com’
    development/tools/make_key media  ‘/C=xx/ST=xx/L=xx/O=xx/OU=xx/CN=xx/emailAddress=xxx@xx.com’
    development/tools/make_key shared  ‘/C=xx/ST=xx/L=xx/O=xx/OU=xx/CN=xx/emailAddress=xxx@xx.com’
    development/tools/make_key testkey  ‘/C=xx/ST=xx/L=xx/O=xx/OU=xx/CN=xx/emailAddress=xxx@xx.com’

不要输密码,密码为空,除非你能忍受编译的时候隔几分钟要你输一次密码,或者自己写脚本输密码

    2、拷贝到alps/device/mediatek/common/security/
    3、MTK_SIGNATURE_CUSTOMIZATION = no –> MTK_SIGNATURE_CUSTOMIZATION = yes
    4、MTK_INTERNAL = no(如果有)

上面的信息对应:

    ‘/C=xx/ST=xx/L=xx/O=xx/OU=xx/CN=xx/emailAddress=xxx@xx.com’
    What is your first and last name?(CN)
    What is the name of your organizational unit?(OU)
    What is the name of your organization?(O)
    What is the name of your City or Locality?(L)
    What is the name of your State or Province?(ST)
    What is the two-letter country code for this unit?(C)
    What is the email address?

关于这几个签名对应的意义:

        1)testkey/releasekey:普通APK,默认情况下使用。
        2)platform:该APK完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,这种方式编译出来的APK所在进程的UID为system。
        3)shared:该APK需要和home/contacts进程共享数据。
        4)media:该APK是media/download系统中的一环。

5.生成.jks

很多时候可以是需要拿这签名去开发的,要是每次都使用命令使用  platform.x509.pem和platform.pk8文件去签那就实在太麻烦了,需要生成apk然后再拿出来签,所以我们可以生成一个keystore文件让他们直接在andorid studio上用。

1.openssl pkcs8 -inform DER -nocrypt -in platform.pk8 -out platform.pem
2.openssl pkcs12 -export -in  platform.x509.pem -out platform.p12 -inkey  platform.pem -password pass:xxx(xxx是密码) -name xxx(xxx是别名)
3.keytool -importkeystore -deststorepass xxx(xxx是密码) -destkeystore ./xxx.jks(xxx就是keystore的名称) -srckeystore ./platform.p12 -srcstoretype PKCS12 -srcstorepass xxx(xxx是密码)

这样的话会生成一个xxx.jks文件,这个文件就是keystore文件,该文件可以改成keystore后缀,当然也可以不修改,然后就可以将他提供给客户作开发用了。

 

6.源码中使用平台签名

makefile(比如预置apk时的android.mk)中加入:

LOCAL_CERTIFICATE := platform

编译进去就是用的平台签名。

 

二.普通签名

1.生成签名文件

有两种方式,

1)android studio:

首先Build—Generate Signed Apk,然后选择Create new… ,接着就可以写入信息了,写入后选择.jks文件的存放路径就可以了。

2)终端生成:

首先输入keytool -genkey -v -keystore android.keystore(xxx即为keystore名称)  -alias xxx (xxx为别名) -keyalg RSA -validity 3650,接着照着提示输入信息:

android apk 签名(平台和普通签名)

然后就生成了keystore了。

2.使用keystore签名

1)Android studio:

首先Build—Generate Signed Apk,然后就不用新建了,直接使用原来的.jks文件,输入密码和别名,生成apk就行了。

2)使用终端:

jarsigner -verbose -keystore xxx.keystore(原先生成的keystore) -signedjar  xxx_signed.apk(签名后的apk名称,”signed”不为必须,建议这么写,好区分) -digestalg SHA1 -sigalg MD5withRSA PhoneBook.apk(需要签名的apk名称) xxx(keystore别名)

运行该命令之后就会生成已签名的xxx_signed.apk

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/134683.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ISO-8859-1乱码恢复

    ISO-8859-1乱码恢复

    2022年1月22日
    70
  • 背包问题九讲笔记_01背包[通俗易懂]

    背包问题九讲笔记_01背包[通俗易懂]摘自TianyiCui童鞋的《背包问题九讲》,稍作修改,方便理解。01背包问题描述已知:有一个容量为V的背包和N件物品,第i件物品的重量是weight[i],收益是cost[i]。限制:每种物品只有一件,可以选择放或者不放问题:在不超过背包容量的情况下,最多能获得多少价值或收益相似问题:在恰好装满背包的情况下,最多能获得多少价值或收益这里,我们先讨论在不超过背包容量的情况

    2022年7月12日
    25
  • 局域网与广域网详解区别_广域网有哪些

    局域网与广域网详解区别_广域网有哪些1.局域网  局域网,英文名字LocalAreaNetwork,缩写为LAN。是指在某一区域内由多台计算机互联成的计算机组。一般是方圆几千米以内。局域网是封闭型的,可以由办公室内的两台计算机组成,也可以由一个公司内的上千台计算机组成。生活中我们的每一个学校、公司都是一个局域网局域网可以理解为我们自己使用路由器、交换机组成的内部网络这个网络实现的是内部机器的通信,比如咱们访问学校的…

    2022年10月19日
    3
  • C语言之数组的基本知识

    C语言之数组的基本知识在没接触数组之前,同学们用的都是定义一个一个变量来存放数据,但是这样就有一个缺陷,如果数据量很大的时候,比如有50个学生的成绩需要录入进去,那么定义50一个变量将会非常耗费时间,而且用scanf()函数输入数据的时候也很麻烦。intstu1,stu2,stu3,…,stu50;scanf("%d%d%d%d…",&stu1,&stu2,&s…

    2022年7月11日
    26
  • groupby 排序_stream group by

    groupby 排序_stream group bydata.stream().collect(Collectors.groupingBy(item->item.get(“sort”),LinkedHashMap::new,Collectors.toList()));

    2022年8月20日
    7
  • windows下git显示文件被修改,实际没有改动的问题解决办法

    windows下git显示文件被修改,实际没有改动的问题解决办法

    2021年11月7日
    301

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号