首先声明: 以下操作均在Nexus1/android2.2平台上实现。
这里要区别两个概念:
* Linux uid:这是一个无符号整数;
* Android uid: 这体现为一个sharedUserId字符串。
本文所说的uid已确定是指Linux uid已确定。
------------------------------------------------------------------------------------------------------------------------------------
Android内定的UID/AID定义在以下文件:
-------------------------------------------------------------------------------------------------------------------------------------
在开发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属性来引用之,如:
具体步骤如下:
首先,一定不要先安装你的已确定uid的应用;
然后,先从手机中拉出文件/data/system/packages.xml:
接着在拉出的文件中添加共享用户名,可在末尾添加(在末行</packages>之前,这里所引用的证书是用户system的,即index="0"):
(注:以下的引号是中文的,因为无法输入英文引号。报怨一下新浪:(
<shared-user name="android.uid.wifi"userId="1010">
</shared-user>
权限多少视情况而定, 一般无关紧要。
然后将此文件再放回手机的原目录下(最好先把原文件改名备份),再sync一下以确保已经保存。
随后正常关机,再开机。此时可按以上步骤检查一下,以确保新的共享用户名已经添加进packages.xml文件中。
然后,确保你的应用使用了刚建立的共享用户名(在AndroidManifest.xml文件中),然后编译生成包,最后安装。装完后再检查一下(ls-l /data/app/YourPackageName),看你的应用的Linux uid是不是就是你想要的Linuxuid呀。
附:可用如下命令检查生成包的签名:
附: (感谢国大侠的贡献!)
如果要把此应用放入system.img中,需要涉及到文件common.mk或你的PRODUCT_NAME对应的.mk文件,这些文件由buildspec.mk引用,都在以下目录中(下例是针对cyanogen的定制版本):
找到这其中一个文件,修改其中的PRODUCT_PACKAGES变量,加入你的包名,重新编译即可: