automated api-usage update for android apps

Post on 03-Feb-2022

10 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Automated API-Usage Update for Android Apps

Mattia Fazzini Qi Xin Alessandro Orso

Mobile Applications

Platform

PlatformTight Coupling

Platforms Change

Platforms Change FrequentlyAndroid

Eclair

Ice Cream

Marshmallow

DonutPetit Four Cupcake

HoneycombFroyo Gingerbread

LollipopJelly Bean KitKat

PieNougat Oreo

1.1

AppDeveloper

Adaptive Maintenance

Platform

App

New Platform

Platform FragmentationGingerbread

Ice Cream

Jelly Bean

KitKat

Lollipop

Marshmallow

Nougat

Oreo

App C

Developer C

App B

Developer B

App A

Intuition

Developer A

App C

Developer C

App B

Developer B

App A

Intuition

Developer A

App C

Developer C

App B

Developer B

App A

Intuition

Developer A

API Updates

API-Usage ChangespublicNetworkInfo[]getAllNetworkInfo()

publicNetwork[]getAllNetworks()

New API Usage

publicNetworkInfogetNetworkInfo(Networknetwork)

publicNetworkInfo[]getAllNetworkInfo()Old API Usage

API Updates

API-Usage ChangespublicNetworkInfo[]getAllNetworkInfo()

publicNetwork[]getAllNetworks()

New API Usage

publicNetworkInfogetNetworkInfo(Networknetwork)

publicNetworkInfo[]getAllNetworkInfo()Old API Usage

API Updates

API-Usage ChangespublicNetworkInfo[]getAllNetworkInfo()

publicNetwork[]getAllNetworks()

New API Usage

publicNetworkInfogetNetworkInfo(Networknetwork)

publicNetworkInfo[]getAllNetworkInfo()Old API Usage

API Updates

API-Usage ChangespublicNetworkInfo[]getAllNetworkInfo()

publicNetwork[]getAllNetworks()

New API Usage

publicNetworkInfogetNetworkInfo(Networknetwork)

publicNetworkInfo[]getAllNetworkInfo()Old API Usage

Update ExampleUpdate Example Before Update Example After

publicbooleanisConnected(Contextcont){ConnectivityManagercm=...;NetworkInfo[]info=cm.getAllNetworkInfo();for(inti=0;i<info.length;i++){if(info[i].isConnected()){returntrue;}}Toast.makeText(R.s.noNet).show();returnfalse;}

publicbooleanisConnected(Contextcont){ConnectivityManagercm=...;if(VERSION.SDK_INT>=VERSION_CODES.M){Network[]networks=cm.getAllNetworks();for(NetworkmNetwork:networks){NetworkInfonetworkInfo=cm.getNetworkInfo(mNetwork);if(networkInfo.isConnected()){Log.d(networkInfo.getTypeName());returntrue;}}}else{NetworkInfo[]info=cm.getAllNetworkInfo();for(NetworkInfoanInfo:info){if(anInfo.isConnected()){Log.d(anInfo.getTypeName());returntrue;}}}Toast.makeText(cont.getString(...)).show();returnfalse;}

Update ExampleUpdate Example Before Update Example After

publicbooleanisConnected(Contextcont){ConnectivityManagercm=...;NetworkInfo[]info=cm.getAllNetworkInfo();for(inti=0;i<info.length;i++){if(info[i].isConnected()){returntrue;}}Toast.makeText(R.s.noNet).show();returnfalse;}

publicbooleanisConnected(Contextcont){ConnectivityManagercm=...;if(VERSION.SDK_INT>=VERSION_CODES.M){Network[]networks=cm.getAllNetworks();for(NetworkmNetwork:networks){NetworkInfonetworkInfo=cm.getNetworkInfo(mNetwork);if(networkInfo.isConnected()){Log.d(networkInfo.getTypeName());returntrue;}}}else{NetworkInfo[]info=cm.getAllNetworkInfo();for(NetworkInfoanInfo:info){if(anInfo.isConnected()){Log.d(anInfo.getTypeName());returntrue;}}}Toast.makeText(cont.getString(...)).show();returnfalse;}

Update Example AfterpublicbooleanisConnected(Contextcont){ConnectivityManagercm=...;if(VERSION.SDK_INT>=VERSION_CODES.M){Network[]networks=cm.getAllNetworks();for(NetworkmNetwork:networks){NetworkInfonetworkInfo=cm.getNetworkInfo(mNetwork);if(networkInfo.isConnected()){Log.d(networkInfo.getTypeName());returntrue;}}}else{NetworkInfo[]info=cm.getAllNetworkInfo();for(NetworkInfoanInfo:info){if(anInfo.isConnected()){Log.d(anInfo.getTypeName());returntrue;}}}Toast.makeText(cont.getString(...)).show();returnfalse;}

Update ExampleUpdate Example Before

publicbooleanisConnected(Contextcont){ConnectivityManagercm=...;NetworkInfo[]info=cm.getAllNetworkInfo();for(NetworkInfoanInfo:info){if(info[i].isConnected()){returntrue;}}Toast.makeText(R.s.noNet).show();returnfalse;}

publicbooleanisConnected(Contextcont){ConnectivityManagercm=...;if(VERSION.SDK_INT>=VERSION_CODES.M){Network[]networks=cm.getAllNetworks();for(NetworkmNetwork:networks){NetworkInfonetworkInfo=cm.getNetworkInfo(mNetwork);if(networkInfo.isConnected()){Log.d(networkInfo.getTypeName());returntrue;}}}else{NetworkInfo[]info=cm.getAllNetworkInfo();for(NetworkInfoanInfo:info){if(anInfo.isConnected()){Log.d(anInfo.getTypeName());returntrue;}}}Toast.makeText(cont.getString(...)).show();returnfalse;}

Update Example After

Update ExampleUpdate Example Before

publicbooleanisConnected(Contextcont){ConnectivityManagercm=...;NetworkInfo[]info=cm.getAllNetworkInfo();for(NetworkInfoanInfo:info){if(info[i].isConnected()){returntrue;}}Toast.makeText(R.s.noNet).show();returnfalse;}

APPEVOLVE Overview

Identify API usages requiring update in target

app

Find update examples for identified API

usages

Abstract update examples into generic update

patches and rank them

Update and validate API

usages in target app based on

patches

APPEVOLVE Overview

Identify API usages requiring update in target

app

Find update examples for identified API

usages

Abstract update examples into generic update

patches and rank them

Update and validate API

usages in target app based on

patches

APPEVOLVE Overview

Identify API usages requiring update in target

app

Find update examples for identified API

usages

Abstract update examples into generic update

patches and rank them

Update and validate API

usages in target app based on

patches

Update Example SearchCode Hosting Infrastructure

Keyword-Based Search

∀ ∈methodsignature New API Usage

Search ResultCode Base App1 Code Base App2 Code Base App3 Code Base App4

f1i−n

f1i−1

f1i

f2j−1

f2j

f4k−1

f4k

method name, param types, declaring class

Update Example SearchCode Hosting Infrastructure

Keyword-Based Search

∀ ∈methodsignature New API Usage

Search ResultCode Base App1 Code Base App2 Code Base App3 Code Base App4

f1i−n

f1i−1

f1i

f2j−1

f2j

f4k−1

f4k

Search ResultCode Base App1 Code Base App2 Code Base App3 Code Base App4

f1i−n

f1i−1

f1i

f2j−1

f2j

f4k−1

f4k

method name, param types, declaring class

Update Example SearchCode Hosting Infrastructure

Keyword-Based Search

∀ ∈methodsignature New API Usage

Search ResultCode Base App1 Code Base App2 Code Base App3 Code Base App4

f1i−n

f1i−1

f1i

f2j−1

f2j

f4k−1

f4k

Search ResultCode Base App1 Code Base App2 Code Base App3 Code Base App4

f1i−n

f1i−1

f1i

f2j−1

f2j

f4k−1

f4k

method name, param types, declaring class

Update Example Search

publicbooleanisConnected(Contextcont){ConnectivityManagercm=...;NetworkInfo[]info=cm.getAllNetworkInfo();for(inti=0;i<info.length;i++){if(info[i].isConnected()){returntrue;}}Toast.makeText(R.s.noNet).show();returnfalse;}

publicbooleanisConnected(Contextcont){ConnectivityManagercm=...;if(VERSION.SDK_INT>=VERSION_CODES.M){Network[]networks=cm.getAllNetworks();for(NetworkmNetwork:networks){NetworkInfonetworkInfo=cm.getNetworkInfo(mNetwork);if(networkInfo.isConnected()){Log.d(networkInfo.getTypeName());returntrue;}}}else{NetworkInfo[]info=cm.getAllNetworkInfo();for(NetworkInfoanInfo:info){if(anInfo.isConnected()){Log.d(anInfo.getTypeName());returntrue;}}}Toast.makeText(cont.getString(...)).show();returnfalse;}

( f1i−1)Before Update ( f1i

)After Update

publicbooleanisConnected(Contextcont){ConnectivityManagercm=...;+if(VERSION.SDK_INT>=VERSION_CODES.M){+Network[]networks=cm.getAllNetworks();+for(NetworkmNetwork:networks){+NetworkInfonetworkInfo=+cm.getNetworkInfo(mNetwork);+if(networkInfo.isConnected()){+Log.d(networkInfo.getTypeName());returntrue;}}+}else{+NetworkInfo[]info=cm.getAllNetworkInfo();+for(NetworkInfoanInfo:info){+if(anInfo.isConnected()){+Log.d(anInfo.getTypeName());+returntrue;+}}+}+Toast.makeText(cont.getString(...)).show();returnfalse;}

Update Example SearchCompute Differences

publicbooleanisConnected(Contextcont){ConnectivityManagercm=...;-NetworkInfo[]info=cm.getAllNetworkInfo();-for(inti=0;i<info.length;i++){-if(info[i].isConnected()){returntrue;}}-Toast.makeText(R.s.noNet).show();returnfalse;}

( f1i−1)Before Update ( f1i

)After Update

publicbooleanisConnected(Contextcont){ConnectivityManagercm=...;+if(VERSION.SDK_INT>=VERSION_CODES.M){+Network[]networks=cm.getAllNetworks();+for(NetworkmNetwork:networks){+NetworkInfonetworkInfo=+cm.getNetworkInfo(mNetwork);+if(networkInfo.isConnected()){+Log.d(networkInfo.getTypeName());returntrue;}}+}else{+NetworkInfo[]info=cm.getAllNetworkInfo();+for(NetworkInfoanInfo:info){+if(anInfo.isConnected()){+Log.d(anInfo.getTypeName());+returntrue;+}}+}+Toast.makeText(cont.getString(...)).show();returnfalse;}

Update Example SearchCompute Differences

publicbooleanisConnected(Contextcont){ConnectivityManagercm=...;-NetworkInfo[]info=cm.getAllNetworkInfo();-for(inti=0;i<info.length;i++){-if(info[i].isConnected()){returntrue;}}-Toast.makeText(R.s.noNet).show();returnfalse;}

( f1i−1)Before Update ( f1i

)After Update

Added check on platform version

Added new API Usage

Moved old API Usage

publicbooleanisConnected(Contextcont){ConnectivityManagercm=...;+if(VERSION.SDK_INT>=VERSION_CODES.M){+Network[]networks=cm.getAllNetworks();+for(NetworkmNetwork:networks){+NetworkInfonetworkInfo=+cm.getNetworkInfo(mNetwork);+if(networkInfo.isConnected()){+Log.d(networkInfo.getTypeName());returntrue;}}+}else{+NetworkInfo[]info=cm.getAllNetworkInfo();+for(NetworkInfoanInfo:info){+if(anInfo.isConnected()){+Log.d(anInfo.getTypeName());+returntrue;+}}+}+Toast.makeText(cont.getString(...)).show();returnfalse;}

Update Example SearchCompute Differences

publicbooleanisConnected(Contextcont){ConnectivityManagercm=...;-NetworkInfo[]info=cm.getAllNetworkInfo();-for(inti=0;i<info.length;i++){-if(info[i].isConnected()){returntrue;}}-Toast.makeText(R.s.noNet).show();returnfalse;}

( f1i−1)Before Update ( f1i

)After Update

Added check on platform version

Added new API Usage

Moved old API Usage

Update Example

publicbooleanisConnected(Contextcont){ConnectivityManagercm=...;+if(VERSION.SDK_INT>=VERSION_CODES.M){+Network[]networks=cm.getAllNetworks();+for(NetworkmNetwork:networks){+NetworkInfonetworkInfo=+cm.getNetworkInfo(mNetwork);+if(networkInfo.isConnected()){+Log.d(networkInfo.getTypeName());returntrue;}}+}else{+NetworkInfo[]info=cm.getAllNetworkInfo();+for(NetworkInfoanInfo:info){+if(anInfo.isConnected()){+Log.d(anInfo.getTypeName());+returntrue;+}}+}+Toast.makeText(cont.getString(...)).show();returnfalse;}

Update Example SearchCompute Differences

publicbooleanisConnected(Contextcont){ConnectivityManagercm=...;-NetworkInfo[]info=cm.getAllNetworkInfo();-for(inti=0;i<info.length;i++){-if(info[i].isConnected()){returntrue;}}-Toast.makeText(R.s.noNet).show();returnfalse;}

( f1i−1)Before Update ( f1i

)After Update

Added check on platform version

Added new API Usage

Moved old API Usage

Update ExampleUpdate ExamplesCode Base App1 Code Base App2 Code Base App4Code Base App3

APPEVOLVE Overview

Identify API usages requiring update in target

app

Find update examples for identified API

usages

Abstract update examples into generic update

patches and rank them

Update and validate API

usages in target app based on

patches

Update Example Analysis

publicbooleanisConnected(Contextcont){ConnectivityManagercm=...;NetworkInfo[]info=cm.getAllNetworkInfo();for(inti=0;i<info.length;i++){if(info[i].isConnected()){returntrue;}}Toast.makeText(R.s.noNet).show();returnfalse;}

publicbooleanisConnected(Contextcont){ConnectivityManagercm=...;if(VERSION.SDK_INT>=VERSION_CODES.M){Network[]networks=cm.getAllNetworks();for(NetworkmNetwork:networks){NetworkInfonetworkInfo=cm.getNetworkInfo(mNetwork);if(networkInfo.isConnected()){Log.d(networkInfo.getTypeName());returntrue;}}}else{NetworkInfo[]info=cm.getAllNetworkInfo();for(NetworkInfoanInfo:info){if(anInfo.isConnected()){Log.d(anInfo.getTypeName());returntrue;}}}Toast.makeText(cont.getString(...)).show();returnfalse;}

( f1i−1)Update Example Before ( f1i

)Update Example AfterCompute Update Patch

Update Example Analysis( f1i−1

)Abstract Syntax Tree Before ( f1i)Abstract Syntax Tree After

Compute Update Patch

Update Example Analysis( f1i−1

)Abstract Syntax Tree Before ( f1i)Abstract Syntax Tree After

Compute Update Patch

Edit OperationsINSERT(sn1, sn2, i)MOVE(sn1, sn2, i)UPDATE(sn1, sn2)DELETE(sn1)

Update Example Analysis( f1i−1

)Abstract Syntax Tree Before ( f1i)Abstract Syntax Tree After

Compute Update Patch

Raw Edit ScriptINSERTifVERSION.SDK_INT>=VERSION_CODES.MUPDATEToast.makeText(R.s.noNet).show()Toast.makeText(cont.getString(...)).show()INSERTNetwork[]networks=cm.getAllNetworks()INSERTforNetworkmNetwork:networksMOVERTNetworkInfo[]info=cm.getAllNetworkInfo()INSERTNetworkInfonI=cm.getNetworkInfo(mNetwork)UPDATEifinfo[i].isConnected()ifnI.isConnected()MOVERTifnI.isConnected()INSERTLog.d(networkInfo.getTypeName())INSERTforNetworkInfoanInfo:infoINSERTifanInfo.isConnected()INSERTLog.d(anInfo.getTypeName())INSERTreturntrueDELETEforinti=0i<info.lengthi++

Update Example Analysis( f1i−1

)Abstract Syntax Tree Before ( f1i)Abstract Syntax Tree After

Unrelated EditsINSERTifVERSION.SDK_INT>=VERSION_CODES.MUPDATEToast.makeText(R.s.noNet).show()Toast.makeText(cont.getString(...)).show()INSERTNetwork[]networks=cm.getAllNetworks()INSERTforNetworkmNetwork:networksMOVERTNetworkInfo[]info=cm.getAllNetworkInfo()INSERTNetworkInfonI=cm.getNetworkInfo(mNetwork)UPDATEifinfo[i].isConnected()ifnI.isConnected()MOVERTifnI.isConnected()INSERTLog.d(networkInfo.getTypeName())INSERTforNetworkInfoanInfo:infoINSERTifanInfo.isConnected()INSERTLog.d(anInfo.getTypeName())INSERTreturntrueDELETEforinti=0i<info.lengthi++

Compute Update Patch

Update Example Analysis( f1i−1

)Abstract Syntax Tree Before ( f1i)Abstract Syntax Tree After

Edit ScriptINSERTifVERSION.SDK_INT>=VERSION_CODES.M

INSERTNetwork[]networks=cm.getAllNetworks()INSERTforNetworkmNetwork:networksMOVERTNetworkInfo[]info=cm.getAllNetworkInfo()INSERTNetworkInfonI=cm.getNetworkInfo(mNetwork)UPDATEifinfo[i].isConnected()ifnI.isConnected()MOVERTifnI.isConnected()INSERTLog.d(networkInfo.getTypeName())INSERTforNetworkInfoanInfo:infoINSERTifanInfo.isConnected()INSERTLog.d(anInfo.getTypeName())INSERTreturntrueDELETEforinti=0i<info.lengthi++

Dependency Analysis

Compute Update Patch

Update Example Analysis( f1i−1

)Abstract Syntax Tree Before ( f1i)Abstract Syntax Tree After

Unneeded EditsINSERTifVERSION.SDK_INT>=VERSION_CODES.M

INSERTNetwork[]networks=cm.getAllNetworks()INSERTforNetworkmNetwork:networksMOVERTNetworkInfo[]info=cm.getAllNetworkInfo()INSERTNetworkInfonI=cm.getNetworkInfo(mNetwork)UPDATEifinfo[i].isConnected()ifnI.isConnected()MOVERTifnI.isConnected()INSERTLog.d(networkInfo.getTypeName())INSERTforNetworkInfoanInfo:infoINSERTifanInfo.isConnected()INSERTLog.d(anInfo.getTypeName())INSERTreturntrueDELETEforinti=0i<info.lengthi++

Compute Update Patch

INSERTifVERSION.SDK_INT>=VERSION_CODES.MINSERTNetwork[]networks=cm.getAllNetworks()INSERTforNetworkmNetwork:networksMOVERTNetworkInfo[]info=cm.getAllNetworkInfo()INSERTNetworkInfonI=cm.getNetworkInfo(mNetwork)UPDATEifinfo[i].isConnected()ifnI.isConnected()MOVERTifnI.isConnected()INSERTLog.d(networkInfo.getTypeName())INSERTforNetworkInfoanInfo:infoINSERTifanInfo.isConnected()INSERTLog.d(anInfo.getTypeName())INSERTreturntrueDELETEforinti=0i<info.lengthi++

Edit Script Update Example #1

Update Example Analysis

INSERTifVERSION.SDK_INT>=VERSION_CODES.MINSERTNetwork[]networks=cMan.getAllNetworks()INSERTforNetworkmNetwork:networksMOVERTNetworkInfo[]info=cMan.getAllNetworkInfo()INSERTNetworkInfonI=cMan.getNetworkInfo(mNetwork)UPDATEifinfo[i].getState()==CONNECTEDifnI.getState()==CONNECTEDMOVERTifnI.getState()==CONNECTEDINSERTforNetworkInfoanInfo:infoINSERTifanInfo.getState()==CONNECTEDINSERTreturntrueDELETEforintj=0j<info.lengthj++

Edit Script Update Example #2

Edit Script Abstraction #1

Update Example AnalysisEdit Script Abstraction #2

Find common core using Multiple Longest Common Subsequence (MLCS)

MLCS Solution

Core Proximity Value|MLC Solution |

|Edit Script |

Core Proximity Value = 0.62 Core Proximity Value = 0.72

INSERTifVERSION.SDK_INT>=VERSION_CODES.MINSERTNetwork[]networks=$V.getAllNetworks()INSERTforNetworkmNetwork:networksMOVERTNetworkInfo[]info=$V.getAllNetworkInfo()INSERTNetworkInfonI=$V.getNetworkInfo(mNetwork)UPDATEifinfo[i].isConnected()ifnI.isConnected()MOVERTifnI.isConnected()INSERTLog.d(networkInfo.getTypeName())INSERTforNetworkInfoanInfo:infoINSERTifanInfo.isConnected()INSERTLog.d(anInfo.getTypeName())INSERTreturntrueDELETEforinti=0i<info.lengthi++

Edit Script

Update Example Analysis

Core Proximity Value = 0.62

Context Variable Computation

Context Variables[($V,ConnectivityManager:cm)]

INSERTifVERSION.SDK_INT>=VERSION_CODES.MINSERTNetwork[]networks=$V.getAllNetworks()INSERTforNetworkmNetwork:networksMOVERTNetworkInfo[]info=$V.getAllNetworkInfo()INSERTNetworkInfonI=$V.getNetworkInfo(mNetwork)UPDATEifinfo[i].isConnected()ifnI.isConnected()MOVERTifnI.isConnected()INSERTLog.d(networkInfo.getTypeName())INSERTforNetworkInfoanInfo:infoINSERTifanInfo.isConnected()INSERTLog.d(anInfo.getTypeName())INSERTreturntrueDELETEforinti=0i<info.lengthi++

Edit Script

Update Example Analysis

Core Proximity Value = 0.62

Generic Update Patch

Context Variables[($V,ConnectivityManager:cm)]

INSERTifVERSION.SDK_INT>=VERSION_CODES.MINSERTNetwork[]networks=$V.getAllNetworks()INSERTforNetworkmNetwork:networksMOVERTNetworkInfo[]info=$V.getAllNetworkInfo()INSERTNetworkInfonI=$V.getNetworkInfo(mNetwork)UPDATEifinfo[i].isConnected()ifnI.isConnected()MOVERTifnI.isConnected()INSERTLog.d(networkInfo.getTypeName())INSERTforNetworkInfoanInfo:infoINSERTifanInfo.isConnected()INSERTLog.d(anInfo.getTypeName())INSERTreturntrueDELETEforinti=0i<info.lengthi++

Edit Script

Update Example Analysis

Core Proximity Value = 0.62

Generic Update Patch

Context Variables[($V,ConnectivityManager:cm)]

Generic Update Patches

1st 2nd 3rd

APPEVOLVE Overview

Identify API usages requiring update in target

app

Find update examples for identified API

usages

Abstract update examples into generic update

patches and rank them

Update and validate API

usages in target app based on

patches

INSERTifVERSION.SDK_INT>=VERSION_CODES.MINSERTNetwork[]networks=$V.getAllNetworks()INSERTforNetworkmNetwork:networksMOVERTNetworkInfo[]info=$V.getAllNetworkInfo()INSERTNetworkInfonI=$V.getNetworkInfo(mNetwork)UPDATEifinfo[i].getState()==CONNECTEDifnI.getState()==CONNECTEDMOVERTifnI.getState()==CONNECTEDINSERTforNetworkInfoanInfo:infoINSERTifanInfo.getState()==CONNECTEDINSERTreturntrueDELETEforintj=0j<info.lengthj++

Core Proximity Value = 0.72

Context Variables[($V,ConnectivityManager:cMan)]

API-Usage Update

publicbooleanhasNetwork(Contextcontext){ConnectivityManagerconn=...;NetworkInfo[]netInfo=conn.getAllNetworkInfo();for(intk=0;k<netInfo;k++){if(netInfo[k].getState()==NetworkInfo.State.CONNECTED){returntrue;}}returnfalse;}

Target App Code Generic Update Patch

Edit Script

INSERTifVERSION.SDK_INT>=VERSION_CODES.MINSERTNetwork[]networks=cMan.getAllNetworks()INSERTforNetworkmNetwork:networksMOVERTNetworkInfo[]info=cMan.getAllNetworkInfo()INSERTNetworkInfonI=cMan.getNetworkInfo(mNetwork)UPDATEifinfo[i].getState()==CONNECTEDifnI.getState()==CONNECTEDMOVERTifnI.getState()==CONNECTEDINSERTforNetworkInfoanInfo:infoINSERTifanInfo.getState()==CONNECTEDINSERTreturntrueDELETEforintj=0j<info.lengthj++

Core Proximity Value = 0.72

Context Variables

API-Usage Update

publicbooleanhasNetwork(Contextcontext){ConnectivityManagerconn=...;NetworkInfo[]netInfo=conn.getAllNetworkInfo();for(intk=0;k<netInfo;k++){if(netInfo[k].getState()==NetworkInfo.State.CONNECTED){returntrue;}}returnfalse;}

Target App Code Generic Update Patch

Edit Script

[($V,ConnectivityManager:cMan)]

Analyze Variables in Scope

INSERTifVERSION.SDK_INT>=VERSION_CODES.MINSERTNetwork[]networks=$V.getAllNetworks()INSERTforNetworkmNetwork:networksMOVERTNetworkInfo[]info=$V.getAllNetworkInfo()INSERTNetworkInfonI=$V.getNetworkInfo(mNetwork)UPDATEifinfo[i].getState()==CONNECTEDifnI.getState()==CONNECTEDMOVERTifnI.getState()==CONNECTEDINSERTforNetworkInfoanInfo:infoINSERTifanInfo.getState()==CONNECTEDINSERTreturntrueDELETEforintj=0j<info.lengthj++

Core Proximity Value = 0.72

Context Variables

API-Usage UpdateAbstract Syntax Tree Target App Generic Update Patch

Edit Script

[($V,ConnectivityManager:cMan)]

[($V,ConnectivityManager:conn)]

INSERTifVERSION.SDK_INT>=VERSION_CODES.MINSERTNetwork[]networks=$V.getAllNetworks()INSERTforNetworkmNetwork:networksMOVERTNetworkInfo[]info=$V.getAllNetworkInfo()INSERTNetworkInfonI=$V.getNetworkInfo(mNetwork)UPDATEifinfo[i].getState()==CONNECTEDifnI.getState()==CONNECTEDMOVERTifnI.getState()==CONNECTEDINSERTforNetworkInfoanInfo:infoINSERTanInfo.getState()==CONNECTEDINSERTreturntrueDELETEforintj=0j<info.lengthj++

Core Proximity Value = 0.72

Context Variables

API-Usage UpdateUpdated Abstract Syntax Tree Target App Generic Update Patch

Edit Script

[($V,ConnectivityManager:cMan)]

[($V,ConnectivityManager:conn)]

INSERTifVERSION.SDK_INT>=VERSION_CODES.MINSERTNetwork[]networks=$V.getAllNetworks()INSERTforNetworkmNetwork:networksMOVERTNetworkInfo[]info=$V.getAllNetworkInfo()INSERTNetworkInfonI=$V.getNetworkInfo(mNetwork)UPDATEifinfo[i].getState()==CONNECTEDifnI.getState()==CONNECTEDMOVERTifnI.getState()==CONNECTEDINSERTforNetworkInfoanInfo:infoINSERTanInfo.getState()==CONNECTEDINSERTreturntrueDELETEforintj=0j<info.lengthj++

Core Proximity Value = 0.72

Context Variables

API-Usage UpdateUpdated Target App Code Generic Update Patch

Edit Script

[($V,ConnectivityManager:cMan)]

[($V,ConnectivityManager:conn)]

publicbooleanhasNetwork(Contextcontext){ConnectivityManagerconn=...;if(VERSION.SDK_INT>=VERSION_CODES.M){Network[]networks=conn.getAllNetworks();for(NetworkmNetwork:networks){NetworkInfonetworkInfo=conn.getNetworkInfo(mNetwork);if(networkInfo.getState()==NetworkInfo.State.CONNECTED){returntrue;}}}else{NetworkInfo[]info=conn.getAllNetworkInfo();for(NetworkInfoanInfo:info){if(anInfo.getState()==NetworkInfo.State.CONNECTED){returntrue;}}}returnfalse;}

API-Usage Update

New Platform

Differential Testing

Old Platform

API-Usage Update

New Platform

Differential Testing

Old Platform

TargetApp

API-Usage Update

New Platform

Differential Testing

Old Platform

TargetApp

UpdatedTargetApp

UpdatedTargetApp

Empirical Evaluation

RQ1 (EFFECTIVENESS): Can APPEVOLVE update API usages in real-world apps?

RQ2 (EFFICIENCY): What is the cost of running APPEVOLVE?

Research Questions

Empirical Evaluation

RQ1 (EFFECTIVENESS): Can APPEVOLVE update API usages in real-world apps?

RQ2 (EFFICIENCY): What is the cost of running APPEVOLVE?

Research Questions

RQ1 (EFFECTIVENESS): Can APPEVOLVE update API usages in real-world apps?

Empirical Evaluation

RQ1 (EFFECTIVENESS): Can APPEVOLVE update API usages in real-world apps?

RQ2 (EFFICIENCY): What is the cost of running APPEVOLVE?

Research Questions

RQ1 (EFFECTIVENESS): Can APPEVOLVE update API usages in real-world apps?

RQ2 (EFFICIENCY): What is the cost of running APPEVOLVE?

Benchmarks and Setup

20 API UsagesaddActiongetAllNetworkInfogetCurrentHourgetCurrentMinutesetCurrentHoursetCurrentMinutesetTextAppearance

addGpsStatusListenerfromHtmlreleaseremoveGpsStatusListenershouldOverrideUrlLoadingstartDrag

abandonAudioFocusgetDeviceIdrequestAudioFocussaveLayersetAudioStreamTypevibrate(long)vibrate(long[],int)

(41 occurrences)

Lollipop Marshmallow Nougat

15 AppsBIPOLALARMCONVERSATIONSPARKENDDCLEAN SBOPENSUDOKU

WIGLE WIFIFOOTGUYCALENDAR IEDIOLINUXSOLAR COMPASS

SYMPHONYSYSLOGMUZEINOTESONETWO

Setup• Ran technique on benchmarks• Measured successful update and validation rate• Measured execution time

Benchmarks and Setup

20 API UsagesaddActiongetAllNetworkInfogetCurrentHourgetCurrentMinutesetCurrentHoursetCurrentMinutesetTextAppearance

addGpsStatusListenerfromHtmlreleaseremoveGpsStatusListenershouldOverrideUrlLoadingstartDrag

abandonAudioFocusgetDeviceIdrequestAudioFocussaveLayersetAudioStreamTypevibrate(long)vibrate(long[],int)

(41 occurrences)

Lollipop Marshmallow Nougat

15 AppsBIPOLALARMCONVERSATIONSPARKENDDCLEAN SBOPENSUDOKU

WIGLE WIFIFOOTGUYCALENDAR IEDIOLINUXSOLAR COMPASS

SYMPHONYSYSLOGMUZEINOTESONETWO

20 API UsagesaddActiongetAllNetworkInfogetCurrentHourgetCurrentMinutesetCurrentHoursetCurrentMinutesetTextAppearance

addGpsStatusListenerfromHtmlreleaseremoveGpsStatusListenershouldOverrideUrlLoadingstartDrag

abandonAudioFocusgetDeviceIdrequestAudioFocussaveLayersetAudioStreamTypevibrate(long)vibrate(long[],int)

(41 occurrences)

Setup• Ran technique on benchmarks• Measured successful update and validation rate• Measured execution time

Benchmarks and Setup

20 API UsagesaddActiongetAllNetworkInfogetCurrentHourgetCurrentMinutesetCurrentHoursetCurrentMinutesetTextAppearance

addGpsStatusListenerfromHtmlreleaseremoveGpsStatusListenershouldOverrideUrlLoadingstartDrag

abandonAudioFocusgetDeviceIdrequestAudioFocussaveLayersetAudioStreamTypevibrate(long)vibrate(long[],int)

(41 occurrences)

Lollipop Marshmallow Nougat

15 AppsBIPOLALARMCONVERSATIONSPARKENDDCLEAN SBOPENSUDOKU

WIGLE WIFIFOOTGUYCALENDAR IEDIOLINUXSOLAR COMPASS

SYMPHONYSYSLOGMUZEINOTESONETWO

20 API UsagesaddActiongetAllNetworkInfogetCurrentHourgetCurrentMinutesetCurrentHoursetCurrentMinutesetTextAppearance

addGpsStatusListenerfromHtmlreleaseremoveGpsStatusListenershouldOverrideUrlLoadingstartDrag

abandonAudioFocusgetDeviceIdrequestAudioFocussaveLayersetAudioStreamTypevibrate(long)vibrate(long[],int)

(41 occurrences)

