如何使用Android Studio开发/调试Android源码
Ros72R
8年前
<p>本文是以源码中development/tools/idegen/README作为指导文档.</p> <p>环境: Ubuntu 14.10,openJdk 1.7,Android Studio 1.0.2,android-5.0.1_r1源码</p> <p>由于AS是基于IntelliJ IDEA开发的,所以本文也适用于IntelliJ IDEA</p> <p> </p> <p><strong>一、修改Android Studio(以下简称AS)的内存配置</strong></p> <p>因为在导入源码时需要消耗大量内存,所以先修改IDEA_HOME/bin/studio64.vmoptions(x86的机器修改studio.vmoptions)中-Xms和-Xmx的值。文档中使用的是748m, 可自行修改。</p> <p> <strong>二、配置AS的JDK、SDK</strong></p> <p>在IDE中添加一个没有classpath的JDK, 这样可以确保使用源码里的库文件</p> <p> <img alt="如何使用Android Studio开发/调试Android源码" src="https://simg.open-open.com/show/f6e06deb7d6a4bcfd634604325f935f0.png" width="890" height="325"></p> <p>并将其作为要使用的SDK的Java SDK。如下图</p> <p><img alt="如何使用Android Studio开发/调试Android源码" src="https://simg.open-open.com/show/877d43cadd926298a24fc9fc86452f63.png" width="986" height="170"></p> <p><strong>三、生成导入AS所需配置文件(*.ipr)</strong></p> <p>①编译源码(为了确保生成了.java文件,如R.java;如果编译过,则无需再次编译)</p> <p>②检查out/host/linux-x86/framework/目录下是否有idegen.jar</p> <p>如果idegen.jar不存在,执行:</p> <pre> mmm development/tools/idegen/</pre> <p>在5.0.1的源码中会生成res.java的文件夹,导致idegen.jar运行时抛FileNotFoundException,这是idegen的代码不够严谨造成的。</p> <p>我的分享里有修改这个bug的patch,或者直接使用我分享的idegen.jar。</p> <p>③执行</p> <pre> development/tools/idegen/idegen.sh</pre> <p>等待出现类似下面的结果:</p> <pre> Read excludes: 5ms Traversed tree: 44078ms</pre> <p>这时会在源码的根目录下生成android.ipr和android.iml两个IntelliJ IDEA(AS是基于IntelliJ IDEA社区版开发的)的配置文件</p> <p>Tips:</p> <p>AS在导入代码时比较慢,建议先修改android.iml,将自己用不到的代码exclude出去.可以仿照过滤.repo文件夹的语法,如:</p> <p><excludeFolder url="file://$MODULE_DIR$/.repo" /><br> <excludeFolder url="file://$MODULE_DIR$/abi" /><br> <excludeFolder url="file://$MODULE_DIR$/art" /></p> <p>删除掉所有不需要的module-library项 PS:感谢 <a href="/misc/goto?guid=4959670885190317841">@dezng</a> 的建议</p> <p>这样在导入时就会跳过abi和art文件夹.过滤的越多,AS的处理速度就会越快.</p> <p>④在AS中打开源码根目录下新生成的android.ipr</p> <p>如果在导入时AS出现</p> <p><img alt="如何使用Android Studio开发/调试Android源码" src="https://simg.open-open.com/show/5a3219ad1ecdc4069244357e5f69b61a.png" width="552" height="49"></p> <p> 则建议按照其给定的解决方法来解决(网址:http://confluence.jetbrains.com/display/IDEADEV/Inotify+Watches+Limit),具体内容如下图:</p> <p><img alt="如何使用Android Studio开发/调试Android源码" src="https://simg.open-open.com/show/2b91e0ee9d35c2648d55ffadead095dc.png" width="1179" height="254"></p> <p><strong>四、解决源码中跳转错误问题</strong></p> <p>①为当前工程设置正确的SDK和JDK</p> <p><img alt="如何使用Android Studio开发/调试Android源码" src="https://simg.open-open.com/show/91f11d5c85335bbbd72c05d0b95352dd.png" width="964" height="282"></p> <p>②设置'Modules'的依赖</p> <p><img alt="如何使用Android Studio开发/调试Android源码" src="https://simg.open-open.com/show/2d646411aebadb94aa8f21c1a20f3240.png" width="1328" height="456"></p> <p>先将所有依赖删掉,只留下上图'1'所指向的两个(注意:这里删除全部只是为了方便。如果确实用到了.jar,在将它们的路径添加进来就可以了.</p> <p>如:5.0.1的ContactsCommon用到了geocoder-2.9.jar和libphonenumber-6.2.jar)</p> <p>点击上图中'2'指向的'+'并选择上图'3'指向的'Jars or directories'选项,依次将frameworks和external文件夹添加进来.如:</p> <p><img alt="如何使用Android Studio开发/调试Android源码" src="https://simg.open-open.com/show/4bcd56a1c16a14c7be521e0a059149ad.png" width="761" height="141"></p> <p>其它版本的代码在添加frameworks时可能会显示成:</p> <p><img alt="如何使用Android Studio开发/调试Android源码" src="https://simg.open-open.com/show/838321e66016ad32361b13a932a89169.png" width="741" height="29"></p> <p>没有关系,只是显示问题,点击OK还是会把frameworks路径添加进去的.</p> <p>如果还有代码跳转错误,请仿照上面的步骤将相应代码的路径或jar文件添加到其Dependencies标签页中即可.</p> <p><strong>五、DEBUG源码</strong></p> <p>我们可以通过给刚导入的工程在'Modules'中添加'Android Framework'来让AS将它作为一个Android工程,从而方便我们调试代码.</p> <p><img alt="如何使用Android Studio开发/调试Android源码" src="https://simg.open-open.com/show/82f536d4e8f4907b5ef6398d6c52c343.png" width="1147" height="316"></p> <p>可以按照上图中'1'和'2'来添加Android Framework支持.</p> <p>在代码中加断点,然后选择'Run'->'Attach debugger to Android process'或者直接点击下图所示的图标<img alt="如何使用Android Studio开发/调试Android源码" src="https://simg.open-open.com/show/242d30dddf78ed08141f315cc2c1545d.png" width="763" height="82"></p> <p>在弹出的选择进程(Choose Process)对话框中,勾选显示所有进程,选择要DEBUG的代码所在的进程,点击OK即可.</p> <p><strong>六、其它</strong></p> <p>代码中很多地方提示Call requires API Level x.... 出现这个问题是因为AS将我们的工程当做安卓应用程序工程了,且源码中没有指定minSdkVersion.</p> <p>我们只需在源码根目录加一个声明minSdkVersion的AndroidManifest.xml文件即可(分享了一个AndroidManifest.xml)。</p> <p>也可以考虑使用build.gradle来解决该问题。</p> <p> </p> <p>文中所使用的文件地址:http://yunpan.cn/cf3MBa2688eBw (提取码: 64e5)</p> <p>来自:http://www.cnblogs.com/Lefter/p/4176991.html</p>