作者按
做為移動(dòng)應(yīng)用,調(diào)用系統(tǒng)API是必不可少的操作瞄沙。
那么己沛,在Android系統(tǒng)上,哪些API最受歡迎呢距境?
于是申尼,我隨便找了個(gè)應(yīng)用的榜單,對(duì)其中的top應(yīng)用做了一下統(tǒng)計(jì)垫桂。出于對(duì)知識(shí)產(chǎn)權(quán)的保護(hù)师幕,對(duì)于所有加密的模塊均未涉及。這個(gè)報(bào)告只是為了得出一個(gè)相對(duì)的排名诬滩,并不關(guān)心精確的數(shù)目霹粥。
研究方法:通過(guò)dexdump去反匯編應(yīng)用,統(tǒng)計(jì)invoke-static, invoke-direct, invoke-virtual, invoke-super中被引用的Android API的數(shù)目疼鸟。
Top 10應(yīng)用Android API調(diào)用排行
360安全衛(wèi)士
10大API調(diào)用:
看來(lái)360安全衛(wèi)士用的最多的是Binder IPC后控,用到了大量的Parcel。在Parcel中對(duì)于整數(shù)類型的應(yīng)用最多空镜,看來(lái)效率不錯(cuò)浩淘。
另外,非常重視字符串判空吴攒。
1 void android.os.Parcel.recycle() : 2580
2 boolean android.text.TextUtils.isEmpty(java.lang.CharSequence) : 1448
3 android.os.Parcel android.os.Parcel.obtain() : 1290
4 void android.os.Parcel.writeInt(int) : 1213
5 int android.os.Parcel.readInt() : 1008
6 void android.os.Parcel.enforceInterface(java.lang.String) : 878
7 void android.os.Parcel.writeNoException() : 872
8 void android.os.Parcel.writeInterfaceToken(java.lang.String) : 648
9 void android.os.Parcel.writeString(java.lang.String) : 644
10 void android.os.Parcel.readException() : 642
支付寶
支付寶的特色是對(duì)字符串相等的判斷用得多张抄,字符串判空更多⊥菡看來(lái)是有大量對(duì)于字符串做操作的業(yè)務(wù)邏輯署惯。
另外,支付寶喜歡用Log.v打日志镣隶。
top 10 API調(diào)用
1 boolean android.text.TextUtils.isEmpty(java.lang.CharSequence) : 8973
2 boolean android.text.TextUtils.equals(java.lang.CharSequence,java.lang.CharSequence) : 2531
3 void android.os.Bundle.putString(java.lang.String,java.lang.String) : 1596
4 android.view.View android.view.View.findViewById(int) : 1559
5 void android.util.SparseIntArray.put(int,int) : 1363
6 java.lang.String android.os.Bundle.getString(java.lang.String) : 1352
7 int android.util.Log.v(java.lang.String,java.lang.String) : 950
8 android.content.Intent android.content.Intent.putExtra(java.lang.String,java.lang.String) : 944
9 android.content.res.Resources android.content.Context.getResources() : 942
10 void android.view.View.setVisibility(int) : 860
酷狗音樂(lè)
top 10 API調(diào)用
1 boolean android.text.TextUtils.isEmpty(java.lang.CharSequence) : 5883
2 android.view.View android.view.View.findViewById(int) : 3243
3 void android.os.Parcel.recycle() : 3124
4 void android.view.View.setVisibility(int) : 3001
5 void android.widget.TextView.setText(java.lang.CharSequence) : 1966
6 android.os.Parcel android.os.Parcel.obtain() : 1562
7 void android.os.Parcel.writeInt(int) : 1426
8 void android.os.Bundle.putString(java.lang.String,java.lang.String) : 1384
9 int android.os.Parcel.readInt() : 1315
10 void android.os.Parcel.writeString(java.lang.String) : 1151
新浪微博
top 10 API調(diào)用
1 boolean android.text.TextUtils.isEmpty(java.lang.CharSequence) : 6516
2 void android.os.Bundle.putString(java.lang.String,java.lang.String) : 1786
3 void android.widget.TextView.setText(java.lang.CharSequence) : 1517
4 android.view.View android.view.View.findViewById(int) : 1394
5 void android.widget.ImageView.setVisibility(int) : 1325
6 void android.widget.TextView.setTextColor(int) : 1164
7 void android.widget.TextView.setVisibility(int) : 1146
8 int android.content.res.Resources.getDimensionPixelSize(int) : 1065
9 android.content.res.Resources android.content.Context.getResources() : 962
10 java.lang.String android.content.res.Resources.getString(int) : 845
微信
微信的特色是繪圖API用得多泽台。cubic和line的調(diào)用都有上萬(wàn)處。
top 10 API調(diào)用
1 void android.graphics.Path.cubicTo(float,float,float,float,float,float) : 13642
2 void android.graphics.Path.lineTo(float,float) : 9218
3 android.content.Intent android.content.Intent.putExtra(java.lang.String,java.lang.String) : 3554
4 android.view.View android.view.View.findViewById(int) : 3522
5 void android.graphics.Path.moveTo(float,float) : 2829
6 void android.graphics.Path.close() : 2752
7 void android.widget.TextView.setText(java.lang.CharSequence) : 2510
8 void android.graphics.Canvas.restore() : 2341
9 void android.widget.TextView.setVisibility(int) : 2308
10 int android.graphics.Canvas.save() : 2257
1 boolean android.text.TextUtils.isEmpty(java.lang.CharSequence) : 11211
2 android.content.Intent android.content.Intent.putExtra(java.lang.String,java.lang.String) : 4365
3 android.view.View android.view.View.findViewById(int) : 4171
4 void android.os.Bundle.putString(java.lang.String,java.lang.String) : 3915
5 void android.widget.TextView.setText(java.lang.CharSequence) : 3577
6 java.lang.String android.os.Bundle.getString(java.lang.String) : 3095
7 android.content.Intent android.content.Intent.putExtra(java.lang.String,int) : 2666
8 void android.widget.TextView.setVisibility(int) : 2612
9 void android.view.View.setVisibility(int) : 2331
10 void android.os.Bundle.putInt(java.lang.String,int) : 2301
UC瀏覽器
UC瀏覽器的特色是Layout用得多矾缓。
1 boolean android.text.TextUtils.isEmpty(java.lang.CharSequence) : 1259
2 void android.widget.LinearLayout$LayoutParams.<init>(int,int) : 1128
3 void android.widget.LinearLayout.addView(android.view.View,android.view.ViewGroup$LayoutParams) : 646
4 void android.widget.FrameLayout$LayoutParams.<init>(int,int) : 538
5 void android.os.Bundle.putString(java.lang.String,java.lang.String) : 529
6 void android.widget.LinearLayout.<init>(android.content.Context) : 522
7 android.os.Message android.os.Message.obtain() : 430
8 void android.widget.ImageView.setImageDrawable(android.graphics.drawable.Drawable) : 410
9 android.content.res.Resources android.content.Context.getResources() : 401
10 float android.content.res.Resources.getDimension(int) : 369
優(yōu)酷
1 android.view.View android.view.View.findViewById(int) : 5991
2 boolean android.text.TextUtils.isEmpty(java.lang.CharSequence) : 4599
3 void android.widget.TextView.setText(java.lang.CharSequence) : 3488
4 void android.view.View.setVisibility(int) : 2041
5 void android.widget.TextView.setVisibility(int) : 1443
6 void android.widget.ImageView.setVisibility(int) : 1441
7 android.content.res.Resources android.content.Context.getResources() : 1351
8 android.view.LayoutInflater android.view.LayoutInflater.from(android.content.Context) : 873
9 void android.widget.TextView.setTextColor(int) : 860
10 void android.view.View.setOnClickListener(android.view.View$OnClickListener) : 830
淘寶
與360安全衛(wèi)士在Parcel中Int用的多相比怀酷,淘寶更喜歡用String.
1 boolean android.text.TextUtils.isEmpty(java.lang.CharSequence) : 2480
2 void android.os.Parcel.recycle() : 1452
3 android.os.Parcel android.os.Parcel.obtain() : 724
4 void android.os.Parcel.writeString(java.lang.String) : 675
5 java.lang.String android.os.Parcel.readString() : 631
6 void android.os.Parcel.writeInt(int) : 548
7 int android.os.Parcel.readInt() : 454
8 void android.os.Parcel.enforceInterface(java.lang.String) : 367
9 void android.os.Parcel.writeInterfaceToken(java.lang.String) : 362
10 void android.os.Parcel.writeNoException() : 352
wifi萬(wàn)能鑰匙
1 boolean android.text.TextUtils.isEmpty(java.lang.CharSequence) : 903
2 android.view.View android.view.View.findViewById(int) : 420
3 void android.widget.TextView.setText(java.lang.CharSequence) : 247
4 java.lang.Object android.content.Context.getSystemService(java.lang.String) : 193
5 java.lang.String android.content.Context.getPackageName() : 165
6 android.content.res.Resources android.content.Context.getResources() : 143
7 void android.view.View.setVisibility(int) : 142
8 java.lang.String android.content.Context.getString(int) : 140
9 void android.os.Bundle.putString(java.lang.String,java.lang.String) : 125
10 void android.content.Intent.<init>(java.lang.String) : 121
top 10 合計(jì)
Top我們總結(jié)一下:
- TextUtils.isEmpty奪冠毫無(wú)疑問(wèn),在各應(yīng)用中都名列前茅嗜闻。
- View.findViewById名列榜眼蜕依,說(shuō)明調(diào)用Android API最主要的操作還是操作控件
- TextView.setText探花,說(shuō)明用得最多的控件還是最簡(jiǎn)單的TextView。TextView的setVisibility摘得第十名
- 微信靠一己之力把兩個(gè)繪圖API送上榜样眠,但是其它應(yīng)用使用得不多
- 剩下的位置全被IPC工具Bundle, Intent, Parcel占據(jù)友瘤。說(shuō)明了IPC對(duì)于Android應(yīng)用的重要性
1 boolean android.text.TextUtils.isEmpty(java.lang.CharSequence) : 44517
2 android.view.View android.view.View.findViewById(int) : 20698
3 void android.widget.TextView.setText(java.lang.CharSequence) : 14410
4 void android.graphics.Path.cubicTo(float,float,float,float,float,float) : 13675
5 void android.os.Parcel.recycle() : 11942
6 android.content.Intent android.content.Intent.putExtra(java.lang.String,java.lang.String) : 11455
7 void android.view.View.setVisibility(int) : 11233
8 void android.os.Bundle.putString(java.lang.String,java.lang.String) : 10585
9 void android.graphics.Path.lineTo(float,float) : 9573
10 void android.widget.TextView.setVisibility(int) : 9045
愛(ài)奇藝
1 android.view.View android.view.View.findViewById(int) : 5200
2 boolean android.text.TextUtils.isEmpty(java.lang.CharSequence) : 4773
3 void android.widget.TextView.setText(java.lang.CharSequence) : 3134
4 void android.widget.TextView.setVisibility(int) : 2239
5 void android.view.View.setVisibility(int) : 1908
6 void android.os.Bundle.putString(java.lang.String,java.lang.String) : 1239
7 android.content.Intent android.content.Intent.putExtra(java.lang.String,java.lang.String) : 1212
8 void android.widget.ImageView.setVisibility(int) : 1188
9 android.content.res.Resources android.content.Context.getResources() : 998
10 java.lang.String android.content.Context.getString(int) : 928
高德地圖
高德團(tuán)隊(duì)是setOnClickListener的愛(ài)好者,有981處要設(shè)監(jiān)聽(tīng)檐束。
1 boolean android.text.TextUtils.isEmpty(java.lang.CharSequence) : 5738
2 android.view.View android.view.View.findViewById(int) : 5531
3 void android.widget.TextView.setText(java.lang.CharSequence) : 2426
4 void android.view.View.setVisibility(int) : 1996
5 java.lang.String android.content.res.Resources.getString(int) : 1407
6 void android.widget.TextView.setVisibility(int) : 1277
7 java.lang.String android.content.Context.getString(int) : 1052
8 void android.view.View.setOnClickListener(android.view.View$OnClickListener) : 981
9 android.content.res.Resources android.content.Context.getResources() : 883
10 java.lang.String android.app.Application.getString(int) : 813
360瀏覽器
1 boolean android.text.TextUtils.isEmpty(java.lang.CharSequence) : 1874
2 android.content.res.Resources android.content.Context.getResources() : 1056
3 int android.content.res.Resources.getColor(int) : 985
4 android.view.View android.view.View.findViewById(int) : 738
5 void android.widget.TextView.setTextColor(int) : 662
6 void android.os.Parcel.recycle() : 619
7 void android.widget.TextView.setText(java.lang.CharSequence) : 506
8 void android.view.View.setVisibility(int) : 406
9 void android.widget.ImageView.setImageResource(int) : 403
10 java.lang.String android.content.res.Resources.getString(int) : 399
阿里星球
阿里星球喜歡打log辫秧,這在前面的應(yīng)用中還沒(méi)有出現(xiàn)過(guò)。
1 boolean android.text.TextUtils.isEmpty(java.lang.CharSequence) : 2743
2 void android.os.Parcel.recycle() : 652
3 int android.util.Log.d(java.lang.String,java.lang.String) : 489
4 void android.os.Parcel.writeString(java.lang.String) : 456
5 java.lang.Object android.content.Context.getSystemService(java.lang.String) : 440
6 int android.util.Log.e(java.lang.String,java.lang.String) : 439
7 java.lang.String android.os.Parcel.readString() : 428
8 java.lang.String android.content.Context.getPackageName() : 353
9 void android.os.Parcel.writeInt(int) : 346
10 android.os.Parcel android.os.Parcel.obtain() : 327
今日頭條
今日頭條看來(lái)對(duì)于顏色的體驗(yàn)上做得非常細(xì)致被丧,getColor和setTextColor竟然榜上有名盟戏。
1 boolean android.text.TextUtils.isEmpty(java.lang.CharSequence) : 2140
2 android.view.View android.view.View.findViewById(int) : 1750
3 void android.widget.TextView.setText(java.lang.CharSequence) : 977
4 int android.content.res.Resources.getColor(int) : 920
5 android.content.res.Resources android.content.Context.getResources() : 732
6 void android.widget.TextView.setTextColor(int) : 722
7 void android.view.View.setVisibility(int) : 589
8 java.lang.String android.content.Context.getPackageName() : 581
9 void android.widget.TextView.setVisibility(int) : 572
10 java.lang.String android.os.Bundle.getString(java.lang.String) : 571
訊飛輸入法
1 void android.os.Parcel.recycle() : 1946
2 java.lang.String android.content.Context.getString(int) : 1336
3 boolean android.text.TextUtils.isEmpty(java.lang.CharSequence) : 997
4 android.os.Parcel android.os.Parcel.obtain() : 972
5 void android.os.Parcel.writeInt(int) : 590
6 android.view.View android.view.View.findViewById(int) : 546
7 android.content.res.Resources android.content.Context.getResources() : 540
8 int android.os.Parcel.readInt() : 510
9 void android.os.Parcel.writeString(java.lang.String) : 507
10 void android.os.Parcel.enforceInterface(java.lang.String) : 488
top 30匯總
1 boolean android.text.TextUtils.isEmpty(java.lang.CharSequence) : 88868
2 android.view.View android.view.View.findViewById(int) : 53920
3 void android.widget.TextView.setText(java.lang.CharSequence) : 37610
4 void android.view.View.setVisibility(int) : 26699
5 void android.os.Parcel.recycle() : 21927
6 void android.widget.TextView.setVisibility(int) : 21201
7 void android.os.Bundle.putString(java.lang.String,java.lang.String) : 20039
8 android.content.Intent android.content.Intent.putExtra(java.lang.String,java.lang.String) : 19306
9 android.content.res.Resources android.content.Context.getResources() : 18536
10 java.lang.String android.content.Context.getString(int) : 14956
從以上結(jié)果我們可以推斷:
- Java語(yǔ)言對(duì)于字符串判空的功能不好用,導(dǎo)致TextUtils.isEmpty被非常頻繁地調(diào)用甥桂。是否可以通過(guò)虛擬機(jī)層的修改柿究,通過(guò)指令來(lái)實(shí)現(xiàn)這個(gè)功能?
- xml布局的大量使用黄选,使View.findViewById(int)被大量使用
- TextView控制是最常用的控件蝇摸,TextView的方法有兩個(gè)上榜
- IPC調(diào)用在系統(tǒng)API調(diào)用中占有很大比例
- 最常用的資源是字符串