Android中应用程序如何获得系统签名权限_img_from_target_files-程序员宅基地

技术标签: 签名  android  Android  

FROM:http://blog.csdn.net/jingwen3699/article/details/8024900

signapk.jar与eclipse export插件默认赋予程序一个DEBUG权限的签名

signapk.jar包含有系统权限(system api, permission),而eclipse export插件默认赋予程序一个DEBUG权限的签名。

D:\work_feixun\GalleryBack>java -jar signapk.jar platform.x509.pem platform.pk8 D:\work_feixun\Gallery2\bin\Gallery.apk Gallery_signed.apk

注:

signapk.jar   位于 out/host/linux-86/framework/signapk.jar

platform.x509.pem platform.pk8   位于 build/target/product/security/platform.x509.pem, platform.pk8

Gallery.apk的生成,先在eclipse中对project->clean,然后 run ->android application.在bin目录下会生成Gallery.apk。

最后
D:\work_feixun\GalleryBack>java -jar signapk.jar platform.x509.pem platform.pk8 D:\work_feixun\Gallery2\bin\Gallery.apk Gallery_signed.apk

这样包含有系统权限的签名apk就完成了。

 

我是在AndroidManifast中添加android.permission.WRITE_MEDIA_STORAGE时出现

permission is only granted to system apps.

 

from:http://blog.csdn.net/tangmin0719/article/details/8916417

 

一、为什么要签名

       开发Android的人这么多,完全有可能大家都把类名,包名起成了一个同样的名字,这时候如何区分?签名这时候就是起区分作用的。

        由于开发商可能通过使用相同的Package Name来混淆替换已经安装的程序,签名可以保证相当名字,但是签名不同的包不被替换。

       APK如果使用一个key签名,发布时另一个key签名的文件将无法安装或覆盖老的版本,这样可以防止你已安装的应用被恶意的第三方覆盖或替换掉。

       这样签名其实也是开发者的身份标识。交易中抵赖等事情发生时,签名可以防止抵赖的发生。

二、签名的注意事项

       Android系统要求所有的程序经过数字签名才能安装,如果没有可用的数字签名,系统将不许安装运行此程序。不管是模拟器还是真实手机。因此,在设备或者是模拟器上运行调试程序之前,必须为应用程序设置数字签名。

       Android签名的数字证书不需要权威机构来认证,是开发者自己产生的数字证书,即所谓的自签名。数字证书用来标识应用程序的作者和在应用程序之间建立信任关系,而不是用来决定最终用户可以安装哪些应用程序。

       系统仅仅会在安装的时候测试签名证书的有效期,如果应用程序的签名是在安装之后才到期,那么应用程序仍然可以正常启用。

       可以使用标准工具-Keytool and Jarsigner-生成密钥,来签名应用程序的.apk文件。

       签名后需使用zipalign优化程序。

       模拟器开发环境,开发时通过ADB接口上传的程序会先自动被签有Debug权限,然后才传递到模拟器。Eclipse菜单的Window -> Preferences -> Android –> Build 下显示的是我们默认的调试用的签名数字证书。

       正式发布一个Android应用时,必须使用一个合适的私钥生成的数字证书来给程序签名,不能使用ADT插件或者ANT工具生成的调试证书来发布。

 

三、签名方法:

1.使用Keytool jarsigner工具签名(在jdk/bin目录下)

1.生成签名keystore

确保电脑上安装了JDK,因为我们将使用JDK自带的创建和管理数字证书的工具Keytool。在命令行下输入如下命令:

keytool -genkey -v -keystore app.keystore -alias alias_name -keyalg RSA -validity       20000

-alias 后面跟的是别名这里是alias_name
-keyalg 
是加密方式这里是RSA
-validity 
是有效期这里是20000
-keystore 
就是要生成的keystore的名称这里是app.keystore           
然后按回车键
按回车后首先会提示你输入的密码:这个在签名时要用的,要记住
然后会再确认你的密码。
之后会依次叫你输入姓名、组织单位、组织名称、城市区域、省份名称、国家代码(CN)等。

Keytool的详细参数请参考:

http://www.android123.com.cn/androidkaifa/173.html

2.签名:

jarsigner -verbose -keystore app.keystore -signedjar app_signed.apk app.apk alias_name
-keystore: keystore的名称
-signedjar  app_signed.apk: 指定签名后生成的APK名称
app.apk: 目标APK
然后按回车:会要求输入刚才设置的密码,输入后按回车就开始签名了。

 

3.查看签名:

jarsigner -verify app_signed.apk                                  

查看是否签名,如果已经签名会打印 "jar verified".

jarsigner -verify -verbose -certs app_signed.apk      

查看签名详细信息。

 

4.通过zipalign工具进行优化apk(android自带的工具,./build/tools/zipalign)

zipalign -v 4  app_signed.apk androidres.apk   apk优化

zipalign -c -v 4  androidres.apk                 查看apk是否经过优化

 

 2.使用eclipse ADT工具签名
Package Explorer 窗口,右键,选择Android Tools--->Export Signed Application Package 然后按照提示一步一步,生成已签名的apk。通过eclipse也可以导出未签名的APK文件。

注:需要输入两次密码,第一次是私钥密码,第二次时私钥别名的密码。

 

  3.eclipsedebug模式下自动签名(无须手动配置): 

       debug模式下用eclipse ADTandroid签名,只要应用程序在eclipse下开发,系统就会自动给apk签名和优化。

       EclipseWindows > Preferences > Android  > Build可以看到你keysotre的位置;

四、生成Android系统签名

       上面讲的Android数字签名大多是与Android APK相关,做CTS 认证时,需要用到Android系统签名。为什么需要给Android系统签个名才能进行CTS认证呢?原来我们通过make -j4编译出来的system.img使用的是test key,这种类型的key只适用于开发阶段,而且这种秘钥是公开的,谁都可以使用。当发布一款android产品,就需要另外给整个系统签个名,防止被别人盗用。这种系统就是release版本的Android系统。

1、生成加密key文件

要对Android系统进行签名,需要生成四种类型的key文件。

a)releasekey testkey

b)media

c)shared

d)platform

1)进入/android_src/development/tools目录。

2)使用make_key工具生成签名文件。需要分别生成 releasekeymediasharedplatform

./make_key releasekey '/C=CN/ST=JiangSu/L=NanJing/O=Company/OU=Department/CN=Your Name/emailAddress=YourE-mailAddress'   (系统将会提示输入针对各种key的密码,按照提示输入即可)

将会生成 releasekey.pk8  releasekey.x509.pem文件,其中 *.pk8是生成的私钥,而*.x509.pem是公钥,生成时两者是成对出现的.

注:如果出现 openssl : relocation error :openssl : symbol ...尝试用 sudo 执行命令,问题解决了!

2.回到根目录android_src

命令执行的时候都最好在工程的根目录下执行,要不然脚本用到的某些文件找不到的。

3.编译系统

   make -j4 PRODUCT-generic-user dist  

其中generic 表示生成的TARGET_PRODUCT类型为generic

     user代表TARGET_BUILD_VARIANTuser版本。

编译完成之后回在android_src/dist/目录内生成个product_generic-user_files开头的zip文件.这就是我们需要进行签名的文件系统.

4.开始签名

./build/tools/releasetools/sign_target_files_apks -d key_directory/ out/dist/product_modul-target_files.zip  out/dist/signed_target_files.zip 

通过sign_target_files_apks 脚本,完成android系统的签名工作.

key_directory/ 表示key所在的目录。

out/dist/product_modul-target_files.zip   源文件。

out/dist/signed_target_files.zip   生成签名的目标文件。

可能会出现:

ERROR: no key specified for:
  CalendarWidget.apk
  Contacts_yellowpage.apk
  SnsAppMain.apk

这表示,签名并没有成功,原因是由于有些apk程序已经签过名了或者找不到对应的key. 这需要我们对apk设置过滤,不对上面的应用进行签名.方法如下:

通过参数"-e <apkname>=" 来过滤这些应用.

./build/tools/releasetools/sign_target_files_apks -d key_directory/  -e  CalendarWidget.apk= -e Contacts_yellowpage.apk= -e SnsAppMain.apk= -e   out/dist/product_modul-target_files.zip  out/dist/signed_target_files.zip

输入该命令时会提示输入key的密码,会出现四次密码输入提示。分别为四种类型的key的密码。

5.生成image文件

./build/tools/releasetools/img_from_target_files  out/dist/signed-target-files.zip  signed-img.zip

img_from_target_files 命令对生成的igned-target-files.zip文件进行打包,signed-img.zip包含了boot.img,userdate.img,system.img文件等.

6.通过fastboot下载signed-img.zip文件

fastboot update signed-img.zip

