现在的位置: 首页 > 综合 > 正文

Android上怎样创建指定 Linux uid的应用(& 放入system.img)?

2018年04月17日 ⁄ 综合 ⁄ 共 2244字 ⁄ 字号 评论关闭
 

首先声明: 以下操作均在Nexus1/android2.2平台上实现。

这里要区别两个概念:

* Linux uid:这是一个无符号整数;

* Android uid: 这体现为一个sharedUserId字符串。

本文所说的uid已确定是指Linux uid已确定。

------------------------------------------------------------------------------------------------------------------------------------
Android内定的UID/AID定义在以下文件:

    system/core/include/private/android_filesystem_config.h    :  比如 AID_SYSTEM, AID_SHELL
    frameworks/base/core/java/android/os/Process.java           :  比如 SYSTEM_UID,SHEL_UID
-------------------------------------------------------------------------------------------------------------------------------------

在开发Android应用时,可能需要事先确定某应用的Linux uid,有以下两种情况:

1)此uid对应的共享用户名已经存在(很可能已被系统内的某些应用使用)。例如,'system'用户,其共享用户名为"android.uid.system",且其Linux uid=1000;

2) 此uid对应的共享用户名尚未存在。

 

 

以下主要针对后者。

例如,要使得应用安装后能获得WIFI_UID, 即1010。这个uid还没有共享用户名(参考HTC hero Androidv2.1)。因此,我们需要为它建立一个共享用户名(如"android.uid.my_wifi"),且在你的应用的AndroidManifest.xml文件中添加sharedUserId属性来引用之,如:

    <manifest  xmlns:android="http://schemas.android.com/apk/res/android"

            package="com.myorg.wifi"
           android:sharedUserId="android.uid.my_wifi"

    >

 

具体步骤如下:

首先,一定不要先安装你的已确定uid的应用;

然后,先从手机中拉出文件/data/system/packages.xml:

    adb pull/data/system/pacakages.xml .

接着在拉出的文件中添加共享用户名,可在末尾添加(在末行</packages>之前,这里所引用的证书是用户system的,即index="0"):

 

(注:以下的引号是中文的,因为无法输入英文引号。报怨一下新浪:(  。)

 

<shared-user name="android.uid.wifi"userId="1010">

   <sigs count="1">

    <cert index="0"/>

   </sigs>

    <perms>

     <item name="android.permission.ACCESS_WIFI_STATE"/>

     <item name="android.permission.CHANGE_WIFI_STATE"/>

     <item name="android.permission.WAKE_LOCK"/>

    </perms>

</shared-user>

 

权限多少视情况而定, 一般无关紧要。

然后将此文件再放回手机的原目录下(最好先把原文件改名备份),再sync一下以确保已经保存。

随后正常关机,再开机。此时可按以上步骤检查一下,以确保新的共享用户名已经添加进packages.xml文件中。

 

然后,确保你的应用使用了刚建立的共享用户名(在AndroidManifest.xml文件中),然后编译生成包,最后安装。装完后再检查一下(ls-l /data/app/YourPackageName),看你的应用的Linux uid是不是就是你想要的Linuxuid呀。

 

 

附:可用如下命令检查生成包的签名:

    jarsigner-verify -verbose -certs YourPackageName.apk 

   看是否包含了正确的签名。

 

 

附: (感谢国大侠的贡献!)

如果要把此应用放入system.img中,需要涉及到文件common.mk或你的PRODUCT_NAME对应的.mk文件,这些文件由buildspec.mk引用,都在以下目录中(下例是针对cyanogen的定制版本):

   $SRC_ROOT/vendor/cyanogen/products/

找到这其中一个文件,修改其中的PRODUCT_PACKAGES变量,加入你的包名,重新编译即可:

    cd$ANDROID_SRC_ROOT

    build/envsetup.sh

   lunch cyanogen_passion-eng           #参数视你的PRODUCT而定

 

   makesd

抱歉!评论已关闭.