Automated API-Usage Update for Android Apps
Post on 03-Feb-2022
9 Views
Preview:
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