Android apk如何签名,为什么签名
2014-06-13 14:28
375 查看
为什么要对android进行签名,android系统是如何进行签名的,以及签名时需要用到的几个文件来自哪?
1. android:sharedUserId 它的作用是什么?
拥有相同userid的多个apk可以配置成运行在同一个进程中。如果把程序的UID配置成“android.uid.system”,意味着该程序运行在系统进程中,这样就有权限来修改系统时间(就可以使用系统的某些权限了)
2. 配置了android:sharedUserId,程序就可以运行在系统进程中了吗?
答案是否定的,这时候apk根本不能被安装,log信息会提示“签名不符”,原因是程序要想运行在目标系统进程中还要有目标系统的“platform.pk8” 和“ platform.x509.pem” 两个文件,也就是说如果我们的apk要想安装到SamSung上,那么我们就必须拥有SamSung源码目录中的“platform.pk8” 和“ platform.x509.pem”,用这两个文件签名后的apk才真正可以放入系统进程中。
3. “platform.pk8” 和“ platform.x509.pem”位于系统源码目录中的什么位置呢?
它们位于"build\target\product\security"目录下。
4. 在对apk文件进行签名之前,我们需要做哪些准备工作?
三个必须的文件:
a. 目标系统的“platform.pk8” 和“ platform.x509.pem”两个文件。将这两个文件复制到F:/sign目录
b. 签名工具signapk.jar, 该文件位于android系统源代码out编译目录下。 同样将这个文件复制到F:/sign 目录下
我们的应用程序要做的配置:
c. 我们需要用压缩软件打开apk文件,删掉META-INF目录下的CERT.SF和CERT.RSA两个文件。
d. 在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"这个属性。
5. 好了,进行最后一步,对apk文件进行正式签名。
命令如下:
a. 进入F:sign目录
b. 输入命令: java-jar signapk.jar platform.x509.pem platform.pk8 test.apktestnew.apk
总结一句话:要想让我们的程序运行在系统进程中,有2步是必须要做的
首先:在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"这个属性
其次:对应用程序进行签名,签名所需文件必须要用“目标系统”编译后的文件
涉及到需要修改系统时间等操作,查了一下Android 的设置源码,里面的一个方法如下:
从上面的 Android 应用程序源码可以看出,修改系统日期需要为Calendar 设置年月日,然后通过调用 SystemClock.setCurrentTimeMillis 方法,设置系统日期,既然源码是这样写的,那我们也依样画葫芦来学一下吧,下面是通过使用datePicker修改日期的代码:
Tip:每次需要使用Calendar 必须获得一次实例,否则会它会使用上一次获取实例的日期格式,修改的时候可能会有点小问题
可是,照着上面的代码敲了之后,运行却出现如下的警告:
为大家详细说一下,先进入 Android 源码目录 F:\android_source\build\target\product\security ,具体机器目录自己选择。找到 【platform.pk8】和【platform.x509.pem】这两个文件,这里为了方便将它们复制到根目录,如:F:\sign 文件夹内,本来下一步就是需要打包jar 包了,不过里我们在android系统的源码内找到 out 编绎目录下
signApk.jar 这个包,可以自行打jar 包,把此jar 包放于F:\sign 文件内,打开dos 操作界面,定们到F:\sign,如下:
,接着输入如下命令:java -jar signapk.jar platform.x509.pem platform.pk8 test.apk
testnew.apk ,在dos 命令名如下图:
,其中set.apk 是指我们要签名的原始文件apk,后面setnew.apk 是指我们签名后输出的apk文件的名称
Tip:在签名的时候必须将set.apk事先用rar 文件打开,进入META-INF目录下,将CERT.SF和CERT.RSA这两个文件删除掉,再执行如上操作。到了这一步,程序己经可以正常安装了。
如果提示 FaiLure [INSTALL_FAILED_ALREADY_EXISTS],请使用如下命令,将应用程序移除:
,uninstall 后面字符是指应用程序所在的包名,再运行adb install [package name] 就可以安装成功。
Tip:不要忘了在你的manifest文件下注册android:sharedUserId="android.uid.system" 。
如果你照着如上的步骤一步一步写的话,保证可以成功修改系统的时间或者日期等操作。
在AndroidMenifest.xml中我们可以看到android:sharedUserId="android.uid.system"
但是有了这句后,就无法对sd卡进行读写操作,比如在SD卡中创建一个新文件夹,是创建不成功的。但是如果把android:sharedUserId="android.uid.system"注释掉,就可以在SD卡进行IO操作了。 在Settings中android:sharedUserId="android.uid.system"是不可少的,少了它很多Settings下应用直接开不了,或一开就报错。
解决方法一:
vold 模块里的 Volume.cpp文件
在调用doMount的语句里做一下修改~
doMount(devicePath, path, false, false, false,1000, 1015, 0702, true)
↓
doMount(devicePath, path, false, true, false,1000, 1015, 0002, true) 编译以后试试
解决方法二:
把SD卡操作的功能独立出去,做成一个独立的APK,然后在原项目中调用改功能就可以了。
1. android:sharedUserId 它的作用是什么?
拥有相同userid的多个apk可以配置成运行在同一个进程中。如果把程序的UID配置成“android.uid.system”,意味着该程序运行在系统进程中,这样就有权限来修改系统时间(就可以使用系统的某些权限了)
2. 配置了android:sharedUserId,程序就可以运行在系统进程中了吗?
答案是否定的,这时候apk根本不能被安装,log信息会提示“签名不符”,原因是程序要想运行在目标系统进程中还要有目标系统的“platform.pk8” 和“ platform.x509.pem” 两个文件,也就是说如果我们的apk要想安装到SamSung上,那么我们就必须拥有SamSung源码目录中的“platform.pk8” 和“ platform.x509.pem”,用这两个文件签名后的apk才真正可以放入系统进程中。
3. “platform.pk8” 和“ platform.x509.pem”位于系统源码目录中的什么位置呢?
它们位于"build\target\product\security"目录下。
4. 在对apk文件进行签名之前,我们需要做哪些准备工作?
三个必须的文件:
a. 目标系统的“platform.pk8” 和“ platform.x509.pem”两个文件。将这两个文件复制到F:/sign目录
b. 签名工具signapk.jar, 该文件位于android系统源代码out编译目录下。 同样将这个文件复制到F:/sign 目录下
我们的应用程序要做的配置:
c. 我们需要用压缩软件打开apk文件,删掉META-INF目录下的CERT.SF和CERT.RSA两个文件。
d. 在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"这个属性。
5. 好了,进行最后一步,对apk文件进行正式签名。
命令如下:
a. 进入F:sign目录
b. 输入命令: java-jar signapk.jar platform.x509.pem platform.pk8 test.apktestnew.apk
总结一句话:要想让我们的程序运行在系统进程中,有2步是必须要做的
首先:在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"这个属性
其次:对应用程序进行签名,签名所需文件必须要用“目标系统”编译后的文件
发布时 | 开发时 |
LG | Debug Eclipse |
Manufacture(厂商) | Google public key |
涉及到需要修改系统时间等操作,查了一下Android 的设置源码,里面的一个方法如下:
public void onDateSet(DatePicker view, int year, int month, int day) { Calendar c = Calendar.getInstance(); c.set(Calendar.YEAR, year); c.set(Calendar.MONTH, month); c.set(Calendar.DAY_OF_MONTH, day); long when = c.getTimeInMillis(); if (when / 1000 < Integer.MAX_VALUE) { SystemClock.setCurrentTimeMillis(when); } updateTimeAndDateDisplay(); }
从上面的 Android 应用程序源码可以看出,修改系统日期需要为Calendar 设置年月日,然后通过调用 SystemClock.setCurrentTimeMillis 方法,设置系统日期,既然源码是这样写的,那我们也依样画葫芦来学一下吧,下面是通过使用datePicker修改日期的代码:
canlendar = Calendar.getInstance(); year = datePicker.getYear(); month = datePicker.getMonth(); day = datePicker.getDayOfMonth(); canlendar.set(Calendar.YEAR, year); canlendar.set(Calendar.MONTH, month); canlendar.set(Calendar.DAY_OF_MONTH, day); long when = canlendar.getTimeInMillis(); if (when / 1000 < Integer.MAX_VALUE) { SystemClock.setCurrentTimeMillis(when); tv_date.setText(canlendar.get(Calendar.YEAR) + "/" + ((canlendar.get(Calendar.MONTH) + 1)) + "/" + canlendar.get(Calendar.DAY_OF_MONTH)); }
Tip:每次需要使用Calendar 必须获得一次实例,否则会它会使用上一次获取实例的日期格式,修改的时候可能会有点小问题
可是,照着上面的代码敲了之后,运行却出现如下的警告:
为大家详细说一下,先进入 Android 源码目录 F:\android_source\build\target\product\security ,具体机器目录自己选择。找到 【platform.pk8】和【platform.x509.pem】这两个文件,这里为了方便将它们复制到根目录,如:F:\sign 文件夹内,本来下一步就是需要打包jar 包了,不过里我们在android系统的源码内找到 out 编绎目录下
signApk.jar 这个包,可以自行打jar 包,把此jar 包放于F:\sign 文件内,打开dos 操作界面,定们到F:\sign,如下:
,接着输入如下命令:java -jar signapk.jar platform.x509.pem platform.pk8 test.apk
testnew.apk ,在dos 命令名如下图:
,其中set.apk 是指我们要签名的原始文件apk,后面setnew.apk 是指我们签名后输出的apk文件的名称
Tip:在签名的时候必须将set.apk事先用rar 文件打开,进入META-INF目录下,将CERT.SF和CERT.RSA这两个文件删除掉,再执行如上操作。到了这一步,程序己经可以正常安装了。
如果提示 FaiLure [INSTALL_FAILED_ALREADY_EXISTS],请使用如下命令,将应用程序移除:
,uninstall 后面字符是指应用程序所在的包名,再运行adb install [package name] 就可以安装成功。
Tip:不要忘了在你的manifest文件下注册android:sharedUserId="android.uid.system" 。
如果你照着如上的步骤一步一步写的话,保证可以成功修改系统的时间或者日期等操作。
在AndroidMenifest.xml中我们可以看到android:sharedUserId="android.uid.system"
但是有了这句后,就无法对sd卡进行读写操作,比如在SD卡中创建一个新文件夹,是创建不成功的。但是如果把android:sharedUserId="android.uid.system"注释掉,就可以在SD卡进行IO操作了。 在Settings中android:sharedUserId="android.uid.system"是不可少的,少了它很多Settings下应用直接开不了,或一开就报错。
解决方法一:
vold 模块里的 Volume.cpp文件
在调用doMount的语句里做一下修改~
doMount(devicePath, path, false, false, false,1000, 1015, 0702, true)
↓
doMount(devicePath, path, false, true, false,1000, 1015, 0002, true) 编译以后试试
解决方法二:
把SD卡操作的功能独立出去,做成一个独立的APK,然后在原项目中调用改功能就可以了。
相关文章推荐
- android apk签名(为什么 如何做 验证)
- android apk签名(为什么 如何做 验证)
- android apk签名(为什么 如何做签名)
- android apk签名(为什么 如何做 验证)
- Android apk如何签名,为什么签名
- 如何用Eclipse导出带签名的android apk
- Android 应用程序(APK) 如何获得系统签名权限 强制关闭程序(后台进程)
- android如何给apk重新签名
- 如何给Android的apk重新签名
- Android应用程序签名相关的理论知识,包括:什么是签名、为什么要给应用程序签名、如何给应用程序签名
- Android应用程序签名相关的理论知识,包括:什么是签名、为什么要给应用程序签名、如何给应用程序签名等。
- 如何判断 两个不同包名的 Android 应用的 Apk 签名是否一致
- 如何对Android apk文件签名
- Android平台上如何让应用程序获得系统权限以及如何使用platform密钥给apk签名
- 如何在Android市场进行应用认领与apk签名
- Android 如何对apk文件进行反编译以及重新打包签名 标签: apktoolandroid反编译jebSmali2Java 2016-05-10 16:00 3897人阅读 评论(0) 收藏
- Android 如何读取APK 签名信息
- Android 应用程序(APK) 如何获得系统签名权限 强制关闭程序(后台进程)
- 如何利用Eclipse工具打包签名AndroidApk文件
- 如何将Android 源码中编译出的apk进行自己的签名