junit.framework.AssertionFailedError: com.google.android.xts.deviceowner.UserManagementTest failed.
at junit.framework.Assert.fail(Assert.java:50)
at junit.framework.Assert.assertTrue(Assert.java:20)
at com.google.android.xts.devicepolicy.DeviceOwnerTest.executeDeviceOwnerTest(DeviceOwnerTest.java:155)
at com.google.android.xts.devicepolicy.DeviceOwnerTest.testUserManagement(DeviceOwnerTest.java:119)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at junit.framework.TestCase.runTest(TestCase.java:168)
at junit.framework.TestCase.runBare(TestCase.java:134)
at com.android.tradefed.testtype.DeviceTestResult$1.protect(DeviceTestResult.java:81)
at com.android.tradefed.testtype.DeviceTestResult.runProtected(DeviceTestResult.java:56)
at com.android.tradefed.testtype.DeviceTestResult.run(DeviceTestResult.java:85)
at junit.framework.TestCase.run(TestCase.java:124)
at com.android.tradefed.testtype.DeviceTestCase.run(DeviceTestCase.java:117)
at com.android.xts.tradefed.testtype.JarHostTest$TestRunnable.run(JarHostTest.java:261)
at com.android.tradefed.util.RunUtil$RunnableNotifier.run(RunUtil.java:378)
03-28 11:57:08.095 I/art (26318): Explicit concurrent mark sweep GC freed 46(1872B) AllocSpace objects, 0(0B) LOS objects, 39% free, 1994KB/3MB, paused 444us total 22.660ms
03-28 11:57:08.096 I/TestRunner(26318): failed: testCreateAndInitializeUser(com.google.android.xts.deviceowner.UserManagementTest)
03-28 11:57:08.096 I/TestRunner(26318): ----- begin exception -----
03-28 11:57:08.097 D/SettingsInterface( 2267): from settings cache , name = multi_sim_data_call , value = null
03-28 11:57:08.099 D/SettingsInterface( 2267): from settings cache , name = multi_sim_data_call , value = null
03-28 11:57:08.101 I/TestRunner(26318):
03-28 11:57:08.101 I/TestRunner(26318): junit.framework.AssertionFailedError
03-28 11:57:08.101 I/TestRunner(26318): at junit.framework.Assert.fail(Assert.java:48)
03-28 11:57:08.101 I/TestRunner(26318): at junit.framework.Assert.assertTrue(Assert.java:20)
03-28 11:57:08.101 I/TestRunner(26318): at junit.framework.Assert.assertTrue(Assert.java:27)
03-28 11:57:08.101 I/TestRunner(26318): at com.google.android.xts.deviceowner.UserManagementTest.testCreateAndInitializeUser(UserManagementTest.java:102)
03-28 11:57:08.101 I/TestRunner(26318): at java.lang.reflect.Method.invoke(Native Method)
03-28 11:57:08.101 I/TestRunner(26318): at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214)
03-28 11:57:08.101 I/TestRunner(26318): at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:199)
03-28 11:57:08.101 I/TestRunner(26318): at junit.framework.TestCase.runBare(TestCase.java:134)
03-28 11:57:08.101 I/TestRunner(26318): at junit.framework.TestResult$1.protect(TestResult.java:115)
03-28 11:57:08.101 I/TestRunner(26318): at junit.framework.TestResult.runProtected(TestResult.java:133)
03-28 11:57:08.101 I/TestRunner(26318): at junit.framework.TestResult.run(TestResult.java:118)
03-28 11:57:08.101 I/TestRunner(26318): at junit.framework.TestCase.run(TestCase.java:124)
03-28 11:57:08.101 I/TestRunner(26318): at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191)
03-28 11:57:08.101 I/TestRunner(26318): at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176)
03-28 11:57:08.101 I/TestRunner(26318): at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555)
03-28 11:57:08.101 I/TestRunner(26318): at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1893)
03-28 11:57:08.101 I/TestRunner(26318): ----- end exception -----
public void testCreateAndRemoveUser() {
return;
UserManager userManager = (UserManager)mContext.getSystemService("user");
assertEquals("Must start test with 1 user", 0x1, userManager.getUserCount());
mUserHandle = mDevicePolicyManager.createUser(getWho(), "Test User");
assertNotNull(mUserHandle);
assertEquals(0x2, userManager.getUserCount());
assertTrue(mDevicePolicyManager.removeUser(getWho(), mUserHandle));
assertEquals(0x1, userManager.getUserCount());
mUserHandle = 0x0;
}
public void testCreateAndInitializeUser() {
// :( Parsing error. Please contact me.
}
.method public testCreateAndInitializeUser()V
.locals 11
.prologue
const/4 v2, 0x1
.line 65
iget-object v0, p0, Lcom/google/android/xts/deviceowner/UserManagementTest;->mPackageManager:Landroid/content/pm/PackageManager;
const-string/jumbo v1, "android.software.managed_users"
invoke-virtual {v0, v1}, Landroid/content/pm/PackageManager;->hasSystemFeature(Ljava/lang/String;)Z
move-result v0 //前面调用函数后,把结果放到 v0
if-nez v0, :cond_0 //如果结果不为0,就跳转到cond_0标号处
//网上有百度的修改方案拿掉handheld_core_hardware.xml里的android.software.managed_users此处代码就能看出,拿掉这个就不做如下的判断了,直接返回了,所以通过
.line 66
return-void
.line 69
:cond_0
iget-object v0, p0, Lcom/google/android/xts/deviceowner/UserManagementTest;->mContext:Landroid/content/Context;//获取UserManagementTest的context
const-string/jumbo v1, "user" //v1=user
invoke-virtual {v0, v1}, Landroid/content/Context;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;
//Context.getSystemService("user");
move-result-object v10
//将上一个invoke类型指令操作的对象结果(返回值)赋给v0
check-cast v10, Landroid/os/UserManager;
//将v10寄存器中的对象引用转化成指定的类型(这里是 UserManager)
.line 70
.local v10, "userManager":Landroid/os/UserManager;
const-string/jumbo v0, "Must start test with 1 user"
// UserManager userManager = (UserManager)mContext.getSystemService("user");
// assertEquals("Must start test with 1 user", 0x1, userManager.getUserCount());
invoke-virtual {v10}, Landroid/os/UserManager;->getUserCount()I
move-result v1
invoke-static {v0, v2, v1}, Lcom/google/android/xts/deviceowner/UserManagementTest;->assertEquals(Ljava/lang/String;II)V
//assertEquals(0x1, userManager.getUserCount());
.line 72
const-string/jumbo v6, "com.google.xts.TEST_USER_ACTION"
//v6="com.google.xts.TEST_USER_ACTION"
.line 73
.local v6, "action":Ljava/lang/String;
new-instance v5, Landroid/os/Bundle;
invoke-direct {v5}, Landroid/os/Bundle;-><init>()V
//Bundle bundle = new Bundle();
//bundle.putString("action", "com.google.xts.TEST_USER_ACTION");
.line 74
.local v5, "bundle":Landroid/os/Bundle;
const-string/jumbo v0, "broadcastExtra"
invoke-virtual {v5, v0, v2}, Landroid/os/Bundle;->putBoolean(Ljava/lang/String;Z)V
//bundle.putBoolean("broadcastExtra", 0x1);
.line 75
const-string/jumbo v0, "serialExtra"
invoke-static {}, Landroid/os/Process;->myUserHandle()Landroid/os/UserHandle;
move-result-object v1
invoke-virtual {v10, v1}, Landroid/os/UserManager;->getSerialNumberForUser(Landroid/os/UserHandle;)J
move-result-wide v2
invoke-virtual {v5, v0, v2, v3}, Landroid/os/Bundle;->putLong(Ljava/lang/String;J)V
//v1=mUserHandle=myUserHandle();
//v2=userManager.getSerialNumberForUser(mUserHandle);
//bundle.putLong("serialExtra", 0x1,userManager.getSerialNumberForUser(mUserHandle),);
.line 76
const-string/jumbo v0, "actionExtra"
invoke-virtual {v5, v0, v6}, Landroid/os/Bundle;->putString(Ljava/lang/String;Ljava/lang/String;)V
//bundle.putString("actionExtra", "com.google.xts.TEST_USER_ACTION");
.line 78
new-instance v8, Landroid/content/IntentFilter;
invoke-direct {v8}, Landroid/content/IntentFilter;-><init>()V
//IntentFilter intentfilter=new IntentFilter();
.line 79
.local v8, "filter":Landroid/content/IntentFilter;
invoke-virtual {v8, v6}, Landroid/content/IntentFilter;->addAction(Ljava/lang/String;)V
//intentfilter.addAction("com.google.xts.TEST_USER_ACTION");
.line 80
new-instance v9, Lcom/google/android/xts/deviceowner/UserManagementTest$1;
invoke-direct {v9, p0}, Lcom/google/android/xts/deviceowner/UserManagementTest$1;-><init>(Lcom/google/android/xts/deviceowner/UserManagementTest;)V
//新建一个子类BroadcastReceiver "receiver" = new BroadcastReceiver()
.line 89
.local v9, "receiver":Landroid/content/BroadcastReceiver;
const/4 v0, 0x0
iput-boolean v0, p0, Lcom/google/android/xts/deviceowner/UserManagementTest;->mReceived:Z
//boolean mReceived = mDevicePolicyManager.removeUser(getWho(), mUserHandle);
.line 90
iget-object v0, p0, Lcom/google/android/xts/deviceowner/UserManagementTest;->mContext:Landroid/content/Context;
invoke-virtual {v0, v9, v8}, Landroid/content/Context;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;)Landroid/content/Intent;
//registerReceiver("receiver",intentfilter);
.line 92
monitor-enter p0
.line 93
:try_start_0
iget-object v0, p0, Lcom/google/android/xts/deviceowner/UserManagementTest;->mDevicePolicyManager:Landroid/app/admin/DevicePolicyManager;
invoke-static {}, Lcom/google/android/xts/deviceowner/UserManagementTest;->getWho()Landroid/content/ComponentName;
move-result-object v1
const-string/jumbo v2, "Test User"
.line 94
const-string/jumbo v3, "Test Profile Owner"
invoke-static {}, Lcom/google/android/xts/deviceowner/UserManagementTest;->getWho()Landroid/content/ComponentName;
move-result-object v4
.line 93
invoke-virtual/range {v0 .. v5}, Landroid/app/admin/DevicePolicyManager;->createAndInitializeUser(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;Landroid/content/ComponentName;Landroid/os/Bundle;)Landroid/os/UserHandle;
move-result-object v0
iput-object v0, p0, Lcom/google/android/xts/deviceowner/UserManagementTest;->mUserHandle:Landroid/os/UserHandle;
//mUserHandle = mDevicePolicyManager.createAndInitializeUser(getWho(), "Test User","Test Profile Owner",getWho(),bundle);
.line 95
iget-object v0, p0, Lcom/google/android/xts/deviceowner/UserManagementTest;->mUserHandle:Landroid/os/UserHandle;
invoke-static {v0}, Lcom/google/android/xts/deviceowner/UserManagementTest;->assertNotNull(Ljava/lang/Object;)V
:try_end_0
.catchall {:try_start_0 .. :try_end_0} :catchall_0
//assertNotNull(mUserHandle);
.line 99
const-wide/16 v0, 0x4e20
//转换为16进制毫秒数v0=20000;20s
:try_start_1
invoke-virtual {p0, v0, v1}, Lcom/google/android/xts/deviceowner/UserManagementTest;->wait(J)V
:try_end_1
.catch Ljava/lang/InterruptedException; {:try_start_1 .. :try_end_1} :catch_0
.catchall {:try_start_1 .. :try_end_1} :catchall_0
//UserManagementTest.wait(20s);
.line 102
:goto_0
:try_start_2
iget-boolean v0, p0, Lcom/google/android/xts/deviceowner/UserManagementTest;->mReceived:Z
invoke-static {v0}, Lcom/google/android/xts/deviceowner/UserManagementTest;->assertTrue(Z)V
//assertTrue(UserManagementTest.mReceived);
.line 103
invoke-virtual {v10}, Landroid/os/UserManager;->getUserCount()I
move-result v0
const/4 v1, 0x2
invoke-static {v1, v0}, Lcom/google/android/xts/deviceowner/UserManagementTest;->assertEquals(II)V
//assertEquals(0x2, userManager.getUserCount());
.line 105
iget-object v0, p0, Lcom/google/android/xts/deviceowner/UserManagementTest;->mDevicePolicyManager:Landroid/app/admin/DevicePolicyManager;
invoke-static {}, Lcom/google/android/xts/deviceowner/UserManagementTest;->getWho()Landroid/content/ComponentName;
move-result-object v1
iget-object v2, p0, Lcom/google/android/xts/deviceowner/UserManagementTest;->mUserHandle:Landroid/os/UserHandle;
invoke-virtual {v0, v1, v2}, Landroid/app/admin/DevicePolicyManager;->removeUser(Landroid/content/ComponentName;Landroid/os/UserHandle;)Z
move-result v0
invoke-static {v0}, Lcom/google/android/xts/deviceowner/UserManagementTest;->assertTrue(Z)V
//assertTrue(mDevicePolicyManager.removeUser(getWho(), mUserHandle));
.line 106
invoke-virtual {v10}, Landroid/os/UserManager;->getUserCount()I
move-result v0
const/4 v1, 0x1
invoke-static {v1, v0}, Lcom/google/android/xts/deviceowner/UserManagementTest;->assertEquals(II)V
//assertEquals(0x1, userManager.getUserCount());
.line 107
const/4 v0, 0x0
iput-object v0, p0, Lcom/google/android/xts/deviceowner/UserManagementTest;->mUserHandle:Landroid/os/UserHandle;
:try_end_2
.catchall {:try_start_2 .. :try_end_2} :catchall_0
monitor-exit p0
.line 109
iget-object v0, p0, Lcom/google/android/xts/deviceowner/UserManagementTest;->mContext:Landroid/content/Context;
invoke-virtual {v0, v9}, Landroid/content/Context;->unregisterReceiver(Landroid/content/BroadcastReceiver;)V
.line 62
return-void
.line 100
:catch_0
move-exception v7
.local v7, "e":Ljava/lang/InterruptedException;
goto :goto_0
.line 92
.end local v7 # "e":Ljava/lang/InterruptedException;
:catchall_0
move-exception v0
monitor-exit p0
throw v0
.end method
createAndInitializeUser
Activity和Broadcast行为不正常时 ,如何抓取log?
[DESCRIPTION] Activity和Broadcast行为不正常时,如何抓取log? [SOLUTION] 1)
???请使用mtklog抓取,保证有main log和event log产生 2) ??? 对于activity行为不正常,
请打开activity的log开关再抓取: ?? adb shell dumpsys activity log a on 这个命令只
对当次开机有效 3) ???对于broadcast行为不正常,请打开broadcast的log开关再抓取:
adb shell dumpsys activity log br on 这个命令只对当次开机有效
adb shell am start -n com.mediatek.mtklogger/com.mediatek.mtklogger.MainActivity
贵司可以可以尝试修改,将此类Broadcast放在FOREGROUND队列执行就不会排队太久,谢谢!
frameworks/base/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
void sendAdminCommandLocked(ActiveAdmin admin, String action, Bundle adminExtras,
BroadcastReceiver result)
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND)//add
在log中搜索TEST_USER_ACTION可以看出凑巧通过的是刚好测试wait20s内有
03-29 11:37:35.964 1360 1370 V ActivityManager: Broadcast: Intent { act=com.google.xts.TEST_USER_ACTION flg=0x10 } ordered=false userid=0 callerApp=ProcessRecord{fe6fab8 22521:com.google.android.xts.deviceowner/u22a9}
碰上了这个log就测试通过了
跑了三次,每次测试两次testCreateAndInitializeUser
成功一次,其他五次均失败
从log中可以看出成功的那一次刚好wait的20s内有TEST_USER_ACTION发出即:
03-29 11:37:35.964 1360 1370 V ActivityManager: Broadcast: Intent { act=com.google.xts.TEST_USER_ACTION flg=0x10 } ordered=false userid=0 callerApp=ProcessRecord{fe6fab8 22521:com.google.android.xts.deviceowner/u22a9}
存在于
Line 76145: 03-29 11:37:29.844 22237 22253 I TestRunner: started: testCreateAndInitializeUser(com.google.android.xts.deviceowner.UserManagementTest)
Line 88712: 03-29 11:37:50.844 22237 22253 I TestRunner: finished: testCreateAndInitializeUser(com.google.android.xts.deviceowner.UserManagementTest)
Line 88713: 03-29 11:37:50.845 22237 22253 I TestRunner: passed: testCreateAndInitializeUser(com.google.android.xts.deviceowner.UserManagementTest)
此测试项时间之间,所以测试通过
而其他的失败5次,有还未测试到testCreateAndInitializeUser,广播已经发送的
也有测试到testCreateAndInitializeUser,广播还未发送的
如此可以确定intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND)//add
此项修改是无效的,主要看TEST_USER_ACTION该广播发送和testCreateAndInitializeUser的逻辑时间为何会存在出入?
每个广播前有如下几个log可以结合代码中的BasicAdminReceiver反编译查看如下
03-29 11:35:33.836 19086 19086 D ActivityThread: BIND_APPLICATION handled : 0 / AppBindData{appInfo=ApplicationInfo{1fa125b com.google.android.xts.deviceowner}}
03-29 11:35:33.837 19086 19086 D ActivityThread: BDC-Calling onReceive: intent=Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver }, receiver=com.google.android.xts.deviceowner.BaseDeviceOwnerTest$BasicAdminReceiver@673baf8
03-29 11:35:33.838 19086 19086 D ActivityThread: BDC-RECEIVER handled : 0 / ReceiverData{intent=Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver } packageName=com.google.android.xts.deviceowner resultCode=-1 resultData=null resultExtras=null}
if(p2.getBooleanExtra("broadcastExtra", false)) {
Intent "i" = new Intent(p2.getStringExtra("actionExtra"));
"userManager" = p1.getSystemService("user");
long "serial" = p2.getLongExtra("serialExtra", 0x0);
UserHandle "handle" = "userManager".getUserForSerialNumber("serial");
p1.sendBroadcastAsUser("i", "handle");
}
初步判定DEVICE_ADMIN_ENABLED是广播DEVICE_ADMIN_ENABLED携带的actionExtra在BasicAdminReceiver下发出,再看看log进一步确认
DEVICE_ADMIN_ENABLED搜索此广播可以看到,第二次接受到此广播时就会发送TEST_USER_ACTION
六个log都吻合情况
问题log:
11:35:36开始testCreateAndInitializeUser测试
03-29 11:35:36.855 19170 19182 I TestRunner: started: testCreateAndInitializeUser(com.google.android.xts.deviceowner.UserManagementTest)
发送DEVICE_ADMIN_ENABLED广播
03-29 11:35:37.794 1360 1815 V ActivityManager: Broadcast: Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) } ordered=false userid=19 callerApp=ProcessRecord{2e3f602 1360:system/1000}
但是在接收到DEVICE_ADMIN_ENABLED广播时间29s已经超过20s所以超时
03-29 11:36:06.676 19828 19828 D ActivityThread: BDC-Calling onReceive: intent=Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) }, receiver=com.google.android.xts.deviceowner.BaseDeviceOwnerTest$BasicAdminReceiver@673baf8
03-29 11:36:06.681 19795 19817 W MediaProvider: queryThumbnail: Null origId! uri=content://media/external/images/thumbnails
正常log:
11:37:29开始testCreateAndInitializeUser测试
03-29 11:37:29.844 22237 22253 I TestRunner: started: testCreateAndInitializeUser(com.google.android.xts.deviceowner.UserManagementTest)
发送DEVICE_ADMIN_ENABLED广播
03-29 11:37:30.636 1360 1808 V ActivityManager: Broadcast: Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) } ordered=false userid=22 callerApp=ProcessRecord{2e3f602 1360:system/1000}
接收到DEVICE_ADMIN_ENABLED广播7s
Line 84295: 03-29 11:37:35.935 22521 22521 D ActivityThread: BDC-Calling onReceive: intent=Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) }, receiver=com.google.android.xts.deviceowner.BaseDeviceOwnerTest$BasicAdminReceiver@804a788
Line 84299: 03-29 11:37:35.968 22521 22521 D ActivityThread: BDC-RECEIVER handled : 0 / ReceiverData{intent=Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) } packageName=com.google.android.xts.deviceowner resultCode=-1 resultData=null resultExtras=null}
114057问题log1:
11:41:56开始testCreateAndInitializeUser测试
03-29 11:41:56.674 25251 25266 I TestRunner: started: testCreateAndInitializeUser(com.google.android.xts.deviceowner.UserManagementTest)
发送DEVICE_ADMIN_ENABLED广播
03-29 11:41:57.575 1360 1815 V ActivityManager: Broadcast: Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) } ordered=false userid=25 callerApp=ProcessRecord{2e3f602 1360:system/1000}
接收到DEVICE_ADMIN_ENABLED广播29s已经超过20s所以超时
Line 49399: 03-29 11:42:26.538 25974 25974 D ActivityThread: BDC-Calling onReceive: intent=Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) }, receiver=com.google.android.xts.deviceowner.BaseDeviceOwnerTest$BasicAdminReceiver@673baf8
Line 49405: 03-29 11:42:26.548 25974 25974 D ActivityThread: BDC-RECEIVER handled : 0 / ReceiverData{intent=Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) } packageName=com.google.android.xts.deviceowner resultCode=-1 resultData=null resultExtras=null}
114057问题log2:
11:43:49开始testCreateAndInitializeUser测试
Line 71900: 03-29 11:43:49.134 28200 28212 I TestRunner: started: testCreateAndInitializeUser(com.google.android.xts.deviceowner.UserManagementTest)
发送DEVICE_ADMIN_ENABLED广播
Line 72963: 03-29 11:43:50.138 1360 2285 V ActivityManager: Broadcast: Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) } ordered=false userid=28 callerApp=ProcessRecord{2e3f602 1360:system/1000}
接收到DEVICE_ADMIN_ENABLED广播29s已经超过20s所以超时
Line 103664: 03-29 11:44:19.648 28910 28910 D ActivityThread: BDC-Calling onReceive: intent=Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) }, receiver=com.google.android.xts.deviceowner.BaseDeviceOwnerTest$BasicAdminReceiver@804a788
Line 103671: 03-29 11:44:19.661 28910 28910 D ActivityThread: BDC-RECEIVER handled : 0 / ReceiverData{intent=Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) } packageName=com.google.android.xts.deviceowner resultCode=-1 resultData=null resultExtras=null}
114458问题log1:
11:45:59开始testCreateAndInitializeUser测试
Line 18904: 03-29 11:45:59.415 31432 31444 I TestRunner: started: testCreateAndInitializeUser(com.google.android.xts.deviceowner.UserManagementTest)
发送DEVICE_ADMIN_ENABLED广播
Line 20480: 03-29 11:46:00.249 1360 1813 V ActivityManager: Broadcast: Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) } ordered=false userid=31 callerApp=ProcessRecord{2e3f602 1360:system/1000}
接收到DEVICE_ADMIN_ENABLED广播28s已经超过20s所以超时
Line 48829: 03-29 11:46:28.780 32086 32086 D ActivityThread: BDC-Calling onReceive: intent=Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) }, receiver=com.google.android.xts.deviceowner.BaseDeviceOwnerTest$BasicAdminReceiver@673baf8
Line 48831: 03-29 11:46:28.785 32086 32086 D ActivityThread: BDC-RECEIVER handled : 0 / ReceiverData{intent=Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) } packageName=com.google.android.xts.deviceowner resultCode=-1 resultData=null resultExtras=null}
114458问题log2:
11:47:44开始testCreateAndInitializeUser测试
Line 69380: 03-29 11:47:44.944 1746 1758 I TestRunner: started: testCreateAndInitializeUser(com.google.android.xts.deviceowner.UserManagementTest)
发送DEVICE_ADMIN_ENABLED广播
Line 71050: 03-29 11:47:45.991 1360 1811 V ActivityManager: Broadcast: Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) } ordered=false userid=34 callerApp=ProcessRecord{2e3f602 1360:system/1000}
接收到DEVICE_ADMIN_ENABLED广播29s已经超过20s所以超时
Line 103863: 03-29 11:48:15.024 2594 2594 D ActivityThread: BDC-Calling onReceive: intent=Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) }, receiver=com.google.android.xts.deviceowner.BaseDeviceOwnerTest$BasicAdminReceiver@804a788
Line 103881: 03-29 11:48:15.063 2594 2594 D ActivityThread: BDC-RECEIVER handled : 0 / ReceiverData{intent=Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) } packageName=com.google.android.xts.deviceowner resultCode=-1 resultData=null resultExtras=null}
在openfork中搜索
DEVICE_ADMIN_ENABLED
可以看到ACTION_DEVICE_ADMIN_ENABLED即代码内的命名
一一查看此接口的使用方法
只有如下这个看着像是发送广播的地方,其他为查询,使能等不一一列举
lenovo_andy/alps/frameworks/base/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
2013 sendAdminCommandLocked(newAdmin, DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED,
2014 onEnableData, null);
继续……
1322 void sendAdminCommandLocked(ActiveAdmin admin, String action, Bundle adminExtras,
1323 BroadcastReceiver result) {
1324 Intent intent = new Intent(action);
1325 intent.setComponent(admin.info.getComponent());
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND)//add
1326 if (action.equals(DeviceAdminReceiver.ACTION_PASSWORD_EXPIRING)) {
1327 intent.putExtra("expiration", admin.passwordExpirationDate);
1328 }
1329 if (adminExtras != null) {
1330 intent.putExtras(adminExtras);
1331 }
1332 if (result != null) {
1333 mContext.sendOrderedBroadcastAsUser(intent, admin.getUserHandle(),
1334 null, result, mHandler, Activity.RESULT_OK, null, null);
1335 } else {
1336 mContext.sendBroadcastAsUser(intent, admin.getUserHandle());
1337 }
1338 }
可以看到发送广播了
至此,这里的测试流程算是理顺了
给此处增加
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND)//add
应该修改就可以生效了
at junit.framework.Assert.fail(Assert.java:50)
at junit.framework.Assert.assertTrue(Assert.java:20)
at com.google.android.xts.devicepolicy.DeviceOwnerTest.executeDeviceOwnerTest(DeviceOwnerTest.java:155)
at com.google.android.xts.devicepolicy.DeviceOwnerTest.testUserManagement(DeviceOwnerTest.java:119)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at junit.framework.TestCase.runTest(TestCase.java:168)
at junit.framework.TestCase.runBare(TestCase.java:134)
at com.android.tradefed.testtype.DeviceTestResult$1.protect(DeviceTestResult.java:81)
at com.android.tradefed.testtype.DeviceTestResult.runProtected(DeviceTestResult.java:56)
at com.android.tradefed.testtype.DeviceTestResult.run(DeviceTestResult.java:85)
at junit.framework.TestCase.run(TestCase.java:124)
at com.android.tradefed.testtype.DeviceTestCase.run(DeviceTestCase.java:117)
at com.android.xts.tradefed.testtype.JarHostTest$TestRunnable.run(JarHostTest.java:261)
at com.android.tradefed.util.RunUtil$RunnableNotifier.run(RunUtil.java:378)
03-28 11:57:08.095 I/art (26318): Explicit concurrent mark sweep GC freed 46(1872B) AllocSpace objects, 0(0B) LOS objects, 39% free, 1994KB/3MB, paused 444us total 22.660ms
03-28 11:57:08.096 I/TestRunner(26318): failed: testCreateAndInitializeUser(com.google.android.xts.deviceowner.UserManagementTest)
03-28 11:57:08.096 I/TestRunner(26318): ----- begin exception -----
03-28 11:57:08.097 D/SettingsInterface( 2267): from settings cache , name = multi_sim_data_call , value = null
03-28 11:57:08.099 D/SettingsInterface( 2267): from settings cache , name = multi_sim_data_call , value = null
03-28 11:57:08.101 I/TestRunner(26318):
03-28 11:57:08.101 I/TestRunner(26318): junit.framework.AssertionFailedError
03-28 11:57:08.101 I/TestRunner(26318): at junit.framework.Assert.fail(Assert.java:48)
03-28 11:57:08.101 I/TestRunner(26318): at junit.framework.Assert.assertTrue(Assert.java:20)
03-28 11:57:08.101 I/TestRunner(26318): at junit.framework.Assert.assertTrue(Assert.java:27)
03-28 11:57:08.101 I/TestRunner(26318): at com.google.android.xts.deviceowner.UserManagementTest.testCreateAndInitializeUser(UserManagementTest.java:102)
03-28 11:57:08.101 I/TestRunner(26318): at java.lang.reflect.Method.invoke(Native Method)
03-28 11:57:08.101 I/TestRunner(26318): at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214)
03-28 11:57:08.101 I/TestRunner(26318): at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:199)
03-28 11:57:08.101 I/TestRunner(26318): at junit.framework.TestCase.runBare(TestCase.java:134)
03-28 11:57:08.101 I/TestRunner(26318): at junit.framework.TestResult$1.protect(TestResult.java:115)
03-28 11:57:08.101 I/TestRunner(26318): at junit.framework.TestResult.runProtected(TestResult.java:133)
03-28 11:57:08.101 I/TestRunner(26318): at junit.framework.TestResult.run(TestResult.java:118)
03-28 11:57:08.101 I/TestRunner(26318): at junit.framework.TestCase.run(TestCase.java:124)
03-28 11:57:08.101 I/TestRunner(26318): at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191)
03-28 11:57:08.101 I/TestRunner(26318): at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176)
03-28 11:57:08.101 I/TestRunner(26318): at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555)
03-28 11:57:08.101 I/TestRunner(26318): at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1893)
03-28 11:57:08.101 I/TestRunner(26318): ----- end exception -----
public void testCreateAndRemoveUser() {
return;
UserManager userManager = (UserManager)mContext.getSystemService("user");
assertEquals("Must start test with 1 user", 0x1, userManager.getUserCount());
mUserHandle = mDevicePolicyManager.createUser(getWho(), "Test User");
assertNotNull(mUserHandle);
assertEquals(0x2, userManager.getUserCount());
assertTrue(mDevicePolicyManager.removeUser(getWho(), mUserHandle));
assertEquals(0x1, userManager.getUserCount());
mUserHandle = 0x0;
}
public void testCreateAndInitializeUser() {
// :( Parsing error. Please contact me.
}
.method public testCreateAndInitializeUser()V
.locals 11
.prologue
const/4 v2, 0x1
.line 65
iget-object v0, p0, Lcom/google/android/xts/deviceowner/UserManagementTest;->mPackageManager:Landroid/content/pm/PackageManager;
const-string/jumbo v1, "android.software.managed_users"
invoke-virtual {v0, v1}, Landroid/content/pm/PackageManager;->hasSystemFeature(Ljava/lang/String;)Z
move-result v0 //前面调用函数后,把结果放到 v0
if-nez v0, :cond_0 //如果结果不为0,就跳转到cond_0标号处
//网上有百度的修改方案拿掉handheld_core_hardware.xml里的android.software.managed_users此处代码就能看出,拿掉这个就不做如下的判断了,直接返回了,所以通过
.line 66
return-void
.line 69
:cond_0
iget-object v0, p0, Lcom/google/android/xts/deviceowner/UserManagementTest;->mContext:Landroid/content/Context;//获取UserManagementTest的context
const-string/jumbo v1, "user" //v1=user
invoke-virtual {v0, v1}, Landroid/content/Context;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;
//Context.getSystemService("user");
move-result-object v10
//将上一个invoke类型指令操作的对象结果(返回值)赋给v0
check-cast v10, Landroid/os/UserManager;
//将v10寄存器中的对象引用转化成指定的类型(这里是 UserManager)
.line 70
.local v10, "userManager":Landroid/os/UserManager;
const-string/jumbo v0, "Must start test with 1 user"
// UserManager userManager = (UserManager)mContext.getSystemService("user");
// assertEquals("Must start test with 1 user", 0x1, userManager.getUserCount());
invoke-virtual {v10}, Landroid/os/UserManager;->getUserCount()I
move-result v1
invoke-static {v0, v2, v1}, Lcom/google/android/xts/deviceowner/UserManagementTest;->assertEquals(Ljava/lang/String;II)V
//assertEquals(0x1, userManager.getUserCount());
.line 72
const-string/jumbo v6, "com.google.xts.TEST_USER_ACTION"
//v6="com.google.xts.TEST_USER_ACTION"
.line 73
.local v6, "action":Ljava/lang/String;
new-instance v5, Landroid/os/Bundle;
invoke-direct {v5}, Landroid/os/Bundle;-><init>()V
//Bundle bundle = new Bundle();
//bundle.putString("action", "com.google.xts.TEST_USER_ACTION");
.line 74
.local v5, "bundle":Landroid/os/Bundle;
const-string/jumbo v0, "broadcastExtra"
invoke-virtual {v5, v0, v2}, Landroid/os/Bundle;->putBoolean(Ljava/lang/String;Z)V
//bundle.putBoolean("broadcastExtra", 0x1);
.line 75
const-string/jumbo v0, "serialExtra"
invoke-static {}, Landroid/os/Process;->myUserHandle()Landroid/os/UserHandle;
move-result-object v1
invoke-virtual {v10, v1}, Landroid/os/UserManager;->getSerialNumberForUser(Landroid/os/UserHandle;)J
move-result-wide v2
invoke-virtual {v5, v0, v2, v3}, Landroid/os/Bundle;->putLong(Ljava/lang/String;J)V
//v1=mUserHandle=myUserHandle();
//v2=userManager.getSerialNumberForUser(mUserHandle);
//bundle.putLong("serialExtra", 0x1,userManager.getSerialNumberForUser(mUserHandle),);
.line 76
const-string/jumbo v0, "actionExtra"
invoke-virtual {v5, v0, v6}, Landroid/os/Bundle;->putString(Ljava/lang/String;Ljava/lang/String;)V
//bundle.putString("actionExtra", "com.google.xts.TEST_USER_ACTION");
.line 78
new-instance v8, Landroid/content/IntentFilter;
invoke-direct {v8}, Landroid/content/IntentFilter;-><init>()V
//IntentFilter intentfilter=new IntentFilter();
.line 79
.local v8, "filter":Landroid/content/IntentFilter;
invoke-virtual {v8, v6}, Landroid/content/IntentFilter;->addAction(Ljava/lang/String;)V
//intentfilter.addAction("com.google.xts.TEST_USER_ACTION");
.line 80
new-instance v9, Lcom/google/android/xts/deviceowner/UserManagementTest$1;
invoke-direct {v9, p0}, Lcom/google/android/xts/deviceowner/UserManagementTest$1;-><init>(Lcom/google/android/xts/deviceowner/UserManagementTest;)V
//新建一个子类BroadcastReceiver "receiver" = new BroadcastReceiver()
.line 89
.local v9, "receiver":Landroid/content/BroadcastReceiver;
const/4 v0, 0x0
iput-boolean v0, p0, Lcom/google/android/xts/deviceowner/UserManagementTest;->mReceived:Z
//boolean mReceived = mDevicePolicyManager.removeUser(getWho(), mUserHandle);
.line 90
iget-object v0, p0, Lcom/google/android/xts/deviceowner/UserManagementTest;->mContext:Landroid/content/Context;
invoke-virtual {v0, v9, v8}, Landroid/content/Context;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;)Landroid/content/Intent;
//registerReceiver("receiver",intentfilter);
.line 92
monitor-enter p0
.line 93
:try_start_0
iget-object v0, p0, Lcom/google/android/xts/deviceowner/UserManagementTest;->mDevicePolicyManager:Landroid/app/admin/DevicePolicyManager;
invoke-static {}, Lcom/google/android/xts/deviceowner/UserManagementTest;->getWho()Landroid/content/ComponentName;
move-result-object v1
const-string/jumbo v2, "Test User"
.line 94
const-string/jumbo v3, "Test Profile Owner"
invoke-static {}, Lcom/google/android/xts/deviceowner/UserManagementTest;->getWho()Landroid/content/ComponentName;
move-result-object v4
.line 93
invoke-virtual/range {v0 .. v5}, Landroid/app/admin/DevicePolicyManager;->createAndInitializeUser(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;Landroid/content/ComponentName;Landroid/os/Bundle;)Landroid/os/UserHandle;
move-result-object v0
iput-object v0, p0, Lcom/google/android/xts/deviceowner/UserManagementTest;->mUserHandle:Landroid/os/UserHandle;
//mUserHandle = mDevicePolicyManager.createAndInitializeUser(getWho(), "Test User","Test Profile Owner",getWho(),bundle);
.line 95
iget-object v0, p0, Lcom/google/android/xts/deviceowner/UserManagementTest;->mUserHandle:Landroid/os/UserHandle;
invoke-static {v0}, Lcom/google/android/xts/deviceowner/UserManagementTest;->assertNotNull(Ljava/lang/Object;)V
:try_end_0
.catchall {:try_start_0 .. :try_end_0} :catchall_0
//assertNotNull(mUserHandle);
.line 99
const-wide/16 v0, 0x4e20
//转换为16进制毫秒数v0=20000;20s
:try_start_1
invoke-virtual {p0, v0, v1}, Lcom/google/android/xts/deviceowner/UserManagementTest;->wait(J)V
:try_end_1
.catch Ljava/lang/InterruptedException; {:try_start_1 .. :try_end_1} :catch_0
.catchall {:try_start_1 .. :try_end_1} :catchall_0
//UserManagementTest.wait(20s);
.line 102
:goto_0
:try_start_2
iget-boolean v0, p0, Lcom/google/android/xts/deviceowner/UserManagementTest;->mReceived:Z
invoke-static {v0}, Lcom/google/android/xts/deviceowner/UserManagementTest;->assertTrue(Z)V
//assertTrue(UserManagementTest.mReceived);
.line 103
invoke-virtual {v10}, Landroid/os/UserManager;->getUserCount()I
move-result v0
const/4 v1, 0x2
invoke-static {v1, v0}, Lcom/google/android/xts/deviceowner/UserManagementTest;->assertEquals(II)V
//assertEquals(0x2, userManager.getUserCount());
.line 105
iget-object v0, p0, Lcom/google/android/xts/deviceowner/UserManagementTest;->mDevicePolicyManager:Landroid/app/admin/DevicePolicyManager;
invoke-static {}, Lcom/google/android/xts/deviceowner/UserManagementTest;->getWho()Landroid/content/ComponentName;
move-result-object v1
iget-object v2, p0, Lcom/google/android/xts/deviceowner/UserManagementTest;->mUserHandle:Landroid/os/UserHandle;
invoke-virtual {v0, v1, v2}, Landroid/app/admin/DevicePolicyManager;->removeUser(Landroid/content/ComponentName;Landroid/os/UserHandle;)Z
move-result v0
invoke-static {v0}, Lcom/google/android/xts/deviceowner/UserManagementTest;->assertTrue(Z)V
//assertTrue(mDevicePolicyManager.removeUser(getWho(), mUserHandle));
.line 106
invoke-virtual {v10}, Landroid/os/UserManager;->getUserCount()I
move-result v0
const/4 v1, 0x1
invoke-static {v1, v0}, Lcom/google/android/xts/deviceowner/UserManagementTest;->assertEquals(II)V
//assertEquals(0x1, userManager.getUserCount());
.line 107
const/4 v0, 0x0
iput-object v0, p0, Lcom/google/android/xts/deviceowner/UserManagementTest;->mUserHandle:Landroid/os/UserHandle;
:try_end_2
.catchall {:try_start_2 .. :try_end_2} :catchall_0
monitor-exit p0
.line 109
iget-object v0, p0, Lcom/google/android/xts/deviceowner/UserManagementTest;->mContext:Landroid/content/Context;
invoke-virtual {v0, v9}, Landroid/content/Context;->unregisterReceiver(Landroid/content/BroadcastReceiver;)V
.line 62
return-void
.line 100
:catch_0
move-exception v7
.local v7, "e":Ljava/lang/InterruptedException;
goto :goto_0
.line 92
.end local v7 # "e":Ljava/lang/InterruptedException;
:catchall_0
move-exception v0
monitor-exit p0
throw v0
.end method
createAndInitializeUser
Activity和Broadcast行为不正常时 ,如何抓取log?
[DESCRIPTION] Activity和Broadcast行为不正常时,如何抓取log? [SOLUTION] 1)
???请使用mtklog抓取,保证有main log和event log产生 2) ??? 对于activity行为不正常,
请打开activity的log开关再抓取: ?? adb shell dumpsys activity log a on 这个命令只
对当次开机有效 3) ???对于broadcast行为不正常,请打开broadcast的log开关再抓取:
adb shell dumpsys activity log br on 这个命令只对当次开机有效
adb shell am start -n com.mediatek.mtklogger/com.mediatek.mtklogger.MainActivity
贵司可以可以尝试修改,将此类Broadcast放在FOREGROUND队列执行就不会排队太久,谢谢!
frameworks/base/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
void sendAdminCommandLocked(ActiveAdmin admin, String action, Bundle adminExtras,
BroadcastReceiver result)
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND)//add
在log中搜索TEST_USER_ACTION可以看出凑巧通过的是刚好测试wait20s内有
03-29 11:37:35.964 1360 1370 V ActivityManager: Broadcast: Intent { act=com.google.xts.TEST_USER_ACTION flg=0x10 } ordered=false userid=0 callerApp=ProcessRecord{fe6fab8 22521:com.google.android.xts.deviceowner/u22a9}
碰上了这个log就测试通过了
跑了三次,每次测试两次testCreateAndInitializeUser
成功一次,其他五次均失败
从log中可以看出成功的那一次刚好wait的20s内有TEST_USER_ACTION发出即:
03-29 11:37:35.964 1360 1370 V ActivityManager: Broadcast: Intent { act=com.google.xts.TEST_USER_ACTION flg=0x10 } ordered=false userid=0 callerApp=ProcessRecord{fe6fab8 22521:com.google.android.xts.deviceowner/u22a9}
存在于
Line 76145: 03-29 11:37:29.844 22237 22253 I TestRunner: started: testCreateAndInitializeUser(com.google.android.xts.deviceowner.UserManagementTest)
Line 88712: 03-29 11:37:50.844 22237 22253 I TestRunner: finished: testCreateAndInitializeUser(com.google.android.xts.deviceowner.UserManagementTest)
Line 88713: 03-29 11:37:50.845 22237 22253 I TestRunner: passed: testCreateAndInitializeUser(com.google.android.xts.deviceowner.UserManagementTest)
此测试项时间之间,所以测试通过
而其他的失败5次,有还未测试到testCreateAndInitializeUser,广播已经发送的
也有测试到testCreateAndInitializeUser,广播还未发送的
如此可以确定intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND)//add
此项修改是无效的,主要看TEST_USER_ACTION该广播发送和testCreateAndInitializeUser的逻辑时间为何会存在出入?
每个广播前有如下几个log可以结合代码中的BasicAdminReceiver反编译查看如下
03-29 11:35:33.836 19086 19086 D ActivityThread: BIND_APPLICATION handled : 0 / AppBindData{appInfo=ApplicationInfo{1fa125b com.google.android.xts.deviceowner}}
03-29 11:35:33.837 19086 19086 D ActivityThread: BDC-Calling onReceive: intent=Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver }, receiver=com.google.android.xts.deviceowner.BaseDeviceOwnerTest$BasicAdminReceiver@673baf8
03-29 11:35:33.838 19086 19086 D ActivityThread: BDC-RECEIVER handled : 0 / ReceiverData{intent=Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver } packageName=com.google.android.xts.deviceowner resultCode=-1 resultData=null resultExtras=null}
if(p2.getBooleanExtra("broadcastExtra", false)) {
Intent "i" = new Intent(p2.getStringExtra("actionExtra"));
"userManager" = p1.getSystemService("user");
long "serial" = p2.getLongExtra("serialExtra", 0x0);
UserHandle "handle" = "userManager".getUserForSerialNumber("serial");
p1.sendBroadcastAsUser("i", "handle");
}
初步判定DEVICE_ADMIN_ENABLED是广播DEVICE_ADMIN_ENABLED携带的actionExtra在BasicAdminReceiver下发出,再看看log进一步确认
DEVICE_ADMIN_ENABLED搜索此广播可以看到,第二次接受到此广播时就会发送TEST_USER_ACTION
六个log都吻合情况
问题log:
11:35:36开始testCreateAndInitializeUser测试
03-29 11:35:36.855 19170 19182 I TestRunner: started: testCreateAndInitializeUser(com.google.android.xts.deviceowner.UserManagementTest)
发送DEVICE_ADMIN_ENABLED广播
03-29 11:35:37.794 1360 1815 V ActivityManager: Broadcast: Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) } ordered=false userid=19 callerApp=ProcessRecord{2e3f602 1360:system/1000}
但是在接收到DEVICE_ADMIN_ENABLED广播时间29s已经超过20s所以超时
03-29 11:36:06.676 19828 19828 D ActivityThread: BDC-Calling onReceive: intent=Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) }, receiver=com.google.android.xts.deviceowner.BaseDeviceOwnerTest$BasicAdminReceiver@673baf8
03-29 11:36:06.681 19795 19817 W MediaProvider: queryThumbnail: Null origId! uri=content://media/external/images/thumbnails
正常log:
11:37:29开始testCreateAndInitializeUser测试
03-29 11:37:29.844 22237 22253 I TestRunner: started: testCreateAndInitializeUser(com.google.android.xts.deviceowner.UserManagementTest)
发送DEVICE_ADMIN_ENABLED广播
03-29 11:37:30.636 1360 1808 V ActivityManager: Broadcast: Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) } ordered=false userid=22 callerApp=ProcessRecord{2e3f602 1360:system/1000}
接收到DEVICE_ADMIN_ENABLED广播7s
Line 84295: 03-29 11:37:35.935 22521 22521 D ActivityThread: BDC-Calling onReceive: intent=Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) }, receiver=com.google.android.xts.deviceowner.BaseDeviceOwnerTest$BasicAdminReceiver@804a788
Line 84299: 03-29 11:37:35.968 22521 22521 D ActivityThread: BDC-RECEIVER handled : 0 / ReceiverData{intent=Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) } packageName=com.google.android.xts.deviceowner resultCode=-1 resultData=null resultExtras=null}
114057问题log1:
11:41:56开始testCreateAndInitializeUser测试
03-29 11:41:56.674 25251 25266 I TestRunner: started: testCreateAndInitializeUser(com.google.android.xts.deviceowner.UserManagementTest)
发送DEVICE_ADMIN_ENABLED广播
03-29 11:41:57.575 1360 1815 V ActivityManager: Broadcast: Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) } ordered=false userid=25 callerApp=ProcessRecord{2e3f602 1360:system/1000}
接收到DEVICE_ADMIN_ENABLED广播29s已经超过20s所以超时
Line 49399: 03-29 11:42:26.538 25974 25974 D ActivityThread: BDC-Calling onReceive: intent=Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) }, receiver=com.google.android.xts.deviceowner.BaseDeviceOwnerTest$BasicAdminReceiver@673baf8
Line 49405: 03-29 11:42:26.548 25974 25974 D ActivityThread: BDC-RECEIVER handled : 0 / ReceiverData{intent=Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) } packageName=com.google.android.xts.deviceowner resultCode=-1 resultData=null resultExtras=null}
114057问题log2:
11:43:49开始testCreateAndInitializeUser测试
Line 71900: 03-29 11:43:49.134 28200 28212 I TestRunner: started: testCreateAndInitializeUser(com.google.android.xts.deviceowner.UserManagementTest)
发送DEVICE_ADMIN_ENABLED广播
Line 72963: 03-29 11:43:50.138 1360 2285 V ActivityManager: Broadcast: Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) } ordered=false userid=28 callerApp=ProcessRecord{2e3f602 1360:system/1000}
接收到DEVICE_ADMIN_ENABLED广播29s已经超过20s所以超时
Line 103664: 03-29 11:44:19.648 28910 28910 D ActivityThread: BDC-Calling onReceive: intent=Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) }, receiver=com.google.android.xts.deviceowner.BaseDeviceOwnerTest$BasicAdminReceiver@804a788
Line 103671: 03-29 11:44:19.661 28910 28910 D ActivityThread: BDC-RECEIVER handled : 0 / ReceiverData{intent=Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) } packageName=com.google.android.xts.deviceowner resultCode=-1 resultData=null resultExtras=null}
114458问题log1:
11:45:59开始testCreateAndInitializeUser测试
Line 18904: 03-29 11:45:59.415 31432 31444 I TestRunner: started: testCreateAndInitializeUser(com.google.android.xts.deviceowner.UserManagementTest)
发送DEVICE_ADMIN_ENABLED广播
Line 20480: 03-29 11:46:00.249 1360 1813 V ActivityManager: Broadcast: Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) } ordered=false userid=31 callerApp=ProcessRecord{2e3f602 1360:system/1000}
接收到DEVICE_ADMIN_ENABLED广播28s已经超过20s所以超时
Line 48829: 03-29 11:46:28.780 32086 32086 D ActivityThread: BDC-Calling onReceive: intent=Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) }, receiver=com.google.android.xts.deviceowner.BaseDeviceOwnerTest$BasicAdminReceiver@673baf8
Line 48831: 03-29 11:46:28.785 32086 32086 D ActivityThread: BDC-RECEIVER handled : 0 / ReceiverData{intent=Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) } packageName=com.google.android.xts.deviceowner resultCode=-1 resultData=null resultExtras=null}
114458问题log2:
11:47:44开始testCreateAndInitializeUser测试
Line 69380: 03-29 11:47:44.944 1746 1758 I TestRunner: started: testCreateAndInitializeUser(com.google.android.xts.deviceowner.UserManagementTest)
发送DEVICE_ADMIN_ENABLED广播
Line 71050: 03-29 11:47:45.991 1360 1811 V ActivityManager: Broadcast: Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) } ordered=false userid=34 callerApp=ProcessRecord{2e3f602 1360:system/1000}
接收到DEVICE_ADMIN_ENABLED广播29s已经超过20s所以超时
Line 103863: 03-29 11:48:15.024 2594 2594 D ActivityThread: BDC-Calling onReceive: intent=Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) }, receiver=com.google.android.xts.deviceowner.BaseDeviceOwnerTest$BasicAdminReceiver@804a788
Line 103881: 03-29 11:48:15.063 2594 2594 D ActivityThread: BDC-RECEIVER handled : 0 / ReceiverData{intent=Intent { act=android.app.action.DEVICE_ADMIN_ENABLED flg=0x10 cmp=com.google.android.xts.deviceowner/.BaseDeviceOwnerTest$BasicAdminReceiver (has extras) } packageName=com.google.android.xts.deviceowner resultCode=-1 resultData=null resultExtras=null}
在openfork中搜索
DEVICE_ADMIN_ENABLED
可以看到ACTION_DEVICE_ADMIN_ENABLED即代码内的命名
一一查看此接口的使用方法
只有如下这个看着像是发送广播的地方,其他为查询,使能等不一一列举
lenovo_andy/alps/frameworks/base/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
2013 sendAdminCommandLocked(newAdmin, DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED,
2014 onEnableData, null);
继续……
1322 void sendAdminCommandLocked(ActiveAdmin admin, String action, Bundle adminExtras,
1323 BroadcastReceiver result) {
1324 Intent intent = new Intent(action);
1325 intent.setComponent(admin.info.getComponent());
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND)//add
1326 if (action.equals(DeviceAdminReceiver.ACTION_PASSWORD_EXPIRING)) {
1327 intent.putExtra("expiration", admin.passwordExpirationDate);
1328 }
1329 if (adminExtras != null) {
1330 intent.putExtras(adminExtras);
1331 }
1332 if (result != null) {
1333 mContext.sendOrderedBroadcastAsUser(intent, admin.getUserHandle(),
1334 null, result, mHandler, Activity.RESULT_OK, null, null);
1335 } else {
1336 mContext.sendBroadcastAsUser(intent, admin.getUserHandle());
1337 }
1338 }
可以看到发送广播了
至此,这里的测试流程算是理顺了
给此处增加
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND)//add
应该修改就可以生效了