通过fastboot就可以把签了名的系统文件烧到手机上了。

五、几个问题:

1.make_key Keytool两种方式生成的key有何区别:

       Keytool 位于%JAVA_HOME%/bin目录下,用于管理密钥、证书和证书链。JavaSE6中的Keytool已经改变,还可以用来管理对称加密算法中的密钥。它生成的mykey.keystore包括公钥、私钥和证书。

make_key 位于source_src/development/tools 目录下,通过调用openssh生成公钥和私钥,所以生成*.x509.pem*.pk8的密钥对。

2.make_key生成的密钥对,对apk进行手动签名:

通过signapk.jar 工具对apk签名,用法:signapk [-w] publickey.x509[.pem] privatekey.pk8 input.jar output.jar

java -jar out/host/linux-x86/framework/signapk.jar  releasekey.x509.pem releasekey.pk8    source.zip  source-signed.zip  

signapk.jar可以自己编译,源码在build/tools/signapk目录下。

3.android源码编译make 时,对所有应用签名规则:

系统在编译的时候,读取build/core/package.mk文件,根据LOCAL_CERTIFICATE的值在build/target/product/security/目录下选择相应的签名。LOCAL_CERTIFICATE值从各应用的Android.mk文件中读取,如果Android.mk文件中没有该属性,则默认为testkey

六、常见异常:

1.如果遇到了ZipException invalid entry compressed size的错误方法

主要原因是平时Eclipse使用的ADT插件已经赋予了DEBUG权限的数字签名,我们可以通过导出一个未签名的APK文件就可以解决。

2.使用jarsigner工具来签名,出现无法对jar 进行签名:java.util.zip.ZipException: invalid entry compressed size (expected xxx but got xxx bytes)这样的提示。

这些问题主要是由于资源文件造成的,对于android开发来说应该检查res文件夹中的文件,逐个排查。这个问题可以通过升级系统的JDKJRE版本来解决。

3.安装apk过程中出现:INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES

这样的问题主要是签名冲突造成的,比如你使用了ADBdebug权限签名,但后来使用标准sign签名后再安装同一个文件会出现这样的错误提示,解决的方法只有先老老实实从手机上卸载原有版本再进行安装,而adb install -r参数也无法解决这个问题。adb uninstall 卸载原来的应用。


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chenzhen1080/article/details/73187569

智能推荐

asyncio 系列四、期程 — asyncio.Future_asyncio.future()-程序员宅基地

文章浏览阅读2.4k次。asyncio的期程官网链接:https://docs.python.org/zh-cn/3/library/asyncio-future.html#asyncio.Future其实期程指的是,classasyncio.Future返回的实例,官网翻译为期程。一、期程函数asyncio.isfuture(obj)如果obj为下面任意对象,返回Tru..._asyncio.future()

ArcGIS绘制研究区地图关键技巧_研究区域图-程序员宅基地

文章浏览阅读4k次,点赞11次,收藏62次。1、选择视图为布局视图该视图是用于绘制研究区域出图的视图。在该视图下,移动区域图,选择工具栏中的抓手,移动整个布局,选择箭头。_研究区域图

在DockerToolbox安装docker - Windows 10 各种坑 (吐血超全总结))-程序员宅基地

文章浏览阅读3.6k次,点赞4次,收藏18次。感谢各路大神的总结,花了一下午的时间终于解决了这个问题:因为是win10的家庭版所以要安装DockerToolbox:下载地址:http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/安装部署参考:https://www.jianshu.com/p/2aa5b05717c6<meta cha..._docker-machine.exe 双击没反应

OJ刷题---渊子赛马_渊子赛马 python-程序员宅基地

文章浏览阅读3.7k次。题目要求:输入代码:#include#includeusing namespace std;const int MAX=1000;int main(){ int n,a[MAX],b[MAX]; while(cin>>n&&n)//n为0时停止循环 { int i,j,sum,num;//sum是渊子赢得场数,num是他人赢_渊子赛马 python

Java final字段的作用-程序员宅基地

文章浏览阅读2.5k次。final关键字的作用: 1. 修饰变量: 被他修饰的变量不可改变。一旦赋了初值,就不能被重新赋值。 1 final int MAX_SPEED = 120; 2. 修饰方法:该方法不可被子类重写。但是可以被重载! 1 final void study(){} 3..._final字段的作用

vConsole手机端调试js_vconsole怎么看方法内代码-程序员宅基地

