11/* BSD 2-Clause License - see OPAL/LICENSE for details. */
22package org .opalj
3- package tac
4- package cg
3+ package br
54package android
65
76import scala .collection .mutable .ArrayBuffer
8- import scala .jdk .CollectionConverters .CollectionHasAsScala
97
108import org .opalj .br .Method
119import org .opalj .br .MethodDescriptor
1210import org .opalj .br .ReferenceType
1311import org .opalj .br .analyses .ProjectInformationKeys
1412import org .opalj .br .analyses .SomeProject
1513import org .opalj .br .analyses .cg .EntryPointFinder
16- import org .opalj .br .android .AndroidManifest
17- import org .opalj .br .android .AndroidManifestKey
18- import org .opalj .tac .fpcf .analyses .MethodDescription
14+
15+ import net .ceedubs .ficus .Ficus ._
1916
2017/**
21- * The AndroidEntryPointFinder considers specific methods of launcher Activity Clases as entry points.
18+ * The AndroidEntryPointFinder considers specific methods of launcher Activity Classes as entry points.
2219 * An activity is a launcher activity if it contains an intent filter with action "android.intent.action.MAIN"
2320 * and category "android.intent.category.LAUNCHER". Requires Android Manifest to be loaded.
2421 *
2522 * @author Julius Naeumann
2623 */
27- object AndroidEntryPointsFinder extends EntryPointFinder {
24+ object AndroidEntryPointFinder extends EntryPointFinder {
2825
29- val configKey = " org.opalj.tac.cg. android.AndroidEntryPointsFinder .entryPoints"
26+ val configKey = " org.opalj.fpcf. android.AndroidEntryPointFinder .entryPoints"
3027
3128 override def requirements (project : SomeProject ): ProjectInformationKeys = {
3229 super .requirements(project) ++ Seq (AndroidManifestKey )
@@ -44,8 +41,12 @@ object AndroidEntryPointsFinder extends EntryPointFinder {
4441 // iterate over launchable classes, collect their respective entry point methods according to config
4542 for (componentClass <- launchableClasses) {
4643 for (epd <- entryPointDescriptions) {
47- if (classHierarchy.isASubtypeOf(ReferenceType (componentClass.fqn), ReferenceType (epd.cf)).isYesOrUnknown) {
48- entryPoints ++= componentClass.findMethod(epd.name, MethodDescriptor (epd.desc))
44+ if (classHierarchy.isASubtypeOf(
45+ ReferenceType (componentClass.fqn),
46+ ReferenceType (epd.declaringClass)
47+ ).isYesOrUnknown
48+ ) {
49+ entryPoints ++= componentClass.findMethod(epd.name, MethodDescriptor (epd.descriptor))
4950 }
5051 }
5152 }
@@ -54,8 +55,15 @@ object AndroidEntryPointsFinder extends EntryPointFinder {
5455 }
5556
5657 private def getConfiguredEntryPoints (project : SomeProject ) = {
57- val entryPointDescriptionsConfig = project.config.getConfigList(configKey).asScala.toArray
58- val entryPointDescriptions = entryPointDescriptionsConfig.map(c => MethodDescription .reader.read(c, " " ) )
59- entryPointDescriptions
58+ import net . ceedubs . ficus . readers . ArbitraryTypeReader . _
59+ project.config.as[ List [ EntryPointContainer ]](configKey )
60+
6061 }
62+
63+ /* Required by Ficus' `ArbitraryTypeReader`*/
64+ private case class EntryPointContainer (
65+ declaringClass : String ,
66+ name : String ,
67+ descriptor : String
68+ )
6169}
0 commit comments