老牛知点所以然-Linux(Ubuntu)配置安卓开发环境及过程中常见问题解决


题记:
这篇博客基本上是半年多实践过程中积累到笔记中的。在第二次配置完开发环境后,我就有意识的把大概的配置过程形成了一个笔记,这半年多将近一年的时间里,陆续发现了一些不足和谬误,还有以前踩过的坑没有及时记下来,最近又踩过的,逐渐补充了过来,算是比较完善了,所以这篇博客不仅是一个开发环境的教程,还包括一些简单常用软件的安装,比如让人又爱又恨的sogou拼音输入法,还有从惊艳到最终可能要抛弃的为知笔记,还有我自己的一些领悟,想到解决问题各种百度找答案时的苦楚和对分享出答案人来的感激,于是打算利用这个博客做个总结,万一帮到谁呢,是吧。
大概从2017年二三月份,一个偶然的机会开始转到Linux下开发安卓,从此对Linux爱的一发不可收拾,惊艳它对开发人员的友好,环境变量好配置,对硬件水平要求低,不会随着使用时间的增长而变得反应速度慢,蛋疼的重装系统,零配置工作量写C,零配置工作量写Python(别崇拜我,这两门语言我都不会写,只是写过hello world),还有安卓实际上也是一个Linux操作系统,通过使用Linux的PC,促进了我对安卓某些方面的理解。说道这里,特别提一嘴带我使用Ubuntu的一位友人,真正的亦师亦友,不仅仅是带我使用了Ubuntu,还是我开发生涯的领路人,额,扯远了。

Linux安装JDK,配置JDK环境变量

安装JDK或者openjdk都是可以的,二者区别自行百度。安装openjdk的方式比较简单,打开命令终端:

sudo apt-get install openjdk-8-jdk

曾经有一段时间发现安装完openjdk后,AndroidStudio就可以跑起来了,错误的以为openjdk在Ubuntu中是不用配置环境变量的,后来才发现那是AndroidStudio自带了jre,好尴尬。
一次偶然的机会发现上述安装的openjdk没有javac等命令,百度了好久,具体原因依然没有看懂。想要使用甲骨文的JDK,到官网去下载,然后解压,放到那里其实都行,但是我以前查询配置JDK时,见到有一位朋友说过,我们用命令行安装openjdk时,人家放到那里了呢?/usr/lib/jvm目录下了,所以我们也照猫画虎,放到那个目录下就OK了。
环境变量的配置:
这个从网上查的各种方法,不一而足,我现在也说不太好,可能是Linux发行版本的不同,导致有些东西的文件名也不一样(指的是用户目录写的两个配置文件,我见网上有人说在.bash_profile或者在.bashrc里配置的,但是我在Ubuntu中并么有找到这两个文件,而是有.profile和.bashrc,我猜他们是一样的),除了这两个文件可以配置,在/etc/profile中也可以配置。
在这三个配置文件中配置环境变量的异同,我也大概查询了一下,大概意识是在用户目录下配置的环境变量,只对当前用户有效,而在/etc/profile中配置的环境变量,是(系统)全局有效的,而且他们调用顺序也是有差异的,每次都是优先调用系统级别的,所以我也就没有纠结到底是在用户目录下哪个配置文件中配置了(他们两个还有登录式和交互式的区别,晕,不懂。。。),每次都是在/etc/profile中配置:
命令终端中输入:

sudo gedit /etc/profile

在文件末尾追加如下:当然jdk版本,自行换成你自己的

#set oracle jdk environment
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_131
export JRE_HOME=${JAVA_HOME}/jre  
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=${JAVA_HOME}/bin:$PATH

我也没有执行命令让环境变量生效,logout或者重启,java -version,一般情况下就搞定了。

安装SDK和gradle

我也是最近才shamble的意识到,我从来没有自己下载过sdk tool,无论是Windows还是Linux下,都是拷贝别人的过来的,然后安装AndroidStudio时指定了一下SDK路径的。要是自己下载,得一部分一部分的,把那几个模块自行组合起来,什么platform,platform-tools啥的。
所以我的做法是把我原来电脑上的SDK压缩,直接解压到新电脑上,当然.gradle也是。SDK的目录可以自己指定,.gradle这个默认是在home目录下,所以我每次也是将其解压到home目录下。
配置安卓SDK环境变量:
同样的

sudo gedit /etc/profile

在文件末尾追加:目录请自行更换

#set path for android sdk tools
export ANDROID_HOME=/home/laoniu/Android/Sdk
export PATH=$PATH:/home/laoniu/Android/Sdk/tools
export PATH=$PATH:/home/laoniu/Android/Sdk/platform-tools

安装AndroidStudio

将下载好的安装包解压,首次运行,碰到的坑可是不少,概括起来就是因为我选择的操作系统是64位的,而sdk是32位的,所以要想正确运行AndroidStudio,以及后面顺利跑安卓模拟器,都需要安装32位的依赖库。这个也是折腾了好久,踩了很多坑之后才弄明白的。缺少这个32位的依赖,第一个错误就是提示你SDK tools directory is missing,等屁颠屁颠的想去指定SDK位置,发现根本指定不了,提示你Do nothing ! unable to run mksdcard sdk tool.
好吧,开始解决:
关于32位依赖库的安装,最早的解决方案是安装ia32-libs,然而在这篇博客里:
https://blog.csdn.net/hering_linux/article/details/44038691
看到这个ia32-libs从标准源里移除了,所以我没有试这种方式。
取而代之的是:

//更新软件源
sudo apt-get update
//分别执行如下三个命令
sudo apt-get install lib32z1(z后面是1,不是L,这个坑了我好久)
sudo apt-get install lib32ncurses5
sudo apt-get install lib32stdc++6

到了这里,基本上可以愉快的coding了,关于AndroidStudio快捷方式的创建,参照下面Firefox快捷方式的创建。

AndroidStudio创建模拟器报错

如果你安装了32位依赖库,基本上不会碰到啥问题。

  1. 这个就是缺少32位依赖搞的
an error occured while creating AVD
  1. 而这个呢,我也是解决这个问题时才注意到,SDKmanager中SDK tools 中有个Android Emulator需要自己勾选安装一下。
下午3:17	Emulator: [140263414093632]:ERROR:android/android-emu/android/qt/qt_setup.cpp:28:Qt library not found at /home/fozei/Android/Sdk/emulator/lib64/qt/lib
下午3:17	Emulator: Could not launch '/home/fozei/Android/Sdk/emulator/qemu/linux-x86_64/qemu-system-i386': No such file or directory
下午3:17	Emulator: Process finished with exit code 2
  1. 报错如下:
上午8:24    Emulator: libGL error: unable to load driver: i965_dri.so
上午8:24    Emulator: libGL error: driver pointer missing
上午8:24    Emulator: libGL error: failed to load driver: i965
上午8:24    Emulator: libGL error: unable to load driver: i965_dri.so
上午8:24    Emulator: libGL error: driver pointer missing
上午8:24    Emulator: libGL error: failed to load driver: i965
上午8:24    Emulator: libGL error: unable to load driver: swrast_dri.so
上午8:24    Emulator: libGL error: failed to load driver: swrast
上午8:24    Emulator: X Error of failed request:  BadValue (integer parameter out of range for operation)
上午8:24    Emulator: Major opcode of failed request:  156 (GLX)
上午8:24    Emulator: Minor opcode of failed request:  24 (X_GLXCreateNewContext)
上午8:24    Emulator: Value in failed request:  0x0
上午8:24    Emulator: Serial number of failed request:  39
上午8:24    Emulator: Current serial number in output stream:  40
上午8:24    Emulator: Process finished with exit code 1

可能的原因:应该是ANDROID自带的libstdc++库和系统自身的库不兼容
参考博客:http://en.proft.me/2016/05/13/fix-libgl-error-unable-load-driver-i965_driso/
解决办法:

先安装libstdc++库:
Verify that you have installed in your system lib64stdc++6

With a 32 bits operating system :
# apt-get install lib64stdc++6

With a 64 bits operating system with multiarch enabled :
# apt-get install lib64stdc++6:i386

Then link the new installed libraries to the android sdk tools path
这里需要根据自己的路径进行修改。例如我的路径为:/home/fozei/Android/Sdk/emulator/lib64/libstdc++
$ cd $ANDROID_HOME/emulator/lib64/libstdc++
重命名ANDROID自带的libstdc++并备份
$ mv libstdc++.so.6 libstdc++.so.6.bak
建立软连接
$ ln -s /usr/lib64/libstdc++.so.6 $ANDROID_HOME/emulator/lib64/libstdc++
  1. 本机有网络,模拟器不能上网:
    本机dns和模拟器dns不一致导致:
    解决步骤:

    1. 查看本机dns
    2. 运行模拟器,adb shell
    3. getprop | grep net ,结果中[net.dns1]: 开头的就是当前模拟器dns
    4. setprop net.dns1 本机dns
  2. 下来这个就厉害了:

下午6:06	Emulator: libGL error: unable to load driver: nouveau_dri.so
下午6:06	Emulator: libGL error: driver pointer missing
下午6:06	Emulator: libGL error: failed to load driver: nouveau
下午6:06	Emulator: libGL error: unable to load driver: swrast_dri.so
下午6:06	Emulator: libGL error: failed to load driver: swrast
下午6:06	Emulator: X Error of failed request:  BadValue (integer parameter out of range for operation)
下午6:06	Emulator: Major opcode of failed request:  155 (GLX)
下午6:06	Emulator: Minor opcode of failed request:  24 (X_GLXCreateNewContext)
下午6:06	Emulator: Value in failed request:  0x0
下午6:06	Emulator: Serial number of failed request:  33
下午6:06	Emulator: Current serial number in output stream:  34
下午6:06	Emulator: Process finished with exit code 1

我当时还纳闷呢,明明都调好了呀, 怎么模拟器开不起来了?
StackOverflow大法好:

https://stackoverflow.com/questions/36189393/android-studio-avd-error-launching?answertab=votes#tab-top

原来我自己都忘记了加了一块独立显卡。将模拟器的显卡模式改成软件就好了
这里写图片描述

安装FireFox

这个是没有什么坑的,唯一的是最开始的时候,安装完系统发现系统自带FireFox,好开心,不用安装了,可是登录账号密码的时候死活登录不上去,一通百度,原来是FireFox为了适应tc法律规定,搞了海外账号和国内账号,服务器分别部署在国外和国内,且两者数据不互通,我安装的是Ubuntu英文版的,SO,登录国外服务器,但是我又没有注册过,于是登录不上去。
这里就要先把自带的Firefox卸载掉,然后从Firefox中文官网上下载,解压。
卸载有两种方式:
1.从软件中心中installed里找到Firefox,remove掉
2.命令行
关键字查找应用程序的包名:

sudo dpkg --get-selections | grep Firefox

根据查找结果

sudo apt-get purge 想要卸载的应用程序

命令行总是用apt,到底啥是apt?全称:advanced packaging tool;
解压的Firefox,可以放到用户目录下,也可以放到/opt目录下。

建立Firefox桌面快捷方式

这个就没有在win操作系统下舒服了,其实也简单。

  1. 首先,在桌面建立一个空白文档
  2. 输入如下内容
[Desktop Entry]
Encoding=UTF-8
Name=firefox
Exec="/home/laoniu/firefox/firefox"
Icon=/home/laoniu/firefox/browser/icons/mozicon128.png
Terminal=false
StartupNotify=true
Type=Application
Categories=Application;Development;

能看懂吧,起关键作用的是Exec这一行,它指向的是Firefox的可执行程序,Icon这一行,是应用程序的图标。随着Firefox的更新升级,他们的路径可能会发生更改,发现不好用了,随时更改就行。
3. 更改文件名称为:Firefox.desktop,后缀名前面的那个你随便写,不影响的。
4. 右键点击文件,在属性里把那个允许作为应用程序执行选项勾选上,ok了。
这个文件执行到这里,已经是一个桌面快捷方式了,比如你不小心弄错了,需要修改,会发现不是那么方便,因为它已经不是一个文本文件了,重命名啥的也改变不了它的后缀名,这时我的操作是再次在桌面新建一个空白文档,右键,选择打开方式,用Atom打开,在Atom左面的文件树里,能看到刚才我们编辑的那个desktop文件的,这样在Atom里修改里面的内容(这个方法好low,汗!)
ps:Atom的安装马上会说,刚才突然发现用Linux自带的gedit是可以修改那个desktop文件的:

//如路径和文件名不同,自行更换
sudo gedit /home/laoniu/Desktop/Firefox.desktop

命令行安装Atom

俗称阿童木,免费开源,支持多种扩展,有丰富的插件,就是安装包体积比较大,如果用命令行安装,需要等待老长时间:

sudo add-apt-repository ppa:webupd8team/atom
sudo apt-get update
sudo apt-get install atom 

所以我现在都是自己存了一份deb的安装包,直接双击,啊~~~~~

安装sogou输入法

这个坑是踩的最多的,但是sogou正的是好用,虽然总是出点这样那样的毛病,但是总体可以接受,提一嘴为知笔记,这个为知笔记,真的是得忍痛割爱,寻找替代软件了。
说一下我的情况,一直使用的是Ubuntu英文版的,可能有使用麒麟系统的不会向我这么折腾。
安装sougou的deb包,碰到过双击之后,应用中心安装进度不走,卡在那里失败的,是因为系统没有安装软件所需要的依赖,在安装网易云音乐的时候,同样是这个问题,安装办法是:

sodo dpkg -i 文件名.deb
待执行完,看到error后:
sodo apt-get install -f
我的理解是强制安装,修复依赖关系

遇到的问题:

  1. 安装完成后,sogou输入法不能切出
    不管你是重启了还是Logout,你会发现输入法是切不出来的,肿木办?
    首先确定你的system settings —> LangueSupport —> keyboard input method system选项是fcitx;
    然后在屏幕左边任务栏最上边那个Ubuntu图标的Search your computer中搜索fcitx,选择fcitx configuration,就会打开input method configuration窗口,点击左下角那个加号,这时候关键来了:
    在新打开的这个对话框中(add input method),把那个only show current Language复选框的那个按钮取消掉,然后在下方的搜索框中,输入so,就能看到心爱的sogou输入法了,点击OK添加,然后,注销或者重启,就能切出搜狗输入法了。
  2. 搜狗输入法不能输入汉字
    Ubuntu下,搜狗拼音输入法能启动(系统托盘处有图标),但是打不出汉字,打字时选框不正常。
    解决方法是从百度搜索结果里找到的,是别人的一遍博客,可惜忘记哪个了,算是盗链了。
    删除搜狗拼音输入法的配置文件,并重启输入法。
    执行如下指令
    cd ~/.config
    find . -name sogou*
    find . -name Sogou*
    将两次搜索到的配置文件删除即可。

现在sougou好像提示这个错误了,碰到打出乱码的情况,将Home目录下的隐藏目录.sogouinput和.config目录下的SogouPY SogouPY.users sogou-qimpanel这个三个目录,手动删除,注销重新登录即可。
3. 搜狗输入法两个图标
这个也很头疼,有人说fcitx-module-kimpanel就可以了,可是我删除了,搜狗输入法输入乱码,好像问题也没有解决,还有人说这个是因为Ubuntu自带的fcitx不行导致的,这个就尴尬了,所以出了这个问题的时候,我上次是查找出所有fcitx安装包,然后按照上面安卓sogou输入法命令行的方式,重新安装就可以了,fcitx命令如下:

sudo apt-get purge fcitx*

顺带提一嘴,当时为了将fcitx卸载完全,我想把下面这几个也卸载了:

libfcitx-config4:amd64
libfcitx-core0:amd64
libfcitx-gclient0:amd64
libfcitx-qt0:amd64
libfcitx-qt5-1:amd64
libfcitx-utils0:amd64

卸载完Logout,可是输入密码就是进不去桌面,提示我:
4. Failed to start a new session
Open Terminal (CTRL+ALT+T) and run the following command:
$ sudo apt-get install ubuntu-desktop
For users who have it already installed, run the command to reinstall it again:
$ sudo apt-get install --reinstall ubuntu-desktop
Once installed, restart the system. You can use the following command to restart the system or do it manually:
sudo reboot
哎,把链接贴出来吧:
http://sourcedigit.com/16407-how-to-fix-failed-to-start-session-at-ubuntu-login/

安装git

命令行安装git,超级给力:

sudo apt-get install git

配置git

git config --global user.name "Your Name"
git config --global user.email "youremail@domain.com"

安装NODEJS

以前也稀里糊涂的搞过,通过命令行安装的,貌似没有遇到什么问题.这次从官网下载的程序包,解压到自己的目录后,配置环境变量,程序运行ok:

#set path for nodejs
export NODE_HOME=/home/laoniu/nodejs
export PATH=$PATH:$NODE_HOME/bin 
export NODE_PATH=$NODE_HOME/lib/node_modules

神奇的是用这种方式,当你执行sudo npm XXX时,会报命令未找到的错误sudo 运行 npm或node时,出现找不到命令,网上一堆解决办法,无非是将程序包中的可执行文件,链接到/usr/bin目录下.按理说都配置环境变量了,还要这么搞,想不通.

sudo ln -s /home/laoniu/nodejs/bin/node /usr/bin/node
sudo ln -s /home/laoniu/nodejs/bin/npm /usr/bin/npm
sudo ln -s /home/老牛/nodejs/bin/npx /usr/bin/npx

顺便说下npm常见配置的获取:
npm config get registry
npm config get proxy
相应的,设置就是set了,注意,前面的http://貌似是不能省略的

npm config set proxy http://username:password@server:port
npm confit set https-proxy http://username:password@server:port
npm config set registry https://registry.npm.taobao.org

发现了一个坑人的地方:
以安装cordova为例:
设置代理后,执行npm install -g cordova --registry=https://registry.npm.taobao.org可以安装,但是前面加上sudo就不行了!!!
cordova安装好后,必须将安装的可执行文件,也就是/home/laoniu/nodejs/bin中的cordova,软连接到/usr/bin/cordova中才能使用命令行

公司网络使用代理情况下的配置和问题解决

第一次接触到公司的网络使用了代理(汗~~~),其实也不难,只是以前从来么有接触过,上来吓了一跳,Ubuntu万一不支持怎么办?没想到完美解决:
设置 —> NetWork —> Options,这里在Ipv4settings中配置上网的IP,子网掩码,网关和dns server,然后
设置 —> NetWork左侧有个代理选项的:NetWork proxy,在右侧点选manual,输入代理地址和端口,就发现可以愉快的浏览网络了。
但是到这里还不算完,你会发现用终端通过软件源安装软件的方式是请求不到网络了,汗~~~,在设置代理的那个对话框下方,有个Apply system wide,全局应用,点选一下,输入超级密码,OK!

到这里还不算完,你会发现git不能pull,不能push,汗~~~,这时候要配置git的代理一下,尽管已经Apply system wide了,从来没有配置过,其实也简单,配置的时候就是代理后面 地址:端口都要带上,可以了,可以愉快的pull,push了。

公司网络代理情况下的git配置

[user]
	name = xxx
	email = xxx@foxmail.com
[core]
	autocrlf = input

[http]
	proxy = xxx.xxx.xxx:8080
[https]
	proxy = xxx.xxx.xxx:8080
[color]
	ui = auto

公司网络代理情况下的apt配置

在/etc/apt目录下新建apt.conf文件

Acquire::https::proxy "https://xxx.xxx.xxx:8080";
Acquire::http::proxy "http://xxx.xxx.xxx:8080";

gradle代理和白名单配置

~/.gradle/gradle.properties

systemProp.http.nonProxyHosts=127.0.0.1|localhost|11.*|10.*
systemProp.http.proxyHost=xxx.xxx.xxx
systemProp.http.proxyPort=8080
systemProp.https.nonProxyHosts=127.0.0.1|localhost|11.*|10.*
systemProp.https.proxyHost=xxx.xxx.xxx
systemProp.https.proxyPort=8080
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值