在用Eclipse 调试程序的时候,一旦发生异常,往往在回退栈里面提示找不到源代码.
如下图所示
网 上搜索了一下,发现一个 fix_android_sdk.py 脚本,可以提取完整的java 文件到SDK 目录,尝试了一下,还是蛮有用的,可惜就是源代码只能看,不能设置断点。这个是用来编译ASE的一个脚本,里面的部分涉及到ASE的部分我们是用不到,并 且也没法用的,所以被我万恶的删除了。
1.首先要下载完整的Android源代码,建议下载一下,说不定哪天就用上了。
对 于以前的脚本进行了修改,然后现在可以判断当前的Android 的源代码版本了,如果定义过 "ANDROID_SDK_ROOT"环境变量的话,会使用环境变量中的值拷贝到制定的目录,比如Android 4.1.2 的源代码,现在可以拷贝到 Android-16 目录下面了,不需要再从android-1.5 下面拷贝出来了。 下面贴上最新的源代码脚本,供各位参考。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
#!/usr/bin/python # Copyright (C) 2009 Google Inc. # # 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. # # Originally written by Mike Forster. # http://blog.michael-forster.de/2008/12/view-android-source-code-in-eclipse.html from __future__ import with_statement # for Python < 2.6 """Modifies the Android SDK to build Android Scripting Environment. This script compiles android.os.Exec from the Android source and adds the class to the Android SDK android.jar. In addition, it copies the source files into the SDK so that they can be browsed from Eclipse. In order to use this script, you must have download the Android source and installed the Android SDK. """ __author__ = 'Damon Kohler <damonkohler@gmail.com>' import os import re import shutil import sys def validate_source_and_sdk_locations(src_location, sdk_location): if not os.path.exists(src_location): print 'Android source location is invalid.' sys.exit(1) if not os.path.exists(sdk_location): print 'SDK location is invalid.' sys.exit(1) #read the Android Source Version from "build\core\version_defaults.mk" VerFilePath = os.path.join(src_location,'build','core','version_defaults.mk') DefSavePath = os.path.join(sdk_location, 'platforms', 'android-1.5′) if not os.path.isfile(VerFilePath): print 'Can not read the version from "%s" files will be save in path "%s"'%(VerFilePath,DefSavePath) else: fl = file(VerFilePath,"r") for s in fl.readlines(): li = re.findall("PLATFORM_SDK_VERSION\s*:=\s*\S*",s) if li: p = re.compile(r'\s*:=\s*') ver = p.split(s) ver = ver[1].strip() DefSavePath = os.path.join(sdk_location, 'platforms', 'android-%s'%(ver)) break fl.close() return DefSavePath def copy_sources(src_location, sdk_location): sdk = validate_source_and_sdk_locations(src_location, sdk_location) out = os.path.join(src_location, 'out') sources = os.path.join(sdk, 'sources') if not os.path.exists(sources): os.makedirs(sources) print 'Copying sources from %s to %s' % (src_location, sources) # Some files are duplicated, copy them only once. written = {} # Iterate over all Java files. for dir, subdirs, files in os.walk(src_location): if dir.startswith(out): continue # Skip copying stub files. for filename in [f for f in files if f.endswith('.java')]: # Search package name. source = os.path.join(dir, filename) with open(source) as f: for line in f: match = re.match(r'\s*package\s+([a-zA-Z0-9\._]+);', line) if match: package_path = match.group(1).replace('.', os.sep) try: os.makedirs(os.path.join(sources, package_path)) except os.error: pass destination = os.path.join(sources, package_path, filename) if destination not in written: written[destination] = True shutil.copy(source, destination) break if __name__ == '__main__': if len(sys.argv) == 3: src_location, sdk_location = sys.argv[1:3] #if user don't input any param,we make the current path as the android source path #and we will detect the envionment ANDROID_SDK_ROOT elif len(sys.argv) == 1: sdk_location = os.environ.get('ANDROID_SDK_ROOT') if 0 == len(sdk_location): print 'fix_android_sdk.py <android-source> <android-sdk>' sys.exit(1) src_location = os.getcwd() else: print 'fix_android_sdk.py <android-source> <android-sdk>' sys.exit(1) try: copy_sources(src_location, sdk_location) except KeyboardInterrupt: print '\nAborted.' else: print 'Done!' |