Android应用程序获取系统签名的方法
2014-03-05 14:03
351 查看
在Android应用程序开发过程中,经常会碰到要获取系统权限的问题。例如:
但是如果使用eclipse等开发工具,即使在AndroidManifest.xml中添加了这些权限,一样无法获取,因为无法获取系统的签名认证。
要获取系统签名认证有两种方法:
1、在源码中编译
2、手动导入系统签名
获取了特定的系统签名,只能在特定的系统中运行,换了系统,还是不可以运行。不同厂家的系统签名会有差别。
我们以Settings为例来看一下这两种方法。
1、在源码中编译
在源码中编译应用程序比较方便,不过需要在Linux环境下执行。步骤如下:
①
在AndroidManifest.xml文件中添加属性sharedUserId
找到Manifest节点中加入一个属性 android:sharedUserId="android.uid.system"
,例如:
②
修改Android.mk文件
Android.mk文件时在Linux下用交叉编译连编译的时候才用到的,eclipse中不会自动生成,Android.mk的编写方式在这里就不再赘述。我们在Android.mk文件中添加LOCAL_CERTIFICATE
:= platform这一行。例如:
③
把项目放到源码下,用mm命令编译。
编译命令在这里就不再详细解释。
2、手动添加系统签名
手动添加系统签名较为麻烦,但不必进入Linux环境,在Windows环境下就能操作。步骤如下:
①
在AndroidManifest.xml文件中添加属性sharedUserId
同前一种方法一样,找到Manifest节点中加入一个属性 android:sharedUserId="android.uid.system"。
② 使用eclipse导出未签名的apk
如图所示,使用Android Tools导出未签名的apk包。
填写好apk文件名,然后保存。
如果出现以下提示,是提示你未签名程序的局限性,直接点击OK就可以了。
③ 编译signapk.jar
如果已有此jar包,可以略过此步骤。
signapk.jar通过编译源码中build/tools/signapk项目得到。由于本人的系统源码在Linux上,我们在Linux环境中演示编译方法,Windows环境中编译方法与此一样。
我把源码放到了Document目录下,所以先进入到signapk目录。
然后使用javac命令编译得到SignApk$SignatureOutputStream.class和SignApk.class。
在此目录下创建新目录com/android/signapk/,并将这两个文件复制进去。
进入新建的目录,并新建SignApk.mf,写入以下一行内容:
Main-Class: com.android.signapk.SignApk
然后执行命令 jar cvfm signapk.jar SignApk.mf com
,就得到了signapk.jar文件
④ 获得platform.x509.pem和platform.pk8两个文件
这两个文件在系统源码目录 build/target/product/security/ 下,拷贝出来。这是两个文件是获取签名的关键。注意只有运行有此源码编译的系统的设备才能识别这个系统签名,其他系统不行。
⑤ 手动导入系统签名
将 signapk.jar、platform.x509.pem、platform.pk8 和未签名的apk放到一个文件夹下。为了方便演示,我都放到E:盘根目录下。
切换当前目录到文件所在目录,然后执行命令:
java -jar signapk.jar platform.x509.pem platform.pk8 未签名的APK文件名 签名后的APK文件名
例如:
这样就得到了签名后的APK文件。
THE END
<uses-permission android:name="android.permission.STATUS_BAR" /> <uses-permission android:name="android.permission.MANAGE_USB" /> <uses-permission android:name="android.permission.SET_POINTER_SPEED" />
但是如果使用eclipse等开发工具,即使在AndroidManifest.xml中添加了这些权限,一样无法获取,因为无法获取系统的签名认证。
要获取系统签名认证有两种方法:
1、在源码中编译
2、手动导入系统签名
获取了特定的系统签名,只能在特定的系统中运行,换了系统,还是不可以运行。不同厂家的系统签名会有差别。
我们以Settings为例来看一下这两种方法。
1、在源码中编译
在源码中编译应用程序比较方便,不过需要在Linux环境下执行。步骤如下:
①
在AndroidManifest.xml文件中添加属性sharedUserId
找到Manifest节点中加入一个属性 android:sharedUserId="android.uid.system"
,例如:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" coreApp="true" package="com.android.settings" android:sharedUserId="android.uid.system" android:versionCode="23" android:versionName="0.0.23 Build-CHT" >
②
修改Android.mk文件
Android.mk文件时在Linux下用交叉编译连编译的时候才用到的,eclipse中不会自动生成,Android.mk的编写方式在这里就不再赘述。我们在Android.mk文件中添加LOCAL_CERTIFICATE
:= platform这一行。例如:
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := Settings LOCAL_CERTIFICATE := platform LOCAL_PROGUARD_FLAG_FILES := proguard.flags
③
把项目放到源码下,用mm命令编译。
编译命令在这里就不再详细解释。
2、手动添加系统签名
手动添加系统签名较为麻烦,但不必进入Linux环境,在Windows环境下就能操作。步骤如下:
①
在AndroidManifest.xml文件中添加属性sharedUserId
同前一种方法一样,找到Manifest节点中加入一个属性 android:sharedUserId="android.uid.system"。
② 使用eclipse导出未签名的apk
如图所示,使用Android Tools导出未签名的apk包。
填写好apk文件名,然后保存。
如果出现以下提示,是提示你未签名程序的局限性,直接点击OK就可以了。
③ 编译signapk.jar
如果已有此jar包,可以略过此步骤。
signapk.jar通过编译源码中build/tools/signapk项目得到。由于本人的系统源码在Linux上,我们在Linux环境中演示编译方法,Windows环境中编译方法与此一样。
我把源码放到了Document目录下,所以先进入到signapk目录。
然后使用javac命令编译得到SignApk$SignatureOutputStream.class和SignApk.class。
在此目录下创建新目录com/android/signapk/,并将这两个文件复制进去。
进入新建的目录,并新建SignApk.mf,写入以下一行内容:
Main-Class: com.android.signapk.SignApk
然后执行命令 jar cvfm signapk.jar SignApk.mf com
,就得到了signapk.jar文件
④ 获得platform.x509.pem和platform.pk8两个文件
这两个文件在系统源码目录 build/target/product/security/ 下,拷贝出来。这是两个文件是获取签名的关键。注意只有运行有此源码编译的系统的设备才能识别这个系统签名,其他系统不行。
⑤ 手动导入系统签名
将 signapk.jar、platform.x509.pem、platform.pk8 和未签名的apk放到一个文件夹下。为了方便演示,我都放到E:盘根目录下。
切换当前目录到文件所在目录,然后执行命令:
java -jar signapk.jar platform.x509.pem platform.pk8 未签名的APK文件名 签名后的APK文件名
例如:
这样就得到了签名后的APK文件。
THE END
相关文章推荐
- android 调用系统方法获取应用程序信息 如缓存大小
- 获取android系统中所有应用程序
- Android杂谈--获取系统及应用程序(PackageManager)
- Android4.4以上系统根据Uri正确获取文件路径的方法
- Android APK获取平台系统签名权限
- 如何使Android应用程序获取系统权限【转】
- 如何使Android应用程序获取系统权限【转】
- Android中如何获取系统应用程序列表与AndroidManifest.xml信息
- Android获取apk签名信息(举例说明java反射调用方法步骤)
- 详解Android获取系统内核版本的方法与实现代码
- Android 获取签名、公钥方法
- 获取Android系统中应用程序的信息——PackageManger(一)
- Android应用程序永久获取root权限方法
- cocos2d-x在win32和iOS、android下获取当前系统时间的方法
- 全面的Android文件目录解析和获取方法(包含对6.0系统的说明) simen201310 2016-08-28 15:52:12 浏览3290 评论0 移动开发与客户端 android 摘要
- Android获取系统外置存储卡路径的方法
- Android实现获取应用程序相关信息列表的方法
- Android获取SD卡总容量,可用大小,机身内存总容量及可用大小的系统方法
- Android应用程序获取ROOT权限的方法(android中如何通过代码检测是否有root权限?)
- Android中如何获取系统中所有的应用程序