1 背景介绍

随着android studio的完善和普及,越来越多Android app开发者从Eclipse+ADT环境转到Android Studio(后文统一用AS表示)。但是,AS往往需要较新的SDK,从目前的测试结果来看,在MAC OSX 10.10系统中很多基于老版本SDK开发的东西并不能完美运行在新版本的SDK中,即两者并不能完美兼容,比如,在Eclipse+ADT环境中创建的模拟器镜像或快照就无法在AS中使用(具体表现为模拟器或快照无法启动,或启动之后马上crash)。因此,最好的解决方案就是在系统中同时使用两套SDK,老版本的给Eclipse使用,新版本的用于AS。

目前检测到的主要问题发生在DDMS上,貌似新版SDK中的DDMS并不能兼容原来版本较旧的Eclipse。具体原因待以后有时间了再深究~

2 如何创建两套SDK

创建两套SDK很简单,但是如何让两套SDK独立运行且互不干扰却相对麻烦。为方便描述,下文将老版的SDK目录称做old_sdk,新版的SDK目录称作new_sdk。

首先由于笔者当前还是以Eclipse开发为主,所以默认SDK就是old_sdk,只有在使用AS的时候才需要用到new_sdk。因此,笔者在~/.bash_profile文件中做了如下配置:

#default sdk
export ANDROID_HOME=/Users/your_user_name/android/env/old-android-sdks

这样我们在启动程序的时候默认就是用上述old_sdk目录。那么如何在启动AS的时候使用new_sdk呢?同样是在~/.bash_profile中操作,这里我们添加一条alias命令:

# set new sdk envrionment for Android Studio
alias myas='export ANDROID_HOME=/Users/your_user_name/android/env/new-android-sdks && open -a /Applications/Android\ Studio.app/'

通过上面的设置,当我们需要使用AS的时候只需要在终端中输入myas即可。不过这种方式并不完美,因为如果我们新开一个终端,然后使用adb命令的话,其默认是使用老版的adb,这或多或少会出现一些兼容性问题。为什么会这样呢?答案见bash_profile中的PATH环境变量的设置:

export  PATH=/user/local/bin:$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools

因为PATH的值是在我们更改ANDROID_HOME之前就设置完成的,所以此时的ANDROID_HOME是old_sdk。因此最好的方式就是提供一个alias命令可以一次性切换ANDROID_HOME和PATH:

# set new sdk envrionment for Android Studio
alias change_android_sdk='export ANDROID_HOME=/Users/your_user_name/android/env/new-android-sdks && export PATH=$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH'
alias myas='change_android_sdk && open -a /Applications/Android\ Studio.app/'

通过上述设置,就能确保在AS中使用的一定是new_sdk,且当我们在AS环境下进行Android编程的时候,如果要使用到adb之类的命令,只需要在新的终端中使用change_android_sdk命令就能切换到new_sdk了。

3 遇到的一些奇特bug集锦

问题一:模拟器快照crash问题

注意:为了方便,笔者是使用emulator命令启动的模拟器快照,而非通过Emulator Devices Manager。

由于当初是使用old_sdk创建的模拟器快照,因此该快照并不能与new_sdk兼容。具体crash场景就是:

先在old_sdk环境下启动快照,一切正常。
然后使用myas打开Android Studio,一切正常。
然后在myas中运行一个app到快照中,一切正常。
这时候关闭快照,然后重新启动快照,出现BUG,快照无法启动,或者很快crash! 为什么会这样呢?因为启动了AS之后当前系统中运行的adb, ddms之类的组件都是来自new_sdk的,而笔者启动的快照必须基于old_sdk,所以就出现了兼容性问题。
解决方案如下:
首先关闭Android Studio, 然后打开Eclipse(新开一个终端使用open命令打开,或者直接通过系统自带的快捷方式启动),这时候Eclipse会自动启动old_sdk中的满足Eclipse运行的必备的组件(如adb, ddms等),且这些组件会替换掉当前系统中正在运行的、由AS启动的那些new_sdk组件,此时我们再启动模拟器快照就没有问题了!

4 总结

   模拟器快照crash问题卡了笔者整整两天时间,起见还进行过一次系统还原o(╯□╰)o。很幸运最后能够解决这个问题,因为终于可以一边保持原有Eclipse环境,一边享受Android Studio带来的高效开发了!

鉴于MAC与Linux的相似性,上述方案应该也可以应用到Linux环境中,只是上述.bash_profile文件会根据具体的系统而不同,常见的等效文件名如下:

.bash_login   .bashrc   .profile

MAC中如何配置两套android-sdk环境的更多相关文章

  1. Mac 下配置 Cocos2d-x 3-x android 的环境

    本人初学Cocos2d 3-x,环境配置,搭建android环境弄了好长时间,走了不少弯路,翻阅了好多人的博客和文档,包括官方文档讲的似乎有些似懂非懂,好多依然是旧的版本,所以把我的整个过程梳理一下. ...

  2. react-native —— 在Mac上配置React Native Android开发环境排坑总结

    配置React Native Android开发环境总结 1.卸载Android Studio,在终端(terminal)执行以下命令: rm -Rf /Applications/Android\ S ...

  3. windows下JDK环境配置与Android SDK环境配置

    一.JDK环境配置1.配置变量名:JAVA_HOME变量值:jdk安装的绝对路径. 变量名:Path(在系统变量中找到并选中Path点击下面的编辑按钮,不要删除原本变量值中的任何一个字母,在这个变量值 ...

  4. 配置android sdk 环境

    1:下载adnroid sdk安装包 官方下载地址无法打开,没有vpn,使用下面这个地址下载,地址:http://www.android-studio.org/

  5. 安卓测试【一】android sdk环境变量配置

    移动应用自动化测试的配置,先于官网下载Android SDK,然后配置环境变量. 配置android sdk环境变量 1.  新建ANDROID_HOME环境变量,变量值为SDK解压的路径 2. 追加 ...

  6. 配置cordova的android开发环境(无android studio)

    原文:配置cordova的android开发环境(无android studio) 趁元旦放假想试一下cordova,不想安装庞大的android studio,所以想最小化安装,居然花了一整天的时间 ...

  7. 装载 | Eclipse中搭建最新版本的Android开发环境

    文章目录 准备工作 下载文件 下载JDK并配置系统变量环境 下载安装Eclipse 下载Android SDK 下载ADT插件 使用下载好的软件搭建Android开发环境 安装Android的SDK ...

  8. 【转】在NetBeans上搭建Android SDK环境

    本文将介绍在NetBeans 6.8上搭建Android SDK环境,目前Android在Netbeans上进行开发需要借助nbandroid的平台插件. 我们刚刚介绍过<MyEclipse上搭 ...

  9. Mac OS配置Android SDK环境变量(当不存在 .bash_profile 文件的时候)

    苹果系统已经包含完整的J2SE,其中就有JDK和JVM(苹果叫VM). 如果要在MAC系统下开发CODE.可以先装个IDE(NETBEANS/Eclipse等),而后不需要装JDK和JVM了,MAC下 ...

随机推荐

  1. 红帽CentOS7 密码破解

    1.在启动的时候按住方向键停留在内核选项页面,在内核选项出按e键 2.进入到另一个页面后,寻找到以linux16开头的地方,按end到行后,输入空格,然后输入rd.break console=tty0 ...

  2. django中的分页管理

    有时,展示的对象太多,需要对他们进行分页展示,不能一页把所有的结果都展示出来吧,那样的话,哈哈,挺逗 使用Django分页器功能 从Django中导入Paginator模块(没有的话,自行下载,我是w ...

  3. POJ 2441 状压DP

    Arrange the Bulls Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 5289   Accepted: 2033 ...

  4. Kings(状压DP)

    Description 用字符矩阵来表示一个8x8的棋盘,'.'表示是空格,'P'表示人质,'K'表示骑士.每一步,骑士可以移动到他周围的8个方格中的任意一格.如果你移动到的格子中有人质(即'P'), ...

  5. saltstack特点

    目录 saltstack特点 saltstack特点 实时交互 所有的minion机器同时执行命令 no freeloader 每一台salt minion上都装有执行master传来的命令所需要的程 ...

  6. 9 10mins的投票功能

    1.投票的原理 2.投票的数据结构设计 (1)准备工作 导入detail页面 配置静态文件 <link rel="stylesheet" href="../stat ...

  7. MySQL单表查询语句练习题

    /*1. 查询出部门编号为30的所有员工*/ /* 分析: 1). 列:没有说明要查询的列,所以查询所有列 2). 表:只一张表,emp 3). 条件:部门编号为30,即deptno=30 */ ; ...

  8. 《Cracking the Coding Interview》——第16章:线程与锁——题目3

    2014-04-27 19:26 题目:哲学家吃饭问题,死锁问题经典模型(专门用来黑哲学家的?). 解法:死锁四条件:1. 资源互斥.2. 请求保持.3. 非抢占.4. 循环等待.所以,某砖家拿起一只 ...

  9. python之urllib.request.urlopen(url)报错urllib.error.HTTPError: HTTP Error 403: Forbidden处理及引申浏览器User Agent处理

    最近在跟着院内大神学习python的过程中,发现使用urllib.request.urlopen(url)请求服务器是报错: 在园子里找原因,发现原因为: 只会收到一个单纯的对于该页面访问的请求,但是 ...

  10. 分享6个网址二维码API接口

    1.http://pan.baidu.com/share/qrcode?w=150&h=150&url=http://www.54admin.net 2.http://b.bshare ...