Setup• Ran technique on benchmarks• Measured successful update and validation rate• Measured execution time

Setup• Ran technique on benchmarks• Measured successful update and validation rate• Measured execution time

Evaluation: EffectivenessRQ1 (EFFECTIVENESS): Can APPEVOLVE update API usages in real-world apps?

• In 19/20 cases, APPEVOLVE could find update examples• In 14/19 cases, the number of relevant edits is lower than the number of AST edits • In 11/19 cases, the core proximity value is different from its minimum and maximum

Details

APPEVOLVE is effective in automatically updating API usages.

RQ1 (EFFECTIVENESS): Can APPEVOLVE update API usages in real-world apps?

• 37/41 (90%) successful update rate (for API-usage occurrences)• 25/37 (68%) automatic validation rate (for API-usage occurrences)

Overall Effectivness

• 17/20 (85%) successful update rate (for API usages)

Evaluation: EffectivenessRQ1 (EFFECTIVENESS): Can APPEVOLVE update API usages in real-world apps?

• In 19/20 cases, APPEVOLVE could find update examples• In 14/19 cases, the number of relevant edits is lower than the number of AST edits • In 11/19 cases, the core proximity value is different from its minimum and maximum

Details

APPEVOLVE is effective in automatically updating API usages.

RQ1 (EFFECTIVENESS): Can APPEVOLVE update API usages in real-world apps?

• 37/41 (90%) successful update rate (for API-usage occurrences)• 25/37 (68%) automatic validation rate (for API-usage occurrences)

Overall Effectivness

• 17/20 (85%) successful update rate (for API usages)

• In 19/20 cases, APPEVOLVE could find update examples• In 14/19 cases, the number of relevant edits is lower than the number of AST edits • In 11/19 cases, the core proximity value is different from its minimum and maximum

Details

Evaluation: EffectivenessRQ1 (EFFECTIVENESS): Can APPEVOLVE update API usages in real-world apps?

• In 19/20 cases, APPEVOLVE could find update examples• In 14/19 cases, the number of relevant edits is lower than the number of AST edits • In 11/19 cases, the core proximity value is different from its minimum and maximum

Details

APPEVOLVE is effective in automatically updating API usages.

RQ1 (EFFECTIVENESS): Can APPEVOLVE update API usages in real-world apps?

• 37/41 (90%) successful update rate (for API-usage occurrences)• 25/37 (68%) automatic validation rate (for API-usage occurrences)

Overall Effectivness

• 17/20 (85%) successful update rate (for API usages)

• In 19/20 cases, APPEVOLVE could find update examples• In 14/19 cases, the number of relevant edits is lower than the number of AST edits • In 11/19 cases, the core proximity value is different from its minimum and maximum

Details

APPEVOLVE is effective in automatically updating API usages.

Evaluation: Efficiency

RQ2 (EFFICIENCY): What is the cost of running APPEVOLVE?

API-UsageAnalysis

Update ExamplesSearch

Update ExamplesAnalysis

API-UsageUpdate

28s 10h27m 2s204ms 20s

The cost of the update examples search phase dominates the cost of the other phases.

Average Execution TimeAPI-UsageAnalysis

Update ExamplesSearch

Update ExamplesAnalysis

API-UsageUpdate

28s 10h27m 2s204ms 20s

The cost of the update examples search phase dominates the cost of the other phases.

Average Execution Time

Future Work

Handle updates that span across multiple methods

Automatically compute API change specifications

Improve validation through differential testing

Investigate use of APPEVOLVE in other contexts (e.g., web apps)

Future Work

Handle updates that span across multiple methods

Automatically compute API change specifications

Improve validation through differential testing

Investigate use of APPEVOLVE in other contexts (e.g., web apps)

Handle updates that span across multiple methods

Future Work

Handle updates that span across multiple methods

Automatically compute API change specifications

Improve validation through differential testing

Investigate use of APPEVOLVE in other contexts (e.g., web apps)

Handle updates that span across multiple methods

Automatically compute API change specifications

Future Work

Handle updates that span across multiple methods

Automatically compute API change specifications

Improve validation through differential testing

Investigate use of APPEVOLVE in other contexts (e.g., web apps)

Handle updates that span across multiple methods

Automatically compute API change specifications

Improve validation through differential testing

Future Work

Handle updates that span across multiple methods

Automatically compute API change specifications

Improve validation through differential testing

Investigate use of APPEVOLVE in other contexts (e.g., web apps)

Handle updates that span across multiple methods

Automatically compute API change specifications

Improve validation through differential testing

Investigate use of APPEVOLVE in other contexts (e.g., web apps)

Summary

Summary

https://b.gatech.edu/2JKkpWV

Artifact

Related Work

Example Based Program Update

SYDIT, LASE, RASE, MEDITOR, REFAZER, ARES,…

Other Techniques

ICTAPIFINDER, CHANGEDISTILLING

top related