Skip to content

Instantly share code, notes, and snippets.

@bkmioa
Created December 10, 2015 10:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save bkmioa/505dc539cce932a94864 to your computer and use it in GitHub Desktop.
Save bkmioa/505dc539cce932a94864 to your computer and use it in GitHub Desktop.

最近因为百度的后门事件,打算给应用换个推送,最后选择了极光推送,结果在接入之后出了一些比较诡异的问题,花了几天才跟踪到问题,大概就是极光推送会导致所有的Activity被重复的实例化,而我们的应用在每个Activity都会维护一个网络请求队列,总之就是几个诡异的坑碰到一起了。

简单测试了一下

  • 测试代码

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";

    public MainActivity() {
        Log.w(TAG, "MainActivity: init", new Throwable());
    }

    @Override
    protected void onResume() {
        super.onResume();
        JPushInterface.onResume(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        JPushInterface.onPause(this);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}
  • 启动关闭一次Activity日志打印

    第一段是Activity启动时正常实例化
    第二段是Activity回调onResume时
    第三段是Activity回调onPause时
W: MainActivity: init
   java.lang.Throwable
       at com.example.jpushtest.MainActivity.<init>(MainActivity.java:19)
       at java.lang.reflect.Constructor.newInstance(Native Method)
       at java.lang.Class.newInstance(Class.java:1650)
       at android.app.Instrumentation.newActivity(Instrumentation.java:1079)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2504)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
       at android.app.ActivityThread.access$900(ActivityThread.java:172)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:145)
       at android.app.ActivityThread.main(ActivityThread.java:5835)
       at java.lang.reflect.Method.invoke(Native Method)
       at java.lang.reflect.Method.invoke(Method.java:372)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

W: MainActivity: init
   java.lang.Throwable
       at com.example.jpushtest.MainActivity.<init>(MainActivity.java:19)
       at java.lang.reflect.Constructor.newInstance(Native Method)
       at java.lang.Class.newInstance(Class.java:1650)
       at cn.jpush.android.api.e.a(Unknown Source)
       at cn.jpush.android.api.JPushInterface.onResume(Unknown Source)
       at com.example.jpushtest.MainActivity.onResume(MainActivity.java:25)
       at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1255)
       at android.app.Activity.performResume(Activity.java:6338)
       at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3338)
       at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3380)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2731)
       at android.app.ActivityThread.access$900(ActivityThread.java:172)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:145)
       at android.app.ActivityThread.main(ActivityThread.java:5835)
       at java.lang.reflect.Method.invoke(Native Method)
       at java.lang.reflect.Method.invoke(Method.java:372)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

W: MainActivity: init
   java.lang.Throwable
       at com.example.jpushtest.MainActivity.<init>(MainActivity.java:19)
       at java.lang.reflect.Constructor.newInstance(Native Method)
       at java.lang.Class.newInstance(Class.java:1650)
       at cn.jpush.android.api.e.b(Unknown Source)
       at cn.jpush.android.api.JPushInterface.onPause(Unknown Source)
       at com.example.jpushtest.MainActivity.onPause(MainActivity.java:31)
       at android.app.Activity.performPause(Activity.java:6373)
       at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1308)
       at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3648)
       at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3621)
       at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3596)
       at android.app.ActivityThread.access$1100(ActivityThread.java:172)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1439)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:145)
       at android.app.ActivityThread.main(ActivityThread.java:5835)
       at java.lang.reflect.Method.invoke(Native Method)
       at java.lang.reflect.Method.invoke(Method.java:372)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
  • 调用栈里的cn.jpush.android.api.e#a(...)方法摘要

public final void a(Context var1) {
        ...

        try {
            if(Class.forName(var1.getClass().getName()).newInstance() instanceof TabActivity) {
                this.o = false;
           }
        } catch (Exception var4) {
           var4.printStackTrace();
        }

        ...
}
  • 总结:

    极光为了判断一个Context是不是TabActivity也是挺努力的,代价就是每判断一次都会实例化该Activity,这编码水平不敢恭维,当然我在某个技术群里贴了这些代码,有人反驳到这个是反编译的代码,真实代码肯定不是这样的,再说就算真实例化了又怎样,我无力反驳;有些基础的应该都能懂。

    最后不得不说百度的推送到达率在Android上是最高的,百度全家桶各种共享通道不是盖的,但是技术支持实在太烂了,根本没人鸟,还有前段时间的后门事件;其次小米手机上只有小米推送好使,个推没用过不清楚。

@javenfang
Copy link

感谢提出问题。 我们开发人员关注看看。

@javenfang
Copy link

我们开发人员说,确实存在这个问题。马上修复此问题,将在下个发布的版本里体现出来。

@javenfang
Copy link

你帮我们找到了一个 Bug。非常感谢!

找不到你直接的联系方式。 麻烦联系我,给你寄送神秘小礼物,以示感谢!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment