今天编译了android 2.3源码,即gingerbread。源代码是通过"repo init -u git://android.git.kernel.org/platform/manifest.git -b gingerbread"取出的。

编译完成后,启动SDKManager发现在"Installed packages"中无法找到编译出来的android-2.3

进入编译结果目录 out/host/linux-x86/sdk/android-sdk_eng.cmoaciopm_linux-x86/tools 发现android-2.3是存在的,那为什么SDKManager检测不到呢?

很蛋疼的查看了sdkmanager的源代码,终于找到问题所在

sdkmanager的源代码存放在sdk/sdkmanager下,包含三个工程

1. app:sdkmanager主界面及接口逻辑

2. lib/sdklib:sdkmanager核心逻辑

3. lib/sdkuilib:sdkmanager的子UI组件代码


SdkManager.reloadSdk()是检测installed packages的方法,检测标准如下

1. 校验build.prop文件,
    从ro.build.version.release获取apiName
    从ro.build.version.sdk获取apiNumber
    从ro.build.version.codename获取apiCodeName(optional)
2. 校验source.properties
    Pkg.Revision
    非必须
3. 校验sdk.properties
    非必须
4. 校验platforms/[sdk-version]/目录下的关键文件是否存在
    android.jar
    framework.aidl
    tools/aapt
    tools/aidl
    tools/dx
    tools/lib/dx.jar

看到这里,终于知道SDKManager无法检测到Install packages的原因了,我所检出的android gingerbread源代码编译出的sdk目录结构与SDKManager检测逻辑是不一致的。

android在2.3对sdk目录结构进行了调整,将platform下面的tools文件夹移动到SDK根目录下,命名为platform-tools(里面包含了该platform的aapt和adb等工具。这样,platform在各操作系统下都统一了,不需要再为不同操作系统发布不同的platform,仅发布不同的platform-tools即可)。

可见gingerbreak代码分支中sdkmanager的代码不是“最新的”,没有与编译出来的sdk目录结构保持一致。google也有失误的时候,这么大的项目也可以理解

了解了以上事实,于是乎做了软链接,骗过sdkmanager,重启检测一切正常


PS : android-sdk目录的tools下的andriod命令,指定-v参数可以显示errorwarning的日志,通过这个参数就能查看到sdkmanager的警告和错误日志了


更多相关文章

  1. Android(安卓)java.lang.NoClassDefFoundError的一种解决方法
  2. ubuntu编译ffmpeg的动态库的一些坑
  3. Android(安卓)应用反编译方法
  4. Ubuntu 11.10 64bit系统编译android 2.3的相关问题
  5. (一) 基于Windows的Eclipse安装Android(安卓)NDKR7
  6. Android(安卓)JNI 开发简单介绍
  7. 在Ubuntu 16.04上为树莓派(RaspBerry Pi 3)编译Android(安卓)7(No
  8. Android(安卓)Studio 之 Gradle 安装配置和编译
  9. Androrat 编译运行错误集

随机推荐

  1. android Camera 结构
  2. 使用Android sqlite进行模糊查询
  3. Android RadioGroup 横向显示(X行X列)
  4. 【android】用drawable xml绘制虚线分割
  5. Android各种Color值
  6. Android property系统分析
  7. android enum的简单应用
  8. App ReLoad:用Android(安卓)来控制单反相
  9. android使用.9,png图片作为背景的问题
  10. 【特效】3D旋转环形菜单