diff --git a/aidegen/lib/common_util.py b/aidegen/lib/common_util.py
index 9173685..804ae3b 100644
--- a/aidegen/lib/common_util.py
+++ b/aidegen/lib/common_util.py
@@ -41,14 +41,6 @@
 OUTSIDE_ROOT_ERROR = '{} is outside android root.'
 PATH_NOT_EXISTS_ERROR = 'The path {} doesn\'t exist.'
 NO_MODULE_DEFINED_ERROR = 'No modules defined at {}.'
-# Java related classes.
-JAVA_TARGET_CLASSES = ['APPS', 'JAVA_LIBRARIES', 'ROBOLECTRIC']
-# C, C++ related classes.
-NATIVE_TARGET_CLASSES = [
-    'HEADER_LIBRARIES', 'NATIVE_TESTS', 'STATIC_LIBRARIES', 'SHARED_LIBRARIES'
-]
-TARGET_CLASSES = JAVA_TARGET_CLASSES
-TARGET_CLASSES.extend(NATIVE_TARGET_CLASSES)
 _REBUILD_MODULE_INFO = '%s We should rebuild module-info.json file for it.'
 _ENVSETUP_NOT_RUN = ('Please run "source build/envsetup.sh" and "lunch" before '
                      'running aidegen.')
diff --git a/aidegen/lib/module_info.py b/aidegen/lib/module_info.py
index 244ddf4..7d86a05 100644
--- a/aidegen/lib/module_info.py
+++ b/aidegen/lib/module_info.py
@@ -23,8 +23,18 @@
 from aidegen import constant
 from aidegen.lib import common_util
 from aidegen.lib import module_info_util
+from atest import constants
 from atest import module_info
 
+# Java related classes.
+JAVA_TARGET_CLASSES = ['APPS', 'JAVA_LIBRARIES', 'ROBOLECTRIC']
+# C, C++ related classes.
+NATIVE_TARGET_CLASSES = [
+    'HEADER_LIBRARIES', 'NATIVE_TESTS', 'STATIC_LIBRARIES', 'SHARED_LIBRARIES'
+]
+TARGET_CLASSES = JAVA_TARGET_CLASSES
+TARGET_CLASSES.extend(NATIVE_TARGET_CLASSES)
+
 
 class AidegenModuleInfo(module_info.ModuleInfo):
     """Class that offers fast/easy lookup for Module related details.
@@ -114,3 +124,21 @@
         module_file_rel_path = os.path.relpath(
             merged_file_path, common_util.get_android_root_dir())
         return module_file_rel_path, merged_file_path
+
+    @staticmethod
+    def is_target_module(mod_info):
+        """Determine if the module is a target module.
+
+        Determine if a module's class is in TARGET_CLASSES.
+
+        Args:
+            mod_info: A module's module-info dictionary to be checked.
+
+        Returns:
+            A boolean, true if it is a target module, otherwise false.
+        """
+        if mod_info:
+            return any(
+                x in mod_info.get(constants.MODULE_CLASS, [])
+                for x in TARGET_CLASSES)
+        return False
diff --git a/aidegen/lib/module_info_unittest.py b/aidegen/lib/module_info_unittest.py
new file mode 100644
index 0000000..d874191
--- /dev/null
+++ b/aidegen/lib/module_info_unittest.py
@@ -0,0 +1,40 @@
+#!/usr/bin/env python3
+#
+# Copyright 2019, The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Unittests for module_info."""
+
+import unittest
+
+from aidegen.lib.module_info import AidegenModuleInfo
+
+
+class AidegenModuleInfoUnittests(unittest.TestCase):
+    """Unit tests for module_info.py"""
+
+    def test_is_target_module(self):
+        """Test is_target_module with different conditions."""
+        self.assertFalse(AidegenModuleInfo.is_target_module({}))
+        self.assertFalse(AidegenModuleInfo.is_target_module({'path': ''}))
+        self.assertFalse(AidegenModuleInfo.is_target_module({'class': ''}))
+        self.assertTrue(AidegenModuleInfo.is_target_module({'class': ['APPS']}))
+        self.assertTrue(
+            AidegenModuleInfo.is_target_module({'class': ['JAVA_LIBRARIES']}))
+        self.assertTrue(
+            AidegenModuleInfo.is_target_module({'class': ['ROBOLECTRIC']}))
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/aidegen/lib/project_info.py b/aidegen/lib/project_info.py
index 4dd6591..3f50d2a 100644
--- a/aidegen/lib/project_info.py
+++ b/aidegen/lib/project_info.py
@@ -23,6 +23,7 @@
 
 from aidegen import constant
 from aidegen.lib import common_util
+from aidegen.lib import module_info
 
 _ANDROID_MK = 'Android.mk'
 _ANDROID_BP = 'Android.bp'
@@ -165,39 +166,23 @@
            project path.
         """
         logging.info('Find modules whose class is in %s under %s.',
-                     common_util.TARGET_CLASSES, self.project_relative_path)
+                     module_info.TARGET_CLASSES, self.project_relative_path)
         for name, data in self.modules_info.name_to_module_info.items():
             if common_util.is_project_path_relative_module(
                     data, self.project_relative_path):
-                if self._is_a_target_module(data):
+                if self.modules_info.is_target_module(data):
                     self.project_module_names.add(name)
                     if self.modules_info.is_robolectric_test(name):
                         self.project_module_names.add(_ROBOLECTRIC_MODULE)
                 else:
                     logging.debug(_NOT_TARGET, name, data['class'],
-                                  common_util.TARGET_CLASSES)
+                                  module_info.TARGET_CLASSES)
 
     def _filter_out_modules(self):
         """Filter out unnecessary modules."""
         for module in _EXCLUDE_MODULES:
             self.dep_modules.pop(module, None)
 
-    @staticmethod
-    def _is_a_target_module(data):
-        """Determine if the module is a target module.
-
-        A module's class is in {'APPS', 'JAVA_LIBRARIES', 'ROBOLECTRIC'}
-
-        Args:
-            data: the module-info dictionary of the checked module.
-
-        Returns:
-            A boolean, true if is a target module, otherwise false.
-        """
-        if not 'class' in data:
-            return False
-        return any(x in data['class'] for x in common_util.TARGET_CLASSES)
-
     def get_dep_modules(self, module_names=None, depth=0):
         """Recursively find dependent modules of the project.
 
diff --git a/aidegen/lib/project_info_unittest.py b/aidegen/lib/project_info_unittest.py
index 96ea627..dce10eb 100644
--- a/aidegen/lib/project_info_unittest.py
+++ b/aidegen/lib/project_info_unittest.py
@@ -66,27 +66,6 @@
         proj_info = project_info.ProjectInfo(self.args.module_name)
         self.assertEqual(proj_info.dep_modules, _EXPECT_DEPENDENT_MODULES)
 
-    def test_is_a_target_module(self):
-        """Test _is_a_target_module with different conditions."""
-        self.assertEqual(project_info.ProjectInfo._is_a_target_module({}),
-                         False)
-        self.assertEqual(project_info.ProjectInfo._is_a_target_module(
-            {'path': ''}), False)
-        self.assertEqual(project_info.ProjectInfo._is_a_target_module(
-            {'class': ''}), False)
-        self.assertEqual(
-            project_info.ProjectInfo._is_a_target_module({
-                'class': ['APPS']
-            }), True)
-        self.assertEqual(
-            project_info.ProjectInfo._is_a_target_module({
-                'class': ['JAVA_LIBRARIES']
-            }), True)
-        self.assertEqual(
-            project_info.ProjectInfo._is_a_target_module({
-                'class': ['ROBOLECTRIC']
-            }), True)
-
     @mock.patch.object(common_util, 'get_android_root_dir')
     def test_get_target_name(self, mock_get_root):
         """Test _get_target_name with different conditions."""
