Android系统源码_AndroidStudio导入AOSP

发布于:2025-03-12 ⋅ 阅读:(13) ⋅ 点赞:(0)

在Android Studio中导入AOSP源码后,点击方法无法跳转通常是由于索引不完整或配置不当。以下是解决步骤:

1、确保源码完整
同步代码:使用 repo sync 确保所有源码已下载。

检查目录:确认 frameworks、packages 等关键目录存在。

2、生成IDE配置文件
执行命令:

source build/envsetup.sh
lunch <target>
make idegen 
development/tools/idegen/idegen.sh

脚本运行成功,会在源码根目录生成 android.ipr 和 android.iml 文件。

android.ipr:一般保存了工程相关的设置,比如 modules 和 modules libraries 的路径,编译器配置,入口点等。
android.iml:用来描述modules。它包括modules路径、 依赖关系,顺序设置等。一个项目可以包含多个 *.iml 文件。

3、如果development/tools/idegen/idegen.sh时间太长或者总是卡住,可以尝试修改如下代码:

development/tools/idegen/src/Configuration.java

public class Configuration {

	...代码省略...
    private static void traverse(File directory, Set<File> sourceRoots,
                                 Collection<File> jarFiles, Collection<File> excludedDirs,
                                 Excludes excludes) throws IOException {
        boolean firstJavaFile = true;
        File[] files = directory.listFiles();
        if (files == null) {
            return;
        }
        for (File file : files) {
            System.out.println("file >> " + file);
            if (file == null) {
                continue;
            }
            //额外添加的判断
            if (file.getPath().startsWith("system") || file.getPath().contains("frameworks")) {
                // Trim preceding "./" from path.
                String path = file.getPath().substring(2);

                // Skip nonexistent files/diretories, e.g. broken symlinks.
                if (!file.exists()) {
                    Log.debug("Skipped nonexistent: " + path);
                    continue;
                }

                if (file.isDirectory()) {
                    // Traverse nested directories.
                    if (excludes.exclude(path)) {
                        // Don't recurse into excluded dirs.
                        Log.debug("Excluding: " + path);
                        excludedDirs.add(file);
                    } else {
                        traverse(file, sourceRoots, jarFiles, excludedDirs,
                                excludes);
                    }
                } else if (path.endsWith(".java")) {
                    // Keep track of source roots for .java files.
                    // Do not check excludes in this branch.
                    if (firstJavaFile) {
                        // Only parse one .java file per directory.
                        firstJavaFile = false;

                        File sourceRoot = rootOf(file);
                        if (sourceRoot != null) {
                            sourceRoots.add(sourceRoot);
                        }
                    }
                } else if (path.endsWith(".jar")) {
                    // Keep track of .jar files.
                    if (excludes.exclude(path)) {
                        Log.debug("Skipped: " + file);
                    } else {
                        jarFiles.add(file);
                    }
                }
            }
        }
    }
	...代码省略...
}

以上代码会让脚本只生成frameworks和package目录的代码索引,修改之后,重新执行 make idegen,然后再执行 development/tools/idegen/idegen.sh

4、android.iml的主要内容
在这里插入图片描述

<excludeFolder url="file://$MODULE_DIR$/out/eclipse"/>
<excludeFolder url="file://$MODULE_DIR$/.repo"/>
<excludeFolder url="file://$MODULE_DIR$/external/bluetooth"/>
<excludeFolder url="file://$MODULE_DIR$/external/chromium"/>
<excludeFolder url="file://$MODULE_DIR$/external/icu4c"/>
<excludeFolder url="file://$MODULE_DIR$/external/webkit"/>
<excludeFolder url="file://$MODULE_DIR$/frameworks/base/docs"/>
<excludeFolder url="file://$MODULE_DIR$/out/host"/>
<excludeFolder url="file://$MODULE_DIR$/out/target/common/docs"/>
<excludeFolder url="file://$MODULE_DIR$/out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates"/>
<excludeFolder url="file://$MODULE_DIR$/out/target/product"/>
<excludeFolder url="file://$MODULE_DIR$/prebuilt"/>
<excludeFolder url="file://$MODULE_DIR$/abi"/>
<excludeFolder url="file://$MODULE_DIR$/art"/>
<excludeFolder url="file://$MODULE_DIR$/bionic"/>
<excludeFolder url="file://$MODULE_DIR$/bootable"/>
<excludeFolder url="file://$MODULE_DIR$/build"/>
<excludeFolder url="file://$MODULE_DIR$/cts"/>
<excludeFolder url="file://$MODULE_DIR$/dalvik"/>
<excludeFolder url="file://$MODULE_DIR$/developers"/>
<excludeFolder url="file://$MODULE_DIR$/development"/>
<excludeFolder url="file://$MODULE_DIR$/device"/>
<excludeFolder url="file://$MODULE_DIR$/docs"/>
<excludeFolder url="file://$MODULE_DIR$/external"/>
<excludeFolder url="file://$MODULE_DIR$/hardware"/>
<excludeFolder url="file://$MODULE_DIR$/kernel"/>
<excludeFolder url="file://$MODULE_DIR$/libcore"/>
<excludeFolder url="file://$MODULE_DIR$/libnativehelper"/>
<excludeFolder url="file://$MODULE_DIR$/ndk"/>
<excludeFolder url="file://$MODULE_DIR$/out"/>
<excludeFolder url="file://$MODULE_DIR$/pdk"/>
<excludeFolder url="file://$MODULE_DIR$/platform_testing"/>
<excludeFolder url="file://$MODULE_DIR$/prebuilts"/>
<excludeFolder url="file://$MODULE_DIR$/rc_projects"/>
<excludeFolder url="file://$MODULE_DIR$/sdk"/>
<excludeFolder url="file://$MODULE_DIR$/system"/>
<excludeFolder url="file://$MODULE_DIR$/tools"/>
<excludeFolder url="file://$MODULE_DIR$/trusty"/>
<excludeFolder url="file://$MODULE_DIR$/u-boot"/>
<excludeFolder url="file://$MODULE_DIR$/vendor"/>
<excludeFolder url="file://$MODULE_DIR$/toolchain"/>
<excludeFolder url="file://$MODULE_DIR$/rkbin"/>
<excludeFolder url="file://$MODULE_DIR$/RKDocs"/>
<excludeFolder url="file://$MODULE_DIR$/rkst"/>
<excludeFolder url="file://$MODULE_DIR$/RKTools"/>
<excludeFolder url="file://$MODULE_DIR$/rockdev"/>
<excludeFolder url="file://$MODULE_DIR$/test"/>

5、导入项目
打开Android Studio,选择 Open,导入 android.ipr 文件,一定要配置好JDK和SDK
等待索引完成:首次导入时,索引可能需要较长时间。
在这里插入图片描述

6、配置JDK和SDK
JDK:确保使用AOSP推荐的JDK版本(通常为OpenJDK)。
SDK:设置正确的Android SDK路径。

7、调整模块配置
打开Project Structure,检查模块的依赖项是否正确。

8、重建索引
删除索引:关闭项目,删除 .idea 和 *.iml 文件。
重新导入:重新打开项目并等待索引完成。