应用程序系统签名

来源:互联网 发布:mysql.sock不见了 编辑:程序博客网 时间:2024/04/28 13:21

tag:涉及系统功能、系统签名、签名文件、INSTALL_FAILED_SHARED_USER_INCOMPATIBLE、INSTALL_FAILED_UPDATE_INCOMPATIBLE

在开发中涉及到调用系统核心功能,必须将程序Androidmanifest.xml里面的sharedUserid赋值为android.uid.systemui才行。这些应用程序必须签名成系统应用才行,否则在安装的时候会提示INSTALL_FAILED_SHARED_USER_INCOMPATIBLE或者INSTALL_FAILED_UPDATE_INCOMPATIBLE错误。还有可能在调用系统api的时候提示“java.lang.SecurityException: Neither user 10055 nor current process has android.permission.INSTALL_PACKAGES”错误。

将Eclipse里面开发出的apk应用进行系统签名将避免这些问题。签名之后的应用可以直接在手机上面安装和卸载。签名方法有两种,下面将分别讲述。

1. 如果你有系统源码,最简单的就是将eclipse里面的应用拷贝到系统里面,然后编译系统,会生成out/target/product/project_name/system/app/abc.apk,这个应用就是经过系统签名了。具体方法如下:

将应用文件夹复制到package/app里面,并且只保留src、res、libs、androidmanifest.xml这三个文件,里面新建一个Android.mk文件,内容如下:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := abc
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)

注意红色字体表示在编译过程中将对这个模块进行系统签名。同时修改build/target/product/common.mk,在里面的PRODUCT_PACKAGES := \添加abc(即模块名称)即可。重新编译一下整个代码,就会在out目录下面生成这个apk了。

2. 上面的方法就是你需要整个android系统的源代码,比较非常麻烦。这个方法就是取出手机所用系统的签名文件,对eclipse编译出来的abc.apk文件进行签名。优点就是方便快捷。步骤包含下面几步:

a. 取得签名文件。在build/target/product/security这个目录下面一般就会有签名文件了。但是不忙,该目录下面也可能有common、project_name等目录。先看看你这套代码是那个工程目录下面。取错了签名文件,最后签名出的文件一样不行。由于本机是project_name工程,所以取 build/target/product/security/project_name/下面的platform.x509.pemplatform.pk8这两个签名文件。

b.去的签名工具。在alps\vendor\mediatek\konka75_cu_ics\artifacts\out\host\linux-x86\framework即可找到signapk.jar这个文件。该文件的源码在build/tools/signapk下面,如果有兴趣可以研究一下。

c.对apk文件进行签名。将对应的四个文件拷贝到某盘某文件下面(嘿嘿,这个不用举例了吧),然后在cmd下面进入该目录,运行命令java-jar signapk.jar platform.x509.pem platform.pk8 input.apk output.apk。生成的output.apk就是我们最终签名成功的应用了。

该应用跟上面第一种方式拿到的应用大小是不一样的,但是一样可用。


参考文献:

1.http://blog.csdn.net/happyhell/article/details/5903389

2.http://www.cnblogs.com/TerryBlog/archive/2010/09/10/1823103.html