admin 管理员组

文章数量: 1184232


2024年3月11日发(作者:制作网页html)

COMPUTING SECURITY TECHNIQUES 计算机安全技术 

Android开发的性能优化 

刘锐 

(新华网股份有限公司,北京100162) 

摘 要:随着Android平台发展的越来越快速,应用功能的愈加强大,相应的性能上的优化成为了重点。整理了在 

Android开发过程中需要注意的一些性能方面的优化,会为Android开发者提供性能优化参考。 

关键词:Android系统;性能;优化 

Android Develop Performance Optimization 

LIU Rui 

(the Xinhuanet Corporation LTD,Beijing 100162,China) 

Abstract:As the Android platform development is more and more fast,with the application of function more powerful,be— 

came the focus of the corresponding performance optimization.In this paper,the optimization of some performance aspects 

need to pay attention to during the development of Android,will provide a reference for the developer of Android perfor- 

mance optimization. 

Key words:Android system;performance;optimization 

l 引言 

l6f4:el2fffle bx lr 

Android目前已经是世界上占有率最大的手机平台。引发 

从上可以看出来两个16位的数相加需要额外一条指令, 

了一场移动互联网的开发热潮.其前景也被越来越多的人看 

用来把结果从16位转到32位。并且小的类型不一定能提高 

好。Android开发者的门槛也越来越高,无论编写的程序所为 

性能,可能需要更多的指令。 

何求,性能的问题都是其中的关键。 

这里测试一百万个随机元素数组,使用short,int,long, 

2高效使用内存 

lfoat,double类型分别去计算它们的排序,找到最小值和求 

应用生存期的绝大部分时间都用于处理内存中的数据。 

和.得到下面的数据 

尽可能使用少的内存,不仅为了减少碰到OutOfMemoryError 

short sort(93s) ifndMin(27s) addAll(25s) 

异常,也为了提升性能。而性能主要取决于3个方面,第一, 

int sort(753s) ifndMin(31s) addAll(30s) 

CPU如何操纵特定的数据类型;第二,数据和指令需要占用 

long sort(1240s) findMin(57s) addAU(54s) 

lfoat sort(1080s) findMin(41s) addA1l(33s) 

多少存储空间:第三.数据在内存中的布局。 

double sort(1358s) findMin(58s) addAll(55s) 

2.1数据类型 

可以看得出short数组排序远快于其他类型数组.因为int 

在Java中基本数据类型为boolean(8位),byte(8位), 

和long使用了某些版本的快速排序算法,而short数组使用计 

char(16位),short(16位),int(32位),long(64位),lfoat 

数排序,它的算法复杂度是线性的,因此使用short类型可以 

(32位),double(32位)。 

消耗更少的内存。因而在处理大量数据时,0—32768可以用 

2.2两个值和的汇编执行 

short数组。大于32767的再采用int数组。 

两个32位整数相加:000016c8<add一32—32>: 

2_3设置缓存 

16c8:e0810000 add r0,rl,r0 

当提到缓存时.会直接想到引用,而在Java中存在4种 

16cc:el2fffle bx lr 

类型的引用:强引用、软引用、弱引用、虚引用。如果正常 

两个16位整数相加:000016d0<add一16—16>: 

创建一个对象,那么这个就是强引用。如果保持无用对象的 

16dO:e0810000 add tO,rl,r0 

强引用,那么就会导致内存泄露。软引用是说在内存空间足 

16d4:e6bf0070 sxth r0,r0 

16d8:el2fffle bx lr 

够时,垃圾回收期就不会回收它的,如果内存空间不足,那 

16位和32位整数相加:000016dc<add一16—32>: 

么就会回收这些对象的内存。只要没有被回收,那么程序就 

l6dc:e0810000 add r0,rl,r0 

可以一直使用这个对象。弱引用和软引用不同之处在于只要 

16d8 ̄el2fffle bx lr 

当垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦 

32位和64位整数相加:000016e4<add一32—64>: 

发现有弱引用对象存在就会回收。虚引用和其他都不太相同, 

6e4:e0922000 add r2,r2,rO 

6e8:e0a33fc0 adc r3,r3,rO,asr#31 

作者简介: 

刘锐(1984一),男,硕士,研究方向:Android 

6ec:elaO0002 

nov r0,r2 

平台开发。 

6fO:ela0l003 

nov rl,r3 

收稿日期: 

2O13一O5—06 

麓鳙 

电脑编程技巧与维护 

在任何时候都可能被回收。实际上很少用到。 

3延长电池续航时间 

很多APP运行不了多久就会使用大量的电量,经常使得 

设备开机不到半天就没电了。而这些应用也必然是要被市场 

所抛弃的。所以开发者要尽量少用电量,合理使用电池。期 

望应用能让用户一直使用着,但是电池是一个至关重要的因 

素.因而要想更好的用户体验,需要去检测电池信息。在 

Android里面获取电池信息可以通过设置一个广播,将信息 

Intent出来。 

实现代码如下: 

public class BatteryInfoActivity extends Activity{ 

private static final String TAG=”BatteryInfo”: 

private static String sHealthCodeToString(int health){ 

switch(health)【 

case BatteryManager.BATTERY

HEALTH

DEAD: 

_

return”Dead”; 

case BatteryManager.BATrERY

HEALTHGOOD: 

__

return”Dood”: 

case BatteryManager.BATTERY

_

HEALTH

_

OVER— 

HEAT:return”Overheat”: 

case BatteryManager.BATrERY

HEALTH

__

OVER_VOLT— 

AGE:return”Over volatge”; 

case BatteryManager.BATTERY

HEALTH

_

UN— 

_

SPECIFIED』’AlLURE:retum”Unspeciifed failure”; 

case BatteryManager.BATTERY

HEALTH

UN— 

_

KNOWN:return”Unknown”; 

default:retum‘’Unknown”: 

} 

} 

private static String sPluggedCodeToString(int plugged) 

{ 

switch(plugged){ 

case 0:retum”Battery”; 

case BatteryManager.BATTERY

_

PLUGGED

_

AC:return”AC”: 

case BatteryManager.BATrERYPLUGGED

_

USB:return 

”USB”: 

default:return”Unknown”: 

} 

} 

private static Stirng sStatusCodeToString(int status){ 

switch(sattus) { 

case BatteryManager.BATTERYSTATUS

——

CHARG- 

——

ING:retum”Charging”; 

case BatteryManager.BATTERY

_

STATUS

_

DIS— 

CHARGING:retum”Discharging”; 

case BatteryManager.BATTERY

_

STATUSj ULL:ret哪”Full”; 

case BatteryManager.BATTERY

_

STATUS

_

NOTCHARG— 

ING:retum”Not charging”: 

case BatteryManager.BATTERY

_

STATUS

_

UN— 

KNOWN:return”Unknown”: 

default:return”Unknown‘ : 

} 

} 

private BroadcastReceiver mBatteryChangeReceiver; 

t1 6 

If 

菩 旨 

private TextView mTextView; 

private void showBatterylnfo(Intent intent) { 

if(intent!=nul1)f 

int health=intent.geflntExtra fBatteryManager. 

EXTRA

EHALTH BatteryManager.BATTER 舾ALTH

UN— 

__

KNOWN); 

String healthString=”Healht:”+sHealhtCodeToString(healht): 

int level=intent.geflntExtra f BaaeryManager. 

EXTRA-jLEVEL,0); 

int scale=intent.getIntExtra(BatteryManager. 

EXTRA

_

SCALE,100); 

lfoat percentage=(scale!=0)?(100.f 

(1evel,(lfoat)scale)):0.Of; 

String levelString=String.format(”Level:%d/%d(%. 

2f%%)”,level,scale,percentage); 

int plugged=intent.geflntExtra(BatteryManager.EX— 

TRA

_

PLUGGED,0); 

String pluggedString=”Power source:” + 

sPluggedCodeToString(plugged); 

boolean present=intent.getBooleanExtra f Battery— 

Manager.EXTRA

_

PRESENT,false); 

String presentString=”Present”+(present?”Yes”:”No”); 

int status=intent.getlntExtra(BatteryManager. 

EXTRA STATUS,0); 

String statusString=”Status:”+sStatusCodeToString(status); 

String technology=intent.getStringExtra fBat— 

teryManager.EXTRA

TECHNOLOGY); 

String technologyString=”Technology:”+technology; 

int temperature = intent.getIntExtra f BatteryManager.EX— 

TR A TEMPERATURE,Integer.MIN

_

VALUE); 

Stirng temperatureString ”Temperature:”+temperature; 

int voltage=intent.getIntExtra f BatteryManager.EX— 

TR A VOLTAGE,Integer.M 

VALUE); 

String voltageString=”Voltage:” voltage; 

String showString=healthString+”ha’’+ 

levelString+”ha” +pluggedString+”、n” +presentString+” 

、ll”+statusSWing+”、n”+technologyString+”\II”+tem— 

peratureString+”、Il”+voltageString; 

mTextView.setText(showString): 

int id=intent.getIntExtra fBatteryManager.EX— 

TRA

_

ICON

_

SMALL,0); 

setFeatureDrawableResource f Window.FEA— 

TURE

_

LEFTjCON,0); 

}else{ 

mTextView.setText(”No battery information”); 

setFeatrueDrawable(Window.FEATUREj EFLIC0N,nul1); 

} 

} 

private void showBatteyrlnfo 0 { 

Intent intent=registerReceiver(null,new IntentFilter(Intent. 

ACTION

_

BATTERY

CHANGED)); 

showBatterylnfo(intent); 

} 

private void createBatteyrReceiver 0 { 

mBatteryChangeReceiver=new BroadcastReceiver 0 

(下转第118页) 

电脑编程技巧与维护 

下面的代码实现生成共享密钥; 

Private Sub Commandl_Click() 

Private Sub Filel

Click() 

_

selectilfe=File1.Path&”\'.&File1.FileName 

Open selectfile&”c”For Binary As#10 生成共享密钥文 

namelength=Len(selectfile) 

件;这里假定共享密钥个数小于l0个; 

For i=1 T0 Val(Text1.Text) 

Open selectile2&if For Binary As衔 

selectifle2=Lefts(selectifle,namelength—1) 获得各自的密 

钥文件,这里假定密钥文件小于l0个; 

ilfelength=FileLen(selectfile) 

End Sub 

For J=1 To iflelength 

Get衔..chl 

3结语 

程序在VB6.0中调试通过,需要说明的是,即使文件File 

是非随机数字(例如为全O或者全1),也不会导致Ci是非随 

机数字。如果File为全0,那么结果就是Ci异或的结果;如 

果File为全1.那么结果就是Ci异或的补码。而Ci为随机 

Get#10,J,ch 

ch=chXor chl 

Put#10,J,ch 

Next 

Close撒 

Next 

Close#33 

End Sub 

产生,具有一次一密的特征,所以,这种共享密码是安全的。 

由随机产生的密钥,由于没有数学上的关联,无法单独 

有效地进行密钥的传递,即使采用Difife—Hellman—Merkle密钥 

交换,也需要使用诸如RSA的公钥密码机制来加密密钥。 

Private Sub Command2_Click() 

End 

End Sub 

参考文献 

Private Sub Dirl

Change 0 

File1.Path=Dir1.Path 

End Sub 

【1】Wade Trappe,Lawrence C.Washington.密码学与编码理 

论.2版.王全龙,等,译.北京:人民邮电出版社, 

2008. 

Private Sub Drivel

Change 0 

Dir1.Path=Drive1.Drive 

End Sub 

. 

[21 David Salomon.数据保密与安全.蔡建,梁志敏,译.北 

京:清华大学出版社,2005. 

止.S 

(上接第116页) 

{ 

public void onReceive(Context context,Intent intent){ 

showBatterylnfo(intent); 

)】; 

} 

public void onCreate(Bundle savedlnstanceState){ 

super.onCreate(savedlnstanceState); 

requestWindowFeature(Window.FEATURE_LEPT_ICON); 

setContentView(R.1ayout.main); 

unregisterReceiver(mBatteryChangeReceiver); 

enableBatteryReceiver(false); 

} 

protected void onResume 0{ 

super.onResume 0; 

if(mBatteryChangeReceiver==nul1) { 

createBatteryReceiver 0; 

} 

registerReceiver(mBatteryChangeReceiver,new IntentFilter 

(Intent.ACTION_BATFERY_CHANGED)); 

enableBatteryReceiver(true); 

} 

public void onLowMemory 0 { 

super.onLowMemory(); 

mTextView=(TextView)findViewByld(R.id.battery); 

showBatteylrnfo 0; 

} 

private void enableBatteryReceiver(boolean enabled) { 

PackageManager pm getPackageManager 0: 

ComponentName receiverName=new Component— 

unregisterReceiver(mBatteryChangeReceiver); 

mBatteryChangeReceiver=null; 

Name(this,BatteryReceiver.this); 

int newState; 

) 

这样就能随时获取电池信息,来进行相应的操作。 

if(enabled) { 

newState=PackageManager.COMPONENTEN- 

4结语 

要真正开发出高质量得Android应用,必须对Android的 

ABLED

STATEENABLED; 

}else{ 

newState=PackageManager.COMPONENT

EN— 

性能做到很好的优化。要做到好的优化,必须要深入了解An— 

droid系统的实现原理和工作机制.需要投入花费的时间都很 

ABLEDSTATE

DISABLED; 

_

高。这里只是大概讨论了Android优化中需要特别注意的几 

点,而还可以在Java代码以及NDK中继续去优化。 

) 

pm.setComponentEnabledSetting(receiverName,newState, 

PackageManager.DONTKILL

APP); 

_

参考文献 

[1】苗忠良,曾旭,宛斌.深入Android应用开发.机械工业 

出版社。2012. 

[2]范怀宇.Android开发精要.机械工业出版社,2012. 

} 

protected void onPause 0 { 

super.onPause(); 

1 z 旨鬣挚 婚 


本文标签: 需要 性能 引用 内存 优化