根据上篇文章《GooglePay默认支付(payment)应用 之一》,
我们提到在GmsCore(Google play services)核心套件里边声明的TpHceService开机后发现被disabled。
那么原因是什么呢?
一起来看看吧~
由于GmsCore包太大,无法简单反编译,只要通过本地有的Frameworks代码log来解析这个APK,指着得出一些结论。
通过debug, 发现:
04-02 02:13:23.932897 999 1186 I ActivityManager: Start proc 2377:com.google.android.gms.persistent/u0a92 for broadcast {com.google.android.gms/com.google.android.gms.chimera.GmsIntentOperationService$PersistentTrustedReceiver}
04-02 02:13:32.777532 640 691 D StagefrightMetadataRetriever: setDataSource fd=9 (/product/media/audio/notifications/Antimony.ogg), offset=0, length=27849
04-02 02:13:32.777632 2377 2989 D ApplicationPackageManager: xdt SetComponentEnabledSettings: cmpName:ComponentInfo{com.google.android.gms/com.google.android.gms.tapandpay.hce.service.TpHceService}, newState:2, flags:1
04-02 02:13:32.778354 2377 2989 D ApplicationPackageManager: xdtjava.lang.Throwable
04-02 02:13:32.778354 2377 2989 D ApplicationPackageManager: at android.app.ApplicationPackageManager.setComponentEnabledSetting(ApplicationPackageManager.java:2554)
04-02 02:13:32.778354 2377 2989 D ApplicationPackageManager: at asbd.a(:com.google.android.gms@200414037@20.04.14 (120400-294335909):3)
04-02 02:13:32.778354 2377 2989 D ApplicationPackageManager: at com.google.android.gms.tapandpay.init.TapAndPayInitIntentOperation.onHandleIntent(:com.google.android.gms@200414037@20.04.14 (120400-294335909):3)
04-02 02:13:32.778354 2377 2989 D ApplicationPackageManager: at com.google.android.chimera.IntentOperation.onHandleIntent(:com.google.android.gms@200414037@20.04.14 (120400-294335909):2)
04-02 02:13:32.778354 2377 2989 D ApplicationPackageManager: at qkg.onHandleIntent(:com.google.android.gms@200414037@20.04.14 (120400-294335909):4)
04-02 02:13:32.778354 2377 2989 D ApplicationPackageManager: at dsr.run(:com.google.android.gms@200414037@20.04.14 (120400-294335909):7)
04-02 02:13:32.778354 2377 2989 D ApplicationPackageManager: at dsq.run(:com.google.android.gms@200414037@20.04.14 (120400-294335909):7)
04-02 02:13:32.778354 2377 2989 D ApplicationPackageManager: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
04-02 02:13:32.778354 2377 2989 D ApplicationPackageManager: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
04-02 02:13:32.778354 2377 2989 D ApplicationPackageManager: at java.lang.Thread.run(Thread.java:919)
04-02 02:13:32.781648 999 2861 D PackageManager : packageName: com.google.android.gms className: com.google.android.gms.tapandpay.hce.service.TpHceService newState: 2 CallingUid: 10092 CallingPid: 2377,CallingPackage:null, userId0, flags:1
04-02 02:13:32.786797 999 2861 D PackageManager: Instant App installer not found with android.intent.action.INSTALL_INSTANT_APP_PACKAGE
04-02 02:13:32.786933 999 2861 D PackageManager: Clear ephemeral installer activity
04-02 02:13:32.795865 999 1176 D AppOps : checkOperation: uid reject #4 for code 0 uid 1001 package com.mediatek.ims
04-02 02:13:32.796189 999 1176 W Looper : Drained
04-02 02:13:32.836054 999 1200 I ActivityManager: Force stopping service ServiceRecord{2484b2e u0 com.google.android.gms/.tapandpay.hce.service.TpHceService}
由这句可知,
ApplicationPackageManager: at com.google.android.gms.tapandpay.init.TapAndPayInitIntentOperation.onHandleIntent(:com.google.android.gms@200414037@20.04.14 (120400-294335909):3)
这个是在Gms包里边代码逻辑 通过调用Framework, PackageManager setComponentEnabledSetting API将TpHceService disable.
/* compiled from: :com.google.android.gms@200414037@20.04.14 (120400-294335909) */
/* renamed from: asbd */
public final class asbd {
static final AtomicBoolean a = new AtomicBoolean(false);
private static final sqv b = sqv.a(sfo.aA);
public static void a(Context context) {
try {
if (arrk.c(context)) {
if (asbd.c(context)) {
asbd.e(context);
return;
}
}
if (asbd.d(context)) {
asbd.f(context);
if (arqy.f(context)) {
((DevicePolicyManager) context.getSystemService("device_policy")).setPasswordQuality(arqy.a(context), 0);
}
new asoh(context).c.edit().putBoolean("tap_and_pay_enabled", true).apply();
asbd.e(context);
return;
}
context.getPackageManager().setComponentEnabledSetting(new ComponentName(context, "com.google.android.gms.tapandpay.hce.service.TpHceService"), 2, 1); // 执行这个将在不杀死进程的情况下disable service.
} catch (RuntimeException e) {
context = e;
((bmiw) ((bmiw) ((bmiw) b.b()).a(context)).a("asbd", "a", 74, ":com.google.android.gms@200414037@20.04.14 (120400-294335909)")).a("Error initializing Google Pay");
} catch (arsr e2) {
context = e2;
((bmiw) ((bmiw) ((bmiw) b.b()).a(context)).a("asbd", "a", 74, ":com.google.android.gms@200414037@20.04.14 (120400-294335909)")).a("Error initializing Google Pay");
}
}
有上段反编译代码,结果再明显不过了。
属于GmsCore内部动态逻辑决定了TpHceService这个component的enable状态。
至于具体的判断条件,
还是没有找到这一根本条件,混淆的太过严重。