文章浏览阅读1.6k次。http://www.4u4v.net/shou-ji-qian-duan-wei-xin-kai-fa-diao-shi-shen-qi-vconsole-mo-ni-liu-lan-qi-kai-fa-zhe-gong-ju-diao-shi-js-di-shi-yong-fang-fa.html_vconsole怎么看方法内代码

随便推点

用户填完信息后关闭弹出框并刷新父页面 JS实现_填了信息刷新页面显示内容-程序员宅基地

文章浏览阅读5.3k次。背景介绍:有一个HTML页面,点击按钮(报名),弹出来一个框,在这个框里面填写一些信息,填完并且格式正确,就再弹出来一个小提示,报名成功。2秒后关掉小提示,关掉弹出的(报名)框,并且刷新那个HTML页面(父页面)。1,点击按钮,页面内弹出框,不跳转,遮罩整个页面,点其他区域,该框抖动。 这个是用art.dialog做2,(报名)框提交按钮用ajax做,在success.function里面加上par_填了信息刷新页面显示内容

Java 大小端模式_datainputstream.readdouble是小端存储的么-程序员宅基地

文章浏览阅读7.1k次。何谓Java 大小端模式呢?所谓大端模式:指数据的高位存储在内存的低字节位,数据的低位存储在内存的高字节位。这个思维有点像一个逆向的思维。所谓小端模式:指数据的低位存储在内存的低字节位,数据的高位存储在内存的高字节位。这个思维符合一般人的思维。问题的出现:在做毕设的时候,出现了下面的一个问题:在读一个wav文件的header,总共44个字节,如下:我使用DataInputStream去读取wav文..._datainputstream.readdouble是小端存储的么

红外遥控且自动避障的嵌入式智能小车系统_智能小车红外避障嵌入式程序-程序员宅基地

文章浏览阅读693次。AlphaBot2 智能车开发套件,包含一个基板 AlphaBot2-Base 和一个适配板(AlphaBot2-Ar、AlphaBot2-Pi、AlphaBot2-PiZero 三者之一)。本次实验使用树莓派作为开发平台,AlphaBot 作为开发载体,Python 作为开发语言,开发一种基于红外线遥控控制的、可自动避障的嵌入式智能小车系统。本次实验使用树莓派作为开发平台,AlphaBot 作为开发载体,Python 作为开发语言,开发一种基于红外线遥控控制的、可自动避障的嵌入式智能小车系统。_智能小车红外避障嵌入式程序

HIT 2022春 csapp 大作业_hit csapp 实验3 2022-程序员宅基地

文章浏览阅读126次。摘 要 本文旨在分析hello.c在linux系统中的整个生命周期,利用edb等反汇编工具,分析hello程序从hello.c开始,经历预处理,编译,汇编,链接等过程最终生成可执行文件的全过程。同时其中涉及了计算机系统的进程管理,储存管理,I/O管理。对计算机系统做到更加深刻的理解。关键词:Hello.c;预处理;编译;汇编;链接;进程管理;储存管理;IO(摘要0分,缺失-1分,根据内容精彩称都酌情加分0-1分)..._hit csapp 实验3 2022

单链表的头插法与尾插法详解_头插法和尾插法的数据输出的区别-程序员宅基地

文章浏览阅读1.4w次,点赞34次,收藏145次。创建单链表关于数据结构的入门,就是从顺序表和单链表开始。我们不讲顺序表,直接从单链表开始我们的数据结构和算法的学习之路。单链表就是一种特殊的结构体组合而成的数据结构,关于单链表的创建方法有很多种,但都大同小异。正如这幅图中所表示的那样,单链表就是由可能不连续的数据所组合而成的数据结构。 其中每个数据分为两部分,一部分是数据存储的位置,称为数据域,另外指针所存储的地方,称为指针域。typedef struct Node { int data; // 存储链表_头插法和尾插法的数据输出的区别

CentOS 7安装Python 3.6,pip3报错问题_centos 7 pip3 [root@root ~]# pip3 list traceback (-程序员宅基地

文章浏览阅读2k次。在CentOS 7上安装Python3.6.3后,在使用pip命令时报如下错误Traceback (most recent call last): File "/usr/Python3.6.3/lib/python3.6/site-packages/pip/basecommand.py", line 215, in main status = self.run(options,_centos 7 pip3 [root@root ~]# pip3 list traceback (most recent call last): fi

推荐文章

热门文章

相关标签