一些有关系统APK的探索(一)

一些有关系统APK的探索(一),第1张

概述 刚开始工作时那段时间因工作需要所以研究了下系统的签名和电话、launcher 、联系人等系统APK,下面就是一些资料的整理。 Android权限共享UID和签名共享UID:安装在设备中的每一个Android包文件(.apk)都会被分配到一个属于自己的统一的Linux用户ID,并且为它创建一个沙

 刚开始工作时那段时间因工作需要所以研究了下系统的签名和电话、launcher 、联系人等系统APK,下面就是一些资料的整理。

 

AndroID权限共享UID和签名

  共享UID:

    安装在设备中的每一个AndroID包文件(.apk)都会被分配到一个属于自己的统一的linux用户ID,并且为它创建一个沙箱,以防止影响其他应用程序(或者其他应用程序影

    响它)。用户ID 在应用程序安装到设备中时被分配,并且在这个设备中保持它的永久性。通过Shared User ID,拥有同一个User ID的多个APK可以配置成运行在同一个进程

    中.所以默认就是可以互相访问任意数据. 也可以配置成运行成不同的进程, 同时可以访问其他APK的数据目录下的数据库和文件.就像访问本程序的数据一样.

    对于一个APK来说,如果要使用某个共享UID的话,必须做三步:

    1、在Manifest节点中增加androID:sharedUserID属性。

    2、在AndroID.mk中增加LOCAL_CERTIFICATE的定义。

    如果增加了上面的属性但没有定义与之对应的LOCAL_CERTIFICATE的话,APK是安装不上去的。提示错误是:Package com.test.MyTest has no signatures that match

    those in shared user androID.uID.system; ignoring!也就是说,仅有相同签名和相同sharedUserID标签的两个应用程序签名都会被分配相同的用户ID。例如所有和

    media/download相关的APK都使用androID.media作为sharedUserID的话,那么它们必须有相同的签名media。

    3、把APK的源码放到packages/apps/目录下,用mm进行编译。

    举例说明一下。

    系统中所有使用androID.uID.system作为共享UID的APK,都会首先在manifest节点中增加androID:sharedUserID="androID.uID.system",然后在AndroID.mk中增加  

    LOCAL_CERTIFICATE := platform。可以参见Settings等

    系统中所有使用androID.uID.shared作为共享UID的APK,都会在manifest节点中增加androID:sharedUserID="androID.uID.shared",然后在AndroID.mk中增加

    LOCAL_CERTIFICATE := shared。可以参见Launcher等

    系统中所有使用androID.media作为共享UID的APK,都会在manifest节点中增加androID:sharedUserID="androID.media",然后在AndroID.mk中增加LOCAL_CERTIFICATE

    := media。可以参见gallery等。

     另外,应用创建的任何文件都会被赋予应用的用户标识,并且正常情况下不能被其他包访问。当通过getSharedPreferences(String,int)、openfileOutput(String、

    int)或者openorCreate Database(String、int、sqliteDatabase.CursorFactory)创建一个新文件时,开发者可以同时或分别使用MODE_WORLD_READABLE和

    MODE_WORLD_RITEABLE标志允许其他包读/写此文件。当设置了这些标志后,这个文件仍然属于自己的应用程序,但是它的全局读/写和读/写权限已经设置,所以其他

    任何应用程序可以看到它。

  关于签名:

     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.

方法一(亲测有效)

  首先,AndroIDManifest.xml中manifest节点中加入androID:sharedUserID="androID.uID.system"这个属性

  1.1.进入<AndroID_Source_Path>/build/target/product/security,找到【platform.pk8】和【platform.x509.pem】系统密钥。

  1.2.进入<AndroID_Source_Path>/build/tools/signapk找到SignApk.java,运行javac编译成SignApk.class  

  在运行第三步的命令前,请在你当前的工作目录下新建如下结构的文件夹:  

  com.androID.signapk,然后将第二步编译生成的SignApk放入该目录下。或者也可以将SignApk.java的package声明删除后再运行javac编译。

  命令java com.androID.signapk.SignApk platform.x509.pem platform.pk8 input.apk output.apk不单可以对apk文件进行重签名,也可以对所有的zip文件进行重签名,包括ROM文件。

  1.3.执行命令
  java com.androID.signapk.SignApk platform.x509.pem platform.pk8 input.apk output.apk

  (!)1、补充【platform.pk8】和【platform.x509.pem】系统密钥(必须是要使用的 系统的)、目标apk 要放到<AndroID_Source_Path>/build/tools/signapk目录里
  2、在<AndroID_Source_Path>/build/tools/signapk目录下创建文件夹:com/androID/signapk
  3、把第二步编译生成的SignApk放入该目录下

 

方法二(未测试出来)

  eclipse源码编译,无需用make来编译(androID源码目录<D:/myandroID_mx27>):

  1、首先,AndroIDManifest.xml中manifest节点中加入androID:sharedUserID="androID.uID.system"这个属性

  2、用eclipse编译出apk(ClockSetting.apk)文件,但这个文件不能用,删掉meta-inf目录下的CERT.SF和CERT.RSA两个文件

  3、使用当前androID系统(androID系统可能不同)的platform密钥来重新给apk文件签名(可能还未用用户米要签名)。
    首先,找到密钥文件,在我的AndroID源码目录中的位置是"build/target/product/security",下面的platform.pk8和platform.x509.pem两个文件。
    然后,用AndroID提供的SignApk工具来签名,signapk的源代码是在"build/tools/signapk"下,这时得为下面的编译工作做些准备:
  <1>、编译jar
    命令行cd到signapk.java代码目录下,
    javac signapk.java
    获取SignApk$SignatureOutputStream.class和SignApk.class

    建立目录s/com/androID/signapk,将两个class文件放入目录下
    jar cvfm signapk.jar SignApk.mf -C s/ .
    注意:"s/"后面的"."前面有空格
    生成signapk.jar文件,得到了AndroID提供的签名程序signapk.jar
  <2>、用目标系统的platform密钥签名
    将platform.pk8和platform.x509.pem文件复制到"D:/myandroID_mx27/build/tools/signapk"目录下,即signapk.jar和SignApk.mf所在的目录。
    java -jar signapk.jar platform.x509.pem platform.pk8 D:/ClockSetting.apk D:/ClockSettingSigned.apk
    我的未签名(ClockSetting.apk)和已签名(ClockSettingSigned.apk)apk文件都放在D盘,这样就得到了用AndroID源码编译的文件。

  <3>、打开真机,安装:
    adb connect IP:Port (IP为真机IP地址,Port为端口)
    adb install D:/ClockSettingSigned.apk

 

总结

以上是内存溢出为你收集整理的一些有关系统APK的探索(一)全部内容,希望文章能够帮你解决一些有关系统APK的探索(一)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1115321.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存