sharedUserId

来源:互联网 发布:js设置input字体颜色 编辑:程序博客网 时间:2024/05/21 03:59

如果两个apk在manifest中声明相同的sharedUserId,那么就可以配置成运行在同一进程中(当然也可以运行在不同进程中),这样就可以互相读取对方的文件。

系统中定义好的sharedUserId有:“android.uid.system”"android.media""android.uid.shared"“android.uid.test”“android.uid.phone”等等,

你也可以定义自己的值,就是一个字符串而已。


定义了相同的sharedUserId之后你就可以获得另外一个apk的context:例如call Context的createPackageContext(package_name, flag)方法拿到入参package的context,

拿到了对方的context之后就可以call 这个context的openFileInput和openFileOutput来读写另一个apk的文件,

也可以call 这个context的getResource方法来拿到另外一个apk的resource。注意这时候resource id比较难办,因为context虽然是对方的context,但是拿资源时传入的res id这个int却是自己的,例如

context.getResources().getString(R.string.share_test)

所以拿到对方的资源但未必是自己想要的资源,所以一般是对方把自己的res id写进另外一个文件,例如sharedPreference中,然后这边先读sharedPreference取到res id,然后再读取。


如果使用了sharedUserId,需要在android.mk中添加LOCAL_CERTIFICATE,它目前有四个value:

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

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

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

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


系统中所有使用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等。




其他一些杂事,Java混淆器就是用于打乱、优化字节码防止反编译的。

每个apk都需要数字签名,在开发阶段SDK会用一个调试证书为你签名,发布时要用自己的证书签名。




0 0
原创粉丝点击