CURL 测试下载速率

curl -H  -H 'User-Agent: Chrom'  -L -w %{speed_download} -o/dev/null -s  "http://urlstring"

Gradle 同时生成 Jar 和 AAR

build.gradle文件中加入以下代码

android.libraryVariants.all { variant ->
    def name = variant.buildType.name
    if (name.equals(com.android.builder.core.BuilderConstants.DEBUG)) {
        return
    }
    def task = project.tasks.create "jar${name.capitalize()}Package", Jar
    task.dependsOn variant.javaCompile
    task.from variant.javaCompile.destinationDir
    artifacts.add('archives', task)
}

此时会生成一个jarReleasePackage(根据 variant 的不同也可能为 jarDebugPackage 等)。需要注意的是该 Task 只能在 gradle tasks --all时才能看到,使用gradle tasks是看不到的。

如果使用了mavenDeployer ,那么这个 JAR 包和 AAR 包会同时上传到服务器上。

Conan 的基本使用

工作流水记录,有误之处敬请原谅

客户端安装

MacOS

  • 使用 Homebrew
    brew update
    brew install conan
    
  • 使用 pip
    pip install conan
    
  • 使用预编译包

    https://www.conan.io/downloads

  • 源码安装
    git clone https://github.com/conan-io/conan.git
    cd conan
    pip install -r conans/requirements.txt
    

    下载源码后,创建如下启动脚本:

    #!/usr/bin/env python
    
    import sys
    
    conan_repo_path = "/home/your_user/conan" # ABSOLUTE PATH TO CONAN REPOSITORY FOLDER
    
    sys.path.append(conan_repo_path)
    from conans.client.command import main
    main(sys.argv[1:])
    

    最后把启动脚本加入到你的path

服务器端安装

Linux (Centos 7)

  • 下载源码

    git clone https://github.com/conan-io/conan.git
    cd conan
    git checkout master
    pip install -r conans/requirements.txt
    pip install -r conans/requirements_server.txt
    pip install gunicorn
    
  • 启动服务

    gunicorn -b 0.0.0.0:8081 -w 4 -t 300 conans.server.server_launcher:app
    
  • 服务端配置 配置文件位于$HOME/.conan_server/server.conf,首次安装如果没有这个文件,可以执行一次上面的命令,即会自动生成这个配置文件。

包创建流程

package_create_flow

创建 Conan 包

conanfile.py 文件

Conan 项目的编译需要conanfile.py文件,该文件中包含了项目的配置信息、编译信息、打包信息等

一个 Conan 项目的 conanfile.py文件示例:

from conans import ConanFile, AutoToolsBuildEnvironment, tools

class libx264Conan(ConanFile):
    name = "libx264"
    version = "3.0.1"
    url = "http://url"
    description = "Conan libx264"
    license = "L"
    settings = "os", "build_type", "arch"
    options = {"shared": [True, False]}
    default_options = "shared=False"
    generators = "gcc"
    exports_sources = "x264/*"

    def build(self):
        env_build = AutoToolsBuildEnvironment(self)
        with tools.environment_append(env_build.vars), tools.chdir("./x264"):
            self.run("./configure %s %s %s %s %s %s %s %s %s" % (
                "--prefix=" + str(self.env["prefix"]),
                "--exec-prefix=" + str(self.env["exec_prefix"]),
                "--libdir=" + str(self.env["lib_dir"]),
                "--disable-asm", 
                "--enable-pic", 
                "--disable-cli",
                "--host=" + str(self.env["host"]),
                "--enable-shared" if ('True' == self.options.shared) else "--enable-static",
                "--cross-prefix=" + str(self.env["cross_prefix"])))
            self.run("make")
            self.run("make install")

    def package(self):
        self.copy("*.h", dst="include", src="x264/build/" + str(self.settings.arch) + "/include")
        if ('True' == self.options.shared):
            self.copy("*.so", dst="lib", src="x264/build/" + str(self.settings.arch) + "/lib", keep_path=False)
        else:
            self.copy("*.a", dst="lib", src="x264/build/" + str(self.settings.arch) + "/lib", keep_path=False)

    def package_info(self):
        self.cpp_info.includedirs = ['include']
        self.cpp_info.libs = []
        self.cpp_info.libdirs = ['lib']

可以看到有一些变量,这些变量的值是从 conan profile文件中读取的。对conan profile文件中的每一块数据的读取方式是不尽相同的,比如对[env]中数据的读取是一个Map,建议直接查看 Conan 的源代码,便捷明了。

conan createconan install命令可以加入--profile参数,该参数的值为不同的配置文件名,这种方式便于同时编译针对不同架构、不同平台的库文件,比如:

conan install --profile arm_profiile
conan install --profile arm64_profile
conan install --profile x86_profile

Conan profile 文件

在需要创建 Conan 包的项目中创建conan_build_profie文件,在该文件中可以写入关于项目编译配置信息,可针对不同架构、不同平台等差异创建多个 profile 文件,一个 Conan Profile 文件示例:

[settings]
os=Android
arch=arm64
compiler=gcc
build_type=Release

[env]
CFLAGS=--sysroot=/Users/user/android-ndk/platforms/android-21/arch-arm64
LDFLAGS= --sysroot=/Users/user/android-ndk/platforms/android-21/arch-arm64
prefix=build/arm64
exec_prefix=build/arm64/bin
lib_dir=build/arm64/lib
host=aarch64-linux
cross_prefix=/Users/user/android-ndk/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin/aarch64-linux-android-

[options]
shared=False

[build_requires]

建议将所有固定的编译参数放入[env]段中。[options]中的项一般是可以通过conanfile.txt中实时设置的,比如shared这个值可以在下面章节中描述的conanfile.txt文件中设置:

[requires]
libx264/[email protected]/release
[options]
libx264:shared=False
[generators]
gcc

对这个值的具体处理逻辑在conanfile.py中,并且可以设置默认值,从上面conanfile.py中可以看到 "--enable-shared" if ('True' == self.options.shared) else "--enable-static"这行语句。

[setting]段中可设置的值是受~/.conan/settings.yml文件的配置限制的,具体语法建议查阅文档,一个示例:

os: [Linux, Android, iOS]
arch: [x86, x86_64, arm, arm64, armv7, armv7s, armv8]
compiler: [gcc, xcode]
build_type: [None, Debug, Release

#使用 Conan 包

在项目工程中创建conanfile.txt文件,所有关于项目依赖库的信息都需要写入该文件,如下是一个简单的例子

常用命令

关于更多 Conan 命令的使用,请关注本站 WiKi 页面中的 Conan 部分,请持续更新

  • 查看远程服务器列表

    conan remote list
    
  • 添加远程服务器

    conan remote add local http://ip:port
    
  • 上传到服务器

    conan upload Hello/[email protected]/testing --all -r=local
    

    内置的测试账号和密码为demo/demo

  • 查询库信息

    conan search Hello/[email protected]/testing -r=local
    

    一个可能的输出:

    Existing packages for recipe Hello/[email protected]/testing:
    
        Package_ID: 7fe67dff831b24bc4a8b5db678a51f1be5e44e7c
            [options]
                shared: False
            [settings]
                arch: x86_64
                build_type: Release
                compiler: apple-clang
                compiler.libcxx: libc++
                compiler.version: 9.0
                os: Macos
                outdated from recipe: False
    

    conan 甚至能够管理同一个库的不同架构、不同编译参数的版本:

    Existing packages for recipe Hello/[email protected]/testing:
    
        Package_ID: 3cfade032d90e40671f831047a4b021865f8396f
            [options]
                shared: True
            [settings]
                arch: x86_64
                build_type: Release
                compiler: apple-clang
                compiler.libcxx: libc++
                compiler.version: 9.0
                os: Macos
            outdated from recipe: False
    
        Package_ID: 7fe67dff831b24bc4a8b5db678a51f1be5e44e7c
            [options]
                shared: False
            [settings]
                arch: x86_64
                build_type: Release
                compiler: apple-clang
                compiler.libcxx: libc++
                compiler.version: 9.0
                os: Macos
            outdated from recipe: False
    
        Package_ID: f331ba4cb4cf3b345ec2ebc265629b6ee1340312
            [options]
                shared: False
            [settings]
                arch: x86_64
                build_type: Debug
                compiler: apple-clang
                compiler.libcxx: libc++
                compiler.version: 9.0
                os: Macos
            outdated from recipe: False
    
  • 删除本地库缓存

    conan remove Hello/[email protected]/testing
    

    删除之后可以使用conan search来做确认,一个可能的输出:

    Existing package recipes:
    
    OpenSSL/[email protected]/stable
    Poco/[email protected]/stable
    zlib/[email protected]/stable
    
  • 查看远程仓库可用包列表

    conan -r [repo_name]
    

    -r参数为需要查询的仓库地址,可以通过conan remote list得到

    上述命令一个可能的输出:

    Existing package recipes:
    
    Hello/[email protected]/testing
    
  • 参看远程库的配置文件

    conan get Hello/[email protected]/testing -r local
    

    本命令输出的为conanfile.py中的内容

  • 查看当前各远程仓库的登陆用户名

    conan user
    

    可能的输出:

    Current 'conan-center' user: None (anonymous)
    Current 'conan-transit' user: None (anonymous)
    Current 'local' user: demo
    
  • 切换用户名
       conan user  othername -r [reponame]
    

    上面的命令将对应reponame远程仓库的用户名修改为othername 一个可能的输出:

     Change 'local' user from demo to wangsijie
    
  • 查看当前项目的依赖
    conan info
    

    输出提示当前项目依赖了Hello/[email protected]/testing

    PROJECT
      ID: 9f3be35e404b0966b8f9fa1f7525247a9dc8204d
      BuildID: None
      Requires:
          Hello/[email protected]/testing
    Hello/[email protected]/testing
      ID: 7fe67dff831b24bc4a8b5db678a51f1be5e44e7c
      BuildID: None
      Remote: xlncz=http://127.0.0.1:8081
      URL: <Package recipe repository url here, for issues about the package>
      License: <Put the package license here>
      Updates: Version not checked
      Creation date: 2017-11-08 15:25:50
      Required by:
          PROJECT
    

打孔磁带

Alt none

Maven 常用命令

  • 安装到私服

    mvn deploy:deploy-file -DgroupId=org.apache.hadoop -DartifactId=hbase -Dversion=1.0 -Dpackaging=jar -Dfile=[path to file] -Durl=[url] -DrepositoryId=[id]