android系统源码中给apk签名的几种方式(包括有源码和无源码的apk)

为什么要签名

首先说下为什么要签名,此部分为转载自android apk签名的作用

1.使用特殊的key签名可以获取到一些不同的系统权限
2. APK如果使用一个key签名,发布时另一个key签名的文件将无法安装或覆盖老的版本, 这样可以防止你已安装的应用被恶意的第三方覆盖或替换掉。
3.防止程序发布后被篡改签名一般用私钥,私钥签名以后会生成harsh值序列, 公钥验证的时候(手机上),会根据文件内容再生成一次harsh序列,如果和apk中的harsh序列相同, 说明apk发布后没有被篡改过。
4.应用程序升级:如果你希望用户无缝升级到新的版本,那么你必须用同一个证书进行签名。这是由于只有以同一个证书签名,系统才会允许安装升级的应用程序。如果你采用了不同的证书,那么系统会要求你的应用程序采用不同的包名称,在这种情况下相当于安装了一个全新的应用程序。如果想升级应用程序, 签名证书要相同,包名称要相同!
5.应用程序模块化:Android系统可以允许同一个证书签名的多个应用程序在一个进程里运行,系统实际 把他们作为一个单个的应用程序,此时就可以把我们的应用程序以模块的方式进行部署,而用户可以独立 的升级其中的一个模块
6.代码或者数据共享:Android提供了基于签名的权限机制,那么一个应用程序就可以为另一个以相同证书签名的应用程序公开自己的功能。以同一个证书对多个应用程序进行签名,利用基于签名的权限检查, 你就可以在应用程序间以安全的方式共享代码和数据了。

给无源码的apk的签名

对了,我以下所说的都是基于android系统源码平台来说的。

1.用命令

此方法我试了好几次,但是我始终是报错。最后别人说是我的jdk环境有问题导致的。还没来得及试,先贴上方法,等我解决了再贴上解决的方法:

  • 在下面路径找到签名文件“platform.pk8”和“platform.x509pem”(其实里面有好几个签名文件,不同的签名文件对应不同的权限。目前最常用的就是这两。)
android/build/target/product/security/
  • 找到签名工具“signapk.jar”(android系统自带的签名工具,可以在系统中找,也可以网上下载)(有时候找不到,要先编译出来)
android/prebuilts/sdk/tools/lib/signapk.jar
out/host/linux-x86/framework/signapk.jar 
  • 执行命令(将所有的文件放在同一个文件夹下)
java -jar signapk.jar platform.x509.pem platform.pk8 unsignDemo.apk signedDemo.apk

或者直接在android源码编译环境执行
java -jar out/host/linux-x86/framework/signapk.jar build/target/product/security/platform.x509.pem build/target/product/security/platform.pk8 input.apk output.apk
2.在系统中直接mm编译

在vendor目录下新建一个文件夹,将apk文件放在里面,然后为其编写一些mk文件。将它们两放在同一个文件夹下。然后在此文件夹下执行 mm -B -j16 命令。然后过一会则会将此apk放在out目录下。此apk即为平台签名过的。

mk文件如下:

LOCAL_PATH := $(call my-dir)
##------------------copy apps to system/app--------------------------##
include $(CLEAR_VARS)  
APPS := $(notdir $(wildcard $(LOCAL_PATH)/*.apk))
APP_NAME := $(basename $(APPS))
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE :=$(APP_NAME)
LOCAL_SRC_FILES := $(APPS)
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := platform
include $(BUILD_PREBUILT)

注意LOCAL_CERTIFCATE后面要跟platform,则平台才会为其签名,下面的则表示不再签名。
LOCAL_CERTIFICATE := PRESIGNED

带源码的apk

直接在mk文件中添加

LOCAL_CERTIFICATE := platform

猜你喜欢

转载自blog.csdn.net/xct841990555/article/details/80993099