build/target/product/security目录中有四组默认签名供Android.mk在编译APK使用:

1、testkey:普通APK,默认情况下使用。

2、platform:该APK完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,这种方式编译出来的APK所在进程的UID为system。

3、shared:该APK需要和home/contacts进程共享数据。

4、media:该APK是media/download系统中的一环。

应用程序的Android.mk中有一个LOCAL_CERTIFICATE字段,由它指定用哪个key签名,未指定的默认用testkey.

Settings.apk就是platform级别的签名,系统级应用都应该使用这个签名


Android签名实战:

我们知道,如果一个应用程序想要使用系统的方法,那么就需要给这个应用程序签名,相当于授权。
给程序进行platform、media、shared签名的方法分别如下:
(1)platform签名:
AndroidManifest.xml的manifest节点中添加 android:sharedUserId=”android.uid.system”,
Android.mk中增加  LOCAL_CERTIFICATE := platform
(2)shared签名:
AndroidManifest.xml的manifest节点中增加android:sharedUserId=”android.uid.shared”,
Android.mk中增加LOCAL_CERTIFICATE := shared
(3)media签名:
AndroidManifest.xml的manifest节点中增加 android:sharedUserId=”android.media”,
Android.mk中增加 LOCAL_CERTIFICATE := media
由于需要在Android.mk中增加信息,我们暂时在Android源码中编译生成apk包。具体的操作方法如下:
(1)在Android源码中选择一个APK程序,作为需要签名的程序,我选择/xxx/packages/apps下的一个程序,copy并更名为SignTest。
(2)将当前APK应用添加platform签名,首先在AndroidManifest.xml文件中添加信息,如:
package=”com.mediatek.weather3dwidget” android:sharedUserId=”android.uid.shared”>
(3)在Android.mk文件中添加信息,如:
LOCAL_EMMA_COVERAGE_FILTER := +com.mediatek.weather3dwidget.* -com.mediatek.weather3dwidget.R
LOCAL_CERTIFICATE := shared
LOCAL_RESOURCE_DIR += (LOCALPATH)/../../../frameworks/opt/ngin3d/inflater/res(LOCALPATH)/../../../frameworks/opt/ngin3d/inflater/res(LOCAL_PATH)/res
(4)进行模块编译,生成一个apk,本示例为SignTest.apk
(5)针对本apk进行platform签名,可以通过签名系统,也可以通过eclipse,或者通过相应的工具。
(6)如果将该应用放置在别的系统中,则会报“INSTALL_FAILED_SHARED_USER_INCOMPATIBLE”的错误,这是签名不一致导致的。

Android源码编译中Android.mk文件中的 LOCAL_CERTIFICATE和 AndroidManifest的sharedUserId应用:

Android中如何修改系统时间(应用程序获得系统权限)
在 android 的API中有提供 SystemClock.setCurrentTimeMillis()函数来修改系统时间,可惜无论你怎么调用这个函数都是没用的,无论模拟器还是真机,在logcat中总会得到”Unable to open alarm driver: Permission denied “.这个函数需要root权限或者运行与系统进程中才可以用。
本来以为就没有办法在应用程序这一层改系统时间了,后来在网上搜了好久,知道这个目的还是可以达到的。
第一个方法简单点,不过需要在Android系统源码的环境下用make来编译:
1. 在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId=”android.uid.system”这个属性。
2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行
3. 使用mm命令来编译,生成的apk就有修改系统时间的权限了。
第二个方法麻烦点,不过不用开虚拟机跑到源码环境下用make来编译:
1. 同上,加入android:sharedUserId=”android.uid.system”这个属性。
2. 使用eclipse编译出apk文件,但是这个apk文件是不能用的。
3. 用压缩软件打开apk文件,删掉META-INF目录下的CERT.SF和CERT.RSA两个文件。
4. 使用目标系统的platform密钥来重新给apk文件签名。这步比较麻烦,首先找到密钥文件,在我的Android源码目录中的位置是”build\target\product\security”,下面的platform.pk8和platform.x509.pem两个文件。然后用Android提供的Signapk工具来签名,signapk的源代码是在”build\tools\signapk”下,用法为”signapk platform.x509.pem platform.pk8 input.apk output.apk”,文件名最好使用绝对路径防止找不到,也可以修改源代码直接使用。
这样最后得到的apk和第一个方法是一样的。
最后解释一下原理,首先加入android:sharedUserId=”android.uid.system”这个属性。通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中。那么把程序的UID配成android.uid.system,也就是要让程序运行在系统进程中,这样就有权限来修改系统时间了。
只是加入UID还不够,如果这时候安装APK的话发现无法安装,提示签名不符,原因是程序想要运行在系统进程中还要有目标系统的platform key,就是上面第二个方法提到的platform.pk8和platform.x509.pem两个文件。用这两个key签名后apk才真正可以放入系统进程中。第一个方法中加入LOCAL_CERTIFICATE := platform其实就是用这两个key来签名。
这也有一个问题,就是这样生成的程序只有在原始的Android系统或者是自己编译的系统中才可以用,因为这样的系统才可以拿到platform.pk8 和platform.x509.pem两个文件。要是别家公司做的Android上连安装都安装不了。试试原始的Android中的key来签名,程序在模拟器上运行OK,不过放到G3上安装直接提示”Package … has no signatures that match those in shared user android.uid.system”,这样也是保护了系统的安全。
最最后还说下,这个android:sharedUserId属性不只可以把apk放到系统进程中,也可以配置多个APK运行在一个进程中,这样可以共享数据,应该会很有用的。

LOCAL_CERTIFICATE作用相关推荐

  1. 2022-10-25 系统app提示Signature mismatch for shared user: SharedUserSetting,开机后无法安装

    一.现在我想做个系统级的app, 需要有android.permission.WRITE_SECURE_SETTINGS,AndroidManifest.xml里面添加android:sharedUs ...

  2. Android.bp入门教程

    Soong 编译系统 在 Android 7.0 发布之前,Android 仅使用 GNU Make 描述和执行其构建规则.Make 构建系统得到了广泛的支持和使用,但在 Android 层面变得缓慢 ...

  3. 国产平台之T507 开发板Android 安全策略漫谈 -飞凌嵌入式

    硬件平台:飞凌嵌入式 OKT507-C开发板 操作系统:Android10.0 飞凌嵌入式 T507 开发板 Android系统版本为Android10.0,默认开启了SELinux.基于MAC访问控 ...

  4. Android 应用(2)——全志T507安全策略

    平台:T507 系统:Android10.0 T507 Android系统版本为Android10.0,默认开启了SELinux.基于MAC访问控制模型的SElinux,可以更好地保护我们的Andro ...

  5. android:sharedUserId作用

    前言 Android给每个APK进程分配一个单独的空间,manifest中的userid就是对应一个分配的Linux用户ID,并且为它创建一个沙箱,以防止影响其他应用程序(或者被其他应用程序影响). ...

  6. Object的finalize()方法的作用是否与C++的析构函数作用相同

    Object的finalize()方法的作用是否与C++的析构函数作用相同 public class Finalization {private static Finalization finaliz ...

  7. 浅显易懂 Makefile 入门 (02)— 普通变量和自动变量定义、使用($@、$^、$< 作用)、变量覆盖 override、变量的来源 origin

    1. 变量的定义 Makefile 文件中定义变量的基本语法如下: 变量的名称=值列表 变量的名称可以由大小写字母.阿拉伯数字和下划线构成.等号左右的空白符没有明确的要求,因为在执行 make 的时候 ...

  8. 【B/S实践】解决:vs中修改样式表后不起作用的问题

    缓存,有好多,cpu和内存之间的三级缓存,浏览器内的缓存! 缓存是因为速率不对等,通过缓存来加速内容的显示! 今天我在敲牛腩的时候遇到一个问题,找了半小时,才发现是缓存导致的问题! 试着运行aspx文 ...

  9. 卷积神经网络之卷积计算、作用与思想 深度学习

    博客:blog.shinelee.me | 博客园 | CSDN 卷积运算与相关运算 在计算机视觉领域,卷积核.滤波器通常为较小尺寸的矩阵,比如3×33×3.从这个角度看,多层卷积是在进行逐层映射,整 ...

  10. 机器学习——标准化/归一化的目的、作用和场景

    对每个特征进行归一化处理,使得每个特征的取值缩放到0~1之间.这样做有两个好处: 模型训练更高效. 特征前的权重大小可代表该变量对预测结果的贡献度(因为每个特征值本身的范围相同). (一)归一化的作用 ...

最新文章

  1. MyBatis:参数传递 [转]
  2. 文巾解题 525. 连续数组
  3. 【机器学习】怎样将Embedding融入传统机器学习框架?
  4. 5G NR基础参数及帧结构
  5. win32程序测试键盘钩子
  6. 《App后台开发运维与架构实践》第2章 App后台基础技术
  7. idm 假冒_IDM出现假冒序列号问题解决
  8. f4 stm32 神经网络_STM32神经网络开发工具箱将AI技术引入边缘和节点嵌入式设备...
  9. ACM/ICPC 之 BFS+状态压缩(POJ1324(ZOJ1361))
  10. 进阶之路(基础篇) - 003 I/O的模拟的读取
  11. Interesting Finds: 2008.01.04
  12. Matlab绘制图像后在指定点绘制坐标线以及标注变量
  13. Create a Search Scope for a Sharepoint 2010 List or Library
  14. JavaWeb开发——JSP技术
  15. Ubuntu17.04解决博通网卡问题
  16. 更改linux键盘布局,无法更改Centos 7上的键盘布局
  17. MATLAB使用GPU加速计算
  18. 服务器虚拟机移动,从物理服务器迁移到虚拟机的两大方案
  19. Cocos2dx-- 聊天系统之富文本(RichText)与字体对齐
  20. 使用motan+Zookeeper构建RPC服务

热门文章

  1. Android安卓 自定义mapbox地图比例尺
  2. 第五次打卡 模型融合
  3. js获取USB扫码枪数据
  4. win10计算机管理界面模糊,Win10电脑屏幕显示模糊
  5. 用计算机如何扫描文件,打印机扫描文件到电脑方法教程
  6. ChIP-Seq,MeRIP-seq峰(peak),eccDNA等染色体分布可视化
  7. 万字 常用设计软件大盘点|如何选择自己最适合的软件【建议收藏】
  8. 2020年岁末的年终总结——来自一位70后的大龄程序员的总结分享
  9. 【基金量化研究系列】大类资产配置研究(六)——多资产风险平价策略
  10. 面试前的准备和注意事项(非常详细)