让不同的应用apk跑在一个进程process里

一 WHAT?

就是让不同的应用程序共享一个进程。这篇文章纯粹是API Guids里一段话的注脚:

You can also set android:process so that components of different applications run in the same process—provided that the applications share the same Linux user ID and are signed with the same certificates.

http://developer.android.com/guide/components/processes-and-threads.html

二 HOW?

三部曲:
1.manifest 文件中 application节点下的process属性 相同
        2.manifest 文件中  sharedUserId 属性相同
        3.使用同一个数字签名

以一个应用的activity开启另一个应用的服务为例:
HelloWorld的配置文件:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.allenffl.helloworld"
    android:versionCode="1"
    android:versionName="1.0"
      android:sharedUserId="com.allen.ffl" >

AIDLService的配置文件:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.allenffl.aidlserver"
    android:versionCode="1"
    android:versionName="1.0"
    android:sharedUserId="com.allen.ffl"
     >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        android:process="com.allenffl.helloworld" >

两个应用打包使用同一个key:HelloWorldKey.生成相同的数字签名:

AIDLServer.apk
MD5 : FE:00:35:B0:D9:87:6F:7B:D7:A6:95:D7:12:3D:0C:9F
SHA1: FA:DF:96:82:74:AC:4E:E1:5E:39:D8:B0:D2:AF:48:23:34:42:E2:AD

HelloWorld.apk
MD5 : FE:00:35:B0:D9:87:6F:7B:D7:A6:95:D7:12:3D:0C:9F
SHA1: FA:DF:96:82:74:AC:4E:E1:5E:39:D8:B0:D2:AF:48:23:34:42:E2:AD

注意:直接在adt里往模拟器或真机运行也可以,是因为bin目录下的apk默认采用了debug签名,两个apk采用的key都是

/Documents and Settings/liuhua/.Android/debug.keystore,其中的liuhua是你电脑的用户名

为了验证这两个应用跑在一个进程里,我们另开一个activity查看进程:

@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		if (savedInstanceState == null) {
			getFragmentManager().beginTransaction()
					.add(R.id.container, new PlaceholderFragment()).commit();
		}
		//查看进程 两个apk 共享一个进程
		ActivityManager am = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
		List<RunningAppProcessInfo> processes = am.getRunningAppProcesses();
		for (RunningAppProcessInfo processInfo:processes) {
			if (processInfo.processName.equals("com.allenffl.helloworld")) {
				System.out.println(processInfo.processName+"--uid-"+processInfo.uid+"---");
			}
		}
		//查看安装包 同一个进程里跑了几个包
		PackageManager pm = getPackageManager();
		String[] packagesForUid = pm.getPackagesForUid(10112);
		for (int i = 0; i < packagesForUid.length; i++) {
			System.out.println(packagesForUid[i]);
		}
		try {
			PackageInfo packageInfo = pm.getPackageInfo("com.allenffl.aidlserver", PackageManager.GET_SERVICES);
			System.out.println("aidlserver-sharedUserId-"+packageInfo.sharedUserId);
			PackageInfo packageInfo2 = pm.getPackageInfo("com.allenffl.helloworld", PackageManager.GET_SERVICES);
			System.out.println("helloworld-sharedUserId-"+packageInfo2.sharedUserId);
		} catch (NameNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
输出结果:

05-25 18:15:22.175: I/System.out(15627): com.allenffl.helloworld--uid-10112---
05-25 18:15:22.175: I/System.out(15627): com.allenffl.aidlserver
05-25 18:15:22.175: I/System.out(15627): com.allenffl.helloworld
05-25 18:15:22.175: I/System.out(15627): aidlserver-sharedUserId-com.allen.ffl
05-25 18:15:22.175: I/System.out(15627): helloworld-sharedUserId-com.allen.ffl


可以看出进程com.allenffl.helloworld有两个包。


三 WHY?

这样做的好处在于,轻松实现了两个应用的数据共享。



参考资料:

【AndroidManifest.xml详解】Manifest属性之sharedUserId、sharedUserLabel

http://blog.csdn.net/wirelessqa/article/details/8581652

Android通过共享用户ID来实现多Activity进程共享

http://mypyg.iteye.com/blog/720406

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值