Menu
Woocommerce Menu

okhttp使用备忘录,android系统定制从听大人讲到入门五

0 Comment

OkHttp是目前使用最广泛的移动端网络底层库。在Volley、Retrofit等知名上层网络库中,都可以看到它的身影。即使在高版本的Android系统中的URLConnection中也可以看到它的身影。�

Android程序员面试宝典

Android程序员面试宝典

因为,各大网络库对OkHttp进行了封装。我们虽然使用方便,却不免失去了一定的灵活性。如果OkHttp拥有的功能,上层库却没有封装,我们在使用时,就会比较麻烦。因此,我们在这里尝试直接使用OkHttp,看看未经封装的OkHttp如何使用。

android系统定制系列:

  • android系统定制从听说到入门一
  • android系统定制从听说到入门二
  • android系统定制从听说到入门三
  • android系统定制从听说到入门四
  • android系统定制从听说到入门五
  • android系统定制从听说到入门六

android系统定制系列:

  • android系统定制从听说到入门一
  • android系统定制从听说到入门二
  • android系统定制从听说到入门三
  • android系统定制从听说到入门四
  • android系统定制从听说到入门五
  • android系统定制从听说到入门六

ASOP代码编译以后默认会在你当前工作目录创建/out目录,编译产出的所有文件都会放在这个目录。编译完以后这个目录大小比AOSP源码还要大,如果希望自定义out目录的位置:

#export:配置环境变量#OUT_DIR_COMMON_BASE:环境变量名,配置保存编译AOSP源码所生成文件的out目录位置。默认在AOSP源码的目录下。仅支持4.1及以后$ export OUT_DIR_COMMON_BASE=<path-to-your-out-directory>

开启ccache,在AOSP编译的过程中,会对C/C++代码的编译结果进行缓存。当执行了make
clean命令以后,再次执行make编译的时候,可以大大提高编译速度。

$ export USE_CCACHE=1 #开启CCACHE。此配置可以提高二次全编译的速度。可以添加到.bashrc文件中,$ export CCACHE_DIR=/<path_of_your_choice>/.ccache #设置缓存目录的路径。也可以添加到.bashrc文件中,$ prebuilts/misc/linux-x86/ccache/ccache -M 50G #设置缓存目录的大小。这个配置一次即可。

.bashrc是home目录下的一个脚本文件,每打开一个终端窗口,这个启动脚本里的命令就会执行,相当于开机启动。

OkHttp将请求封装在了Request类中。我们大致看看Request的成员:

本文配套视频:

4.2源码下载与管理

由于国内的网络限制,以下执行的命令,有些会将访问的Google地址替换为国内的镜像网站,比如清华镜像源。镜像源:定期同步Google的AOSP代码服务器,供国内网络访问。

#1. 下载repo#创建~/bin目录并加到环境变量$ mkdir ~/bin$ PATH=~/bin:$PATH#下载repo脚本到本地并配置可执行权限$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo#清华大学提供的repo#curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo#export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'$ chmod a+x ~/bin/repo #所有用户可执行 #2. 初始化本地repo#创建工作目录,用于保存下载的AOSP源码$ mkdir WORKING_DIRECTORY$ cd WORKING_DIRECTORY#配置git账户信息,用于提交代码到Gerrit(code-review代码审查)上$ git config --global user.name "Your Name"$ git config --global user.email "you@example.com"#初始化repo,指定要下载的android源码分支名。不指定,默认下载master分支代码。执行完以后WORKING_DIRECTORY下会生成.repo目录。$ repo init -u https://android.googlesource.com/platform/manifest -b android-6.0.1_r78#清华大学提供的AOSP镜像网站#repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-6.0.1_r78#3.下载,同步。会将repo所维护的服务器上对应分支的所有project的.git仓库更新下载到本地并checkout代码到WORKING_DIRECTORY目录$ repo sync

AOSP:本质上是一堆使用git进行版本控制的project。repo:针对AOSP大量git仓库的管理工具。可以执行批量git同步,更新,提交等操作。原理:通过读取manifest.git里维护的manifests.xml文件当中配置的projects的git仓库地址,分支等信息执行git操作。将服务器上按照特定目录结构保存的project原封不动的同步到本地。关系:repo基于git,让超大型的项目代码管理更有效率。

manifest.xml文件解释:

<?xml version="1.0" encoding="UTF-8"?><manifest><remote fetch="https://android.googlesource.com" name="aosp" review="android-review.googlesource.com" revision="refs/tags/android-6.0.1_r74" /><!-- 可以配置多个remote --><remote name="repo_remote" fetch="." /> <!-- 配置git remote 远程服务器信息 --><!-- name ,远程服务器的名字 --><!--fetch: 以下projects仓库地址的公共前缀。如果是,则是相对路径形式(相对manifest.git)比如:aosp的manifest的仓库地址为https://android.googlesource.com/platform/manifest配置..代表公共前缀为https://android.googlesource.com/配置.代表公共前缀为https://android.googlesource.com/platform${remote_fetch}/${project_name}.git 组成git仓库的remote url --><!-- project 默认的配置 --><default revision="master" remote="repo_remote" sync-j="4" /> <!-- revision:project 节点默认的revision值 remote:project 节点默认的remote值 sync-j: 执行repo sync -j的参数值。多任务--><project path="build/project1" name="project1" remote="repo_remote" revision="master"/><!-- path:告诉repo,project1代码下载下来保存在WORK_DIR下的那个目录)name:服务器仓库的名字。拼接在remote_fetch 的后面,组成git服务器仓库的remote url地址。remote: 告诉repo,project1的remote是走那一个<remote>节点的配置revision: 告诉repo,下载这个Git project 的那个分支--><project path="project1" name="project1" remote="repo_remote" revision="master"/></manifest>
public final class Request{ private final HttpUrl url; private final String method; private final Headers headers; private final RequestBody body; private final Object tag;}

repo与git的关系

AOSP:本质上是一堆使用git进行版本控制的project。repo:针对AOSP大量git仓库的管理工具。可以执行批量git同步,更新,提交等操作。原理:通过读取manifest.git里维护的manifests.xml文件当中配置的projects的git仓库地址,分支等信息执行git操作。将服务器上按照特定目录结构保存的project原封不动的同步到本地。关系:repo基于git,让超大型的项目代码管理更有效率。

4.3源码预编译

如果要使用Nexus设备进行学习,则需要下载Nexus的驱动,再进行编译。驱动下载地址:
找到对应设备的驱动,下载到工作目录解压后为.sh结尾的脚本,执行后会将驱动安装在vendor/目录下

如果之前编译过AOSP,则需要删除所有编译结果,重新编译。$make clobber
#删除out目录下的内容。

#1.初始化编译环境 source或者都可以执行一个shell脚本$ source build/envsetup.sh$ . build/envsetup.sh#2.选择编译目标 $ lunch aosp_arm-eng #模拟器#3.开始编译 -jN:job,开多少个任务去执行编译。$make -j4

lunch BUILD-BUILDTYPE解释:BUILD为内部开发代码,比如Nexus 6P为aosp_anglerBUILDTYPE为编译类型。不同的编译类型,在编译过程中会有不同的编译配置。user:类似MIUI发布的的稳定版ROM。会关闭一些调试性的配置。比如adb。userdebug:类似MIUI发布的开发版ROM。跟user版本差不多,但是具备root,方便进行测试。eng:内部开发版。包含开发过程中使用到的测试工具,带root。

如果是模拟器,可直接运行emulator 命令。

 $ emulator

如果是硬件设备,需要进入bootloader模式将镜像文件通过fastboot烧写到设备上。

 $adb reboot bootloader #进入bootloader模式 $fastboot flash system system.img #烧写system分区 $fastboot reboot #重启设备
  • 欢迎关注微信公众号、长期为您推荐优秀博文、开源项目、视频

  • 微信公众号名称:Android干货程序员

  • 图片 1

其中HttpUrl类代表请求地址, String method代表请求方法,
Headers代表请求头, RequestBody代表请求体.
Object tag是用来取消http请求的标志, 这个我们先不管.

manifest.xml文件解释:

<?xml version="1.0" encoding="UTF-8"?><manifest> <remote fetch="https://android.googlesource.com" name="aosp" review="android-review.googlesource.com" revision="refs/tags/android-6.0.1_r74" /> <!-- 可以配置多个remote --> <remote name="repo_remote" fetch="." /> <!-- 配置git remote 远程服务器信息 --> <!-- name ,远程服务器的名字 --> <!--fetch: 以下projects仓库地址的公共前缀。如果是,则是相对路径形式(相对manifest.git)比如:aosp的manifest的仓库地址为https://android.googlesource.com/platform/manifest 配置..代表公共前缀为https://android.googlesource.com/ 配置.代表公共前缀为https://android.googlesource.com/platform ${remote_fetch}/${project_name}.git 组成git仓库的remote url --> <!-- project 默认的配置 --> <default revision="master" remote="repo_remote" sync-j="4" /> <!-- revision:project 节点默认的revision值 remote:project 节点默认的remote值 sync-j: 执行repo sync -j的参数值。多任务 --> <project path="build/project1" name="project1" remote="repo_remote" revision="master"/> <!-- path:告诉repo,project1代码下载下来保存在WORK_DIR下的那个目录) name:服务器仓库的名字。拼接在remote_fetch 的后面,组成git服务器仓库的remote url地址。 remote: 告诉repo,project1的remote是走那一个<remote>节点的配置 revision: 告诉repo,下载这个Git project 的那个分支 --> <project path="project1" name="project1" remote="repo_remote" revision="master"/></manifest>
  • 欢迎关注微信公众号、长期为您推荐优秀博文、开源项目、视频

  • 微信公众号名称:Android干货程序员

  • 图片 2

我们在使用OkHttp时,我们可以用Request提供的Builder生成我们想要的Request。

final Request request = new Request.Builder().url("https://github.com/").build();
标签:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图