文章目录:
- 1、判断网络连接是否成功源码分享,一看就懂
- 2、国内被墙后如何获取android源代码
- 3、基于安卓的WIFI网络调试 助手,TCP客户端的源码 或者服务端
- 4、求大神给安卓控制esp8266 io的安卓端源码大全
- 5、安卓如何实现获取网页源代码?
- 6、自己可以编译安卓源码吗?
判断网络连接是否成功源码分享,一看就懂
以安卓为例:
利用Android自带的ConnectivityManager类。
有时候连上了wifi,但这个wifi是上不了网的,可以通过ping 百度网址来判断是否可以上网。
也可以利用get请求访问百度,如果get请求成功,说明可以上网。
判断网络是否已经连接
// check all network connect, WIFI or mobile
public static boolean isNetworkAvailable(final Context context) {
boolean hasWifoCon = false;
boolean hasMobileCon = false;
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(context.CONNECTIVITY_SERVICE);
NetworkInfo[] netInfos = cm.getAllNetworkInfo();
for (NetworkInfo net : netInfos) {
String type = net.getTypeName();
if (type.equalsIgnoreCase("WIFI")) {
LevelLogUtils.getInstance().i(tag, "get Wifi connection");
if (net.isConnected()) {
hasWifoCon = true;
}
}
if (type.equalsIgnoreCase("MOBILE")) {
LevelLogUtils.getInstance().i(tag, "get Mobile connection");
if (net.isConnected()) {
hasMobileCon = true;
}
}
}
return hasWifoCon || hasMobileCon;
}
利用 ping 判断 Internet 能够 请求成功
// network available cannot ensure Internet is available
public static boolean isNetWorkAvailable(final Context context) {
Runtime runtime = Runtime.getRuntime();
try {
Process pingProcess = runtime.exec("/system/bin/ping -c 1 ");
int exitCode = pingProcess.waitFor();
return (exitCode == 0);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
国内被墙后如何获取android源代码
1.最简单的方法:
public static String reverse1(String str)
{ return new StringBuffer(str).reverse().toString();
}
2.最常用的方法:
public static String reverse3(String s)
{ char[] array = s.toCharArray();
String reverse = ""; //注意这是空,不是null
for (int i = array.length - 1; i = 0; i--)
reverse += array[i];
return reverse;
}
3.常用方法的变形:
public static String reverse2(String s)
{ int length = s.length();
String reverse = ""; //注意这是空,不是null
for (int i = 0; i length; i++)
reverse = s.charAt(i) + reverse;//在字符前面连接, 而非常见的后面
return reverse;
}
基于安卓的WIFI网络调试 助手,TCP客户端的源码 或者服务端
您好,对于您这样的情况建议您下载最新版本的驱动软件,更新到最新版本的驱动。
求大神给安卓控制esp8266 io的安卓端源码大全
esp8266 WiFi模块,可以用来 与手机 APP 进行通讯 和远程控制,模块官方固件 是通过 串口进行通讯 控制的,如果连接 单片机 可以由 单片机用 AT命令控制 模块IO口,直接通过网络控制 需要 改写模块 固件。
手机APP端 只要自己定义一个 通讯协议, 按照协议收发控制指令 就可以了,(就相当于单片机串口通讯 差不多),有个中文手机APP编程软件(E4A里面有个例程 (客户端组件))可以参考一下,局域网内控制 比较简单,远程控制协议 借助物联网平台 端口(有免费端口可以利用)。
安卓如何实现获取网页源代码?
public class GetHtmlCodeActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView textView = (TextView)this.findViewById(R.id.picture_textview);
try {
textView.setText(getPictureData(""));
} catch (Exception e) {
Log.e("GetHtmlCodeActivity", e.toString());
Toast.makeText(GetHtmlCodeActivity.this, "网络连接失败", 1).show();
}
}
//得到图片的二进制数据
public String getPictureData(String path) throws Exception{
// 类 URL 代表一个统一资源定位符,它是指向互联网“资源”的指针。
URL url = new URL("");
// 每个 HttpURLConnection 实例都可用于生成单个请求,
//但是其他实例可以透明地共享连接到 HTTP 服务器的基础网络
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//设置 URL 请求的方法
conn.setRequestMethod("GET");
//设置一个指定的超时值(以毫秒为单位),
//该值将在打开到此 URLConnection 引用的资源的通信链接时使用。
conn.setConnectTimeout(5 * 1000);
// conn.getInputStream()返回从此打开的连接读取的输入流
InputStream inStream = conn.getInputStream();// 通过输入流获取html数据
byte[] data = readInputStream(inStream);// 得到html的二进制数据
String html = new String(data);
return html;
}
//读取输入流中的数据,返回字节数组byte[]
public byte[] readInputStream(InputStream inStream) throws Exception{
//此类实现了一个输出流,其中的数据被写入一个 byte 数组
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
// 字节数组
byte[] buffer = new byte[1024];
int len = 0;
//从输入流中读取一定数量的字节,并将其存储在缓冲区数组buffer 中
while ((len = inStream.read(buffer)) != -1) {
// 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流
outStream.write(buffer, 0, len);
}
inStream.close();
//toByteArray()创建一个新分配的 byte 数组。
return outStream.toByteArray();
}
}
可以看一下这个自己想想哦
自己可以编译安卓源码吗?
用最新的Ubuntu 16.04,请首先确保自己已经安装了Git.没安装的同学可以通过以下命令进行安装:
sudo apt-get install git git config –global user.email “test@test.com” git config –global user.name “test”
其中test@test.com为你自己的邮箱.
简要说明
android源码编译的四个流程:1.源码下载;2.构建编译环境;3.编译源码;4运行.下文也将按照该流程讲述.
源码下载
由于某墙的原因,这里我们采用国内的镜像源进行下载.
目前,可用的镜像源一般是科大和清华的,具体使用差不多,这里我选择清华大学镜像进行说明.(参考:科大源,清华源)
repo工具下载及安装
通过执行以下命令实现repo工具的下载和安装
mkdir ~/binPATH=~/bin:$PATHcurl ~/bin/repochmod a+x ~/bin/repo
补充说明
这里,我来简单的介绍下repo工具,我们知道AOSP项目由不同的子项目组成,为了方便进行管理,Google采用Git对AOSP项目进行多仓库管理.在聊repo工具之前,我先带你来聊聊多仓库项目:
我们有个非常庞大的项目Pre,该项目由很多个子项目R1,R2,...Rn等组成,为了方便管理和协同开发,我们为每个子项目创立自己的仓库,整个项目的结构如下:
这里写图片描述
将一个项目Pre进行分库后会遇到这么一个问题:如果我们想要创建Pre分支来做feature开发,这就意味着,我们需要到每个子项目中分别创建对应的分支,这个过程如果纯粹靠手工做,那简直是个灾难,利索当然我们会想写个自动化处理程序(我们假设这个工具叫做RepoUtil)来帮助我们解决这个问题.这个RepoUtil也会有版本管理之类的需求,因此我们也用Git对其管理,并为其创建对应的仓库.此时整个项目的结构如下:
这里写图片描述
这里RepoUtil知道整个项目Pre下的每个子项目(即维护子项目的列表),同时需要提供对这些子项目的管理功能,比如统一创建分支等.但是从"单一职责"角度来看,RepoUitl这个工具的功能过于复杂,我们完全可以将维护子项目列表这个功能抽取出来作为一个新项目sub_projects,因为子项目也会变化,因此,为其创建对应的仓库,并用Git管理,这样的化,RepoUtil只需要通过简单的对ub_projects进行依赖即可,此时整个项目的结构如下:
这里写图片描述
AOSP项目结构和我上文的描述非常类似.repo工具对应RepoUtil,mainfest对应sub_projects.
总结一下:repo就是这么一种工具,由一系列python脚本组成,通过调用Git命令实现对AOSP项目的管理.
建立源码文件夹
熟悉Git的同学都应该知道,我们需要为项目在本地创建对应的仓库.同样,这里为了方便对代码进行管理,我们为其创建一个文件夹.这里我在当前用户目录下创建了source文件夹,后面所有的下载的源码和编译出的产物也都放在这里,命令如下:
mkdir sourcecd source
初始化仓库
我们将上面的source文件夹作为仓库,现在需要来初始化这个仓库了.通过执行初始化仓库命令可以获取AOSP项目master上最新的代码并初始化该仓库,命令如下:
repo init -u
或者使用:
repo init -u git://aosp.tuna.tsinghua.edu.cn/aosp/platform/manifest
两者实现的效果一致,仅仅只是协议不同.
如果执行该命令的过程中,如果提示无法连接到 gerrit.googlesource.com,那么我们只需要编辑 ~/bin/repo文件,找到REPO_URL这一行,然后将其内容修改为:
REPO_URL = ''
然后重新执行上述命令即可.
补充说明
不带参数的manifest命令用于获取master上最新的代码,但是可以通过-b参数指定获取某个特定的android版本,比如我们想要获取android-4.0.1_r1分支,那么命令如下:
repo init -u -b android-4.0.1_r1
(AOSP项目当前所有的分支列表参看:分支列表)
同步源码到本地
初始化仓库之后,就可以开始正式同步代码到本地了,命令如下:
repo sync
以后如果需要同步最新的远程代码到本地,也只需要执行该命令即可.在同步过程中,如果因为网络原因中断,使用该命令继续同步即可.不出意外,5个小时便可以将全部源码同步到本地.所以呢,这个过程可以放在晚上睡觉期间完成.
(提示:一定要确定代码完全同步了,不然在下面编译过程出现的错误会让你痛不欲生,不确定的童鞋可以多用repo sync同步几次)
构建编译环境
源码下载完成后,就可以构建编译环境了.在开始之前,我们先来看看一些编译要求:
1. 硬件要求:
64位的操作系统只能编译2.3.x以上的版本,如果你想要编译2.3.x以下的,那么需要32位的操作系统.
磁盘空间越多越好,至少在100GB以上.意思就是,你可以去买个大点的硬盘了啊
如果你想要在是在虚拟机运行linux,那么至少需要16GB的RAM/swap.
(实际上,我非常不推荐在虚拟机中编译2.3.x以上的代码.)
2. 软件要求:
1. 操作系统要求
在AOSP开源中,主分支使用Ubuntu长期版本开发和测试的,因此也建议你使用Ubuntu进行编译,下面我们列出不同版本的的Ubuntu能够编译那些android版本:
Android版本
编译要求的Ubuntu最低版本
Android 6.0至AOSP master Ubuntu 14.04
Android 2.3.x至Android 5.x Ubuntu 12.04
Android 1.5至Android 2.2.x Ubuntu 10.04
2. JDK版本要求
除了操作系统版本这个问题外,我们还需要关注JDK版本问题,为了方便,同样我们也列出的不同Android版本的源码需要用到的JDK版本:
Android版本
编译要求的JDK版本
AOSP的Android主线 OpenJDK 8
Android 5.x至android 6.0 OpenJDK 7
Android 2.3.x至Android 4.4.x Oracle JDK 6
Android 1.5至Android 2.2.x Oracle JDK 5
更具体的可以参看:Google源码编译要求
我现在在Ubuntu 16.04下编译AOSP主线代码,因此需要安装OpenJDK 8,执行命令如下:
sudo apt-get install openjdk-8-jdk
如果你需要在Ubuntu 14.04下编译AOSP主线代码,同样需要安装OpenJDK 8,此时需要执行如下命令:
sudo apt-get updatesudo apt-get install openjdk-8-jdk
如果你要编译的是Android 5.x到android 6.0之间的系统版本,需要采用openjdk7.但是在Ubuntu 15.04及之后的版本的在线安装库中只支持openjdk8和openjdk9的安装.因此,如果你想要安装openjdk 7需要首先设置ppa:
sudo add-apt-repository ppa:openjdk-r/ppa sudo apt-get update
然后再执行安装命令:
sudo apt-get install openjdk-7-jdk
有时候,我们需要编译不同版本的android系统,就可能使用不同的jdk版本.关于jdk版本切换,可以使用如下命令:
sudo update-alternative --config javasudo update-alternative --config javac
3. 其他要求
Google官方构建编译环境指南中已经说明了Ubuntu14.04,Ubuntu 12.04,Ubuntu 10.04需要添加的依赖,这里我们就不做介绍了.我原先以为,Ubuntu16.04的设置和Ubuntu14.04的依赖设置应该差不多,但是只能说too young too simple.
下面是Ubuntu16.04中的依赖设置:
sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386 sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-devsudo apt-get install git-core gnupg flex bison gperf build-essential sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib sudo apt-get install libc6-dev-i386 sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4sudo apt-get install lib32z-dev ccache
(其中几个命令中参数是重复的,但不妨碍我们)
初始化编译环境
确保上述过程完成后,接下来我们需要初始化编译环境,命令如下:
source build/envsetup.sh
执行该命令结果如下:
这里写图片描述
不难发现该命令只是引入了其他执行脚本,至于这些脚本做什么,目前不在本文中细说.
该命令执行成功后,我们会得到了一些有用的命令,比如最下面要用到的lunch命令.
编译源码
初始化编译环境之后,就进入源码编译阶段.这个阶段又包括两个阶段:选择编译目标和执行编译.
选择编译目标
通过lunch指令设置编译目标,所谓的编译目标就是生成的镜像要运行在什么样的设备上.这里我们设置的编译目标是aosp_arm64-eng,因此执行指令:
lunch aosp_arm64-eng
编译目标格式说明
编译目标的格式:BUILD-BUILDTYPE,比如上面的aosp_arm-eng的BUILD是aosp_arm,BUILDTYPE是eng.
什么是BUILD
BUILD指的是特定功能的组合的特定名称,即表示编译出的镜像可以运行在什么环境.其中,aosp(Android Open Source Project)代表Android开源项目;arm表示系统是运行在arm架构的处理器上,arm64则是指64位arm架构;处理器,x86则表示x86架构的处理器;此外,还有一些单词代表了特定的Nexus设备,下面是常用的设备代码和编译目标,更多参考官方文档
|受型号|设备代码|编译目标|
|---|----|---|
|Nexus 6P|angler|aosp_angler-userdebug|
|Nexus 5X|bullhead|aosp_bullhead-userdebug|
|Nexus 6|shamu|aosp_shamu-userdebug|
|Nexus 5|hammerhead|aosp_hammerhead-userdebug|
提示:如果你没有Nexus设备,那么通常选择arm或者x86即可
什么是BUILDTYPE
BUILD TYPE则指的是编译类型,通常有三种:
-user:代表这是编译出的系统镜像是可以用来正式发布到市场的版本,其权限是被限制的(如,没有root权限,不鞥年dedug等)
-userdebug:在user版本的基础上开放了root权限和debug权限.
-eng:代表engineer,也就是所谓的开发工程师的版本,拥有最大的权限(root等),此外还附带了许多debug工具
了解编译目标的组成之后,我们就可以根据自己目前的情况选择了.那不知道编译目标怎么办?
我们只需要执行不带参数的lunch指令,稍后,控制台会列出所有的编译目标,如下:
这里写图片描述
接着我们只需要输入相应的数字即可.
来举个例子:你没有Nexus设备,只想编译完后运行看看,那么就可以选择aosp_arm-eng.
(我在ubuntu 16.04(64位)中编译完成后启动虚拟机时,卡在黑屏,尝试编译aosp_arm64-eng解决.因此,这里我使用了aosp_arm64-eng)
开始编译
通过make指令进行代码编译,该指令通过-j参数来设置参与编译的线程数量,以提高编译速度.比如这里我们设置8个线程同时编译:
make -j8
需要注意的是,参与编译的线程并不是越多越好,通常是根据你机器cup的核心来确定:core*2,即当前cpu的核心的2倍.比如,我现在的笔记本是双核四线程的,因此根据公式,最快速的编译可以make -j8.
(通过cat /proc/cpuinfo查看相关cpu信息)
如果一切顺利的化,在几个小时之后,便可以编译完成.看到### make completed successfully (01:18:45(hh:mm:ss)) ###表示你编译成功了.
运行模拟器
在编译完成之后,就可以通过以下命令运行Android虚拟机了,命令如下:
source build/envsetup.shlunch(选择刚才你设置的目标版本,比如这里了我选择的是2)emulator
如果你是在编译完后立刻运行虚拟机,由于我们之前已经执行过source及lunch命令了,因此现在你只需要执行命令就可以运行虚拟机:
emulator
不出意外,在等待一会之后,你会看到运行界面:
这里写图片描述
补充
既然谈到了模拟器运行,这里我们顺便介绍模拟器运行所需要四个文件:
Linux Kernel
system.img
userdate.img
ramdisk.img
如果你在使用lunch命令时选择的是aosp_arm-eng,那么在执行不带参数的emualtor命令时,Linux Kernel默认使用的是/source/prebuilds/qemu-kernel/arm/kernel-qemu目录下的kernel-qemu文件;而android镜像文件则是默认使用source/out/target/product/generic目录下的system.img,userdata.img和ramdisk.img,也就是我们刚刚编译出来的镜像文件.
上面我在使用lunch命令时选择的是aosp_arm64-eng,因此linux默认使用的/source/prebuilds/qemu-kernel/arm64/kernel-qemu下的kernel-qemu,而其他文件则是使用的source/out/target/product/generic64目录下的system.img,userdata.img和ramdisk.img.
当然,emulator指令允许你通过参数制定使用不同的文件,具体用法可以通过emulator --help查看
模块编译
除了通过make命令编译可以整个android源码外,Google也为我们提供了相应的命令来支持单独模块的编译.
编译环境初始化(即执行source build/envsetup.sh)之后,我们可以得到一些有用的指令,除了上边用到的lunch,还有以下:
- croot: Changes directory to the top of the tree. - m: Makes from the top of the tree. - mm: Builds all of the modules in the current directory. - mmm: Builds all of the modules in the supplied directories. - cgrep: Greps on all local C/C++ files. - jgrep: Greps on all local Java files. - resgrep: Greps on all local res/*.xml files. - godir: Go to the directory containing a file.
其中mmm指令就是用来编译指定目录.通常来说,每个目录只包含一个模块.比如这里我们要编译Launcher2模块,执行指令:
mmm packages/apps/Launcher2/
稍等一会之后,如果提示:
### make completed success fully ###
即表示编译完成,此时在out/target/product/gereric/system/app就可以看到编译的Launcher2.apk文件了.
重新打包系统镜像
编译好指定模块后,如果我们想要将该模块对应的apk集成到系统镜像中,需要借助make snod指令重新打包系统镜像,这样我们新生成的system.img中就包含了刚才编译的Launcher2模块了.重启模拟器之后生效.
单独安装模块
我们在不断的修改某些模块,总不能每次编译完成后都要重新打包system.img,然后重启手机吧?有没有什么简单的方法呢?
在编译完后,借助adb install命令直接将生成的apk文件安装到设备上即可,相比使用make snod,会节省很多事件.
补充
我们简单的来介绍out/target/product/generic/system目录下的常用目录:
Android系统自带的apk文件都在out/target/product/generic/system/apk目录下;
一些可执行文件(比如C编译的执行),放在out/target/product/generic/system/bin目录下;
动态链接库放在out/target/product/generic/system/lib目录下;
硬件抽象层文件都放在out/targer/product/generic/system/lib/hw目录下.
SDK编译
如果你需要自己编译SDK使用,很简单,只需要执行命令make sdk即可.
错误集合
在编译过程中,遇到的大部分错误都可以在google搜到解决方案.这里只列举几个常见的错误:
错误一: You are attemping to build with the incorrect version.具体错误如下:
这里写图片描述
如果你认真看了构建环境的的要求,那么这个错误是可以避免的.当然,这个问题也很容易解决:安装openjdk 8,别忘了使用sudo update-alternative命令切换jdk版本.
错误二: Out of memory error.具体错误如下:
这里写图片描述
这个错误比较常见,尤其是在编译AOSP主线代码时,常常会因为JVM heap size太小而导致该错误.
此时有两种解决方法:
方法一:
在编译命令之前,修改prebuilts/sdk/tools/jack-admin文件,找到文件中的这一行:
JACK_SERVER_COMMAND="java -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME"
然后在该行添加-Xmx4096m,如:
JACK_SERVER_COMMAND="java -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -Xmx4096m -cp $LAUNCHER_JAR $LAUNCHER_NAME"
然后再执行time make -8j
方法二:
在控制台执行以下命令:
export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m"out/host/linux-x86/bin/jack-admin kill-serverout/host/linux-x86/bin/jack-admin start-server
如图:
这里写图片描述
执行完该命令后,再使用make命令继续编译.某些情况下,当你执行jack-admin kill-server时可能提示你命令不存在,此时去你去out/host/linux-x86/bin/目录下会发现不存在jack-admin文件.如果我是你,我就会重新repo sync下,然后从头来过.
错误三:使用emulator时,虚拟机停在黑屏界面,点击无任何响应.此时,可能是kerner内核问题,解决方法如下:
执行如下命令:
./out/host/linux-x86/bin/emulator -partition-size 1024 -kernel ./prebuilts/qemu-kernel/arm/kernel-qemu-armv7
通过使用kernel-qemu-armv7内核 解决模拟器等待黑屏问题.而-partition-size 1024 则是解决警告: system partion siez adjusted to match image file (163 MB 66 MB)
如果你一开始编译的版本是aosp_arm-eng,使用上述命令仍然不能解决等待黑屏问题时,不妨编译aosp_arm64-eng试试.
结束吧
到现在为止,你已经了解了整个android编译的流程.除此之外,我也简单的说明android源码的多仓库管理机制.下面,不妨自己动手尝试一下.
误一: You are attemping to build with the incorrect version.具体错误如下:请点击输入图片描述这里写图片描述如果你认真看了构建环境的的要求,那么这个错误是可以避免的.当然,这个问题也很容易解决:安装openjdk 8,别忘了使用sudo u
oid镜像文件则是默认使用source/out/target/product/generic目录下的system.img,userdata.img和ramdisk.img,也就是我们刚刚编译出来的镜像文件.上面我在使用lunch命令时选择的是aosp_arm64-e
setContentView(R.layout.main); TextView textView = (TextView)this.findViewById(R.id.picture_textvi
步几次)构建编译环境源码下载完成后,就可以构建编译环境了.在开始之前,我们先来看看一些编译要求:1. 硬件要求:64位的操作系统只能编译2.3.x以上的版本,如果你想要编译