旧经济旧规则——《新经济新规则》读后感

本书介绍了十条互联网时代的规则。

规则一:去中心化与即时反应。换一种说法,是群体智慧和快。凯文·凯利说,“推动大众化的网络连接最可靠的方式是去开拓草根民众的力量,去网罗、连接最分散的底层的力量……”但他并没有极端地认为集体的智慧可以解决一切问题,凯文·凯利在这里也强调了“领导”的力量。“如果没有来自顶层的指导和管理,自下而上的控制方式会在面临很多选择的时候停滞不前。如果没有某种领导元素存在,下层的广大群众会在很多选择面前丧失行动。”

继续阅读“旧经济旧规则——《新经济新规则》读后感”

从Android Studio迁移到IntelliJ,从Gradle2升级到Gradle5.4.1,JNI NDK的配置更新

IntelliJ IDEA,是java编程语言开发的集成环境,在业界被公认为最好的java开发工具之一。参考其官网:https://www.jetbrains.com/idea/。

其实不只是Java,同家公司的Android Studio、PHPStorm、WebStorm、PyCharm、RubyMine的功能,它都有,不就是插件嘛!所以,最近把Android Studio、PHPStorm、WebStorm、PyStorm全部干掉了,所有项目都用IntelliJ来开发。

因为IntelliJ的各种插件都比较新,所以,顺带把Android的各种编译工具和环境更新到相对新的版本,也就有了如下采坑总结,记录一下。

1.gradle.properties

#gradle:3.0.1  studio3.0 之前用
#android.useDeprecatedNdk=true
#gradle:3.0.1  studio3.0 之后用
#android.deprecatedNdkCompileLease=1511832698813
org.gradle.daemon=true
org.gradle.configureondemand=true
org.gradle.jvmargs=-Xmx4g -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

2.根目录下的:build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        maven{url 'http://maven.aliyun.com/nexus/content/groups/public/'}
        google()
//        jcenter {
//            url "http://jcenter.bintray.com/"
//        }
    }
    dependencies {
//        classpath 'com.android.tools.build:gradle:2.1.3'
        classpath 'com.android.tools.build:gradle:3.5.0'
        classpath 'com.mob.sdk:MobSDK:+'
        classpath 'com.mob.sdk:MobSDK-Impl:2018.0710.1743'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
        maven {
            url "https://maven.google.com"
        }
        maven {
            url 'https://dl.bintray.com/youzanyun/maven/'
        }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

3.library目录下的:build.gradle

apply plugin: 'com.android.library'

android {
    compileSdkVersion 28
    buildToolsVersion '28.0.3'

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
    }
    lintOptions {
        abortOnError false
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:support-v4:28.0.0'
    implementation 'com.android.support:design:28.0.0'
    implementation 'com.jakewharton:butterknife:8.8.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

}

4.子项目的build.gradle


android {
    dexOptions {
        preDexLibraries = false
        javaMaxHeapSize "4g"
    }

    externalNativeBuild {
        ndkBuild {
            path "src/main/jni/Android.mk" // 设置所要编写的c源码位置,以及编译后so文件的名字
        }
    }

    compileOptions {
        encoding = "UTF-8"
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }

    signingConfigs {

        release {
            keyAlias '***'
            keyPassword '***'
            storeFile file('../***')
            storePassword '***'
        }
    }
    lintOptions {
        checkReleaseBuilds false
        // Or, if you prefer, you can continue to check for errors in release builds,
        // but continue the build even when errors are found:
        abortOnError false
    }

    compileSdkVersion 28

    defaultConfig {
        applicationId "com.threeti.huimapatient"
        multiDexEnabled true
        minSdkVersion 16
        targetSdkVersion 26
        versionCode 800
        versionName "8.0.0"

        // 下面这段是老版本的写法,不需要了
//        ndk {
//            moduleName "JniAES"
//            ldLibs "log", "z", "m"
//            abiFilters "armeabi-v7a", "x86"
//        }
        // 使用ndkBuild工具
        externalNativeBuild {
            ndkBuild {
                //指定 Application.mk 的路径
                arguments "NDK_APPLICATION_MK:=src/main/jni/Application.mk"
                //指定生成哪些平台的 so 文件
                //abiFilters "armeabi-v7a", "armeabi"
                //生成多个版本的so文件
                abiFilters "armeabi-v7a", "x86"
                //cFlags 和 cppFlags 是用来设置环境变量的, 一般不需要动
                cFlags "-DTEST_C_FLAG1", "-DTEST_C_FLAG2"
                cppFlags "-DTEST_CPP_FLAG2", "-DTEST_CPP_FLAG2"
                //cppFlags ""
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            signingConfig signingConfigs.release

            applicationVariants.all { variant ->
                variant.outputs.all {
                    outputFileName = "YOURAPPNAME_release_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
                }
            }
        }
    }

    sourceSets {
        main {
            jni.srcDirs = ['src/main/jni','src/main/jni/']
            jniLibs.srcDir 'src/main/libs'
        }
    }

    // Specifies the flavor dimensions you want to use. The order in which you
    // list each dimension determines its priority, from highest to lowest,
    // when Gradle merges variant sources and configurations. You must assign
    // each product flavor you configure to one of the flavor dimensions.
    flavorDimensions "default"//,"mode","version","api"

    productFlavors {
        xiaomi { // Assigns this product flavor to the "mode" flavor dimension.
            dimension "default"
        }
        yingyongbao { // Assigns this product flavor to the "mode" flavor dimension.
            dimension "default"
        }
        huawei { // Assigns this product flavor to the "mode" flavor dimension.
            dimension "default"
        }

        // 这里需要这个配置是因为,我们上面虽然建立了渠道,但是并没有处理Manifest里面的meta-data信息。
        productFlavors.all { flavor ->
            flavor.manifestPlaceholders = [UMENG_CHANNEL: name] //动态地修改AndroidManifest中的渠道名
        }
    }
    useLibrary 'org.apache.http.legacy'
}

repositories {
    flatDir {
        dirs 'libs'
    }
    mavenCentral()
}


dependencies {
    implementation 'in.srain.cube:ultra-ptr:1.0.11'
    implementation files('libs/universal-image-loader-1.9.3.jar')
    implementation (name: 'alipaySdk-15.6.8-20191021122455-noUtdid', ext: 'aar')
    ...
}

5.对应的android.mk

LOCAL_PATH := $(call my-dir)

# Builds a dylib out of test.cpp
# 会清除很多 LOCAL_XXX 变量,不会清除 LOCAL_PATH,基本上是固定的,不需要去动
include $(CLEAR_VARS)
# 需要构建模块的名称,会自动生成相应的 libNDKSample.so 文件,每个模块名称必须唯一,且不含任何空格
LOCAL_MODULE := JniAES
# 包含要构建到模块中的 C 或 C++ 源文件列表
LOCAL_SRC_FILES := KeyValue.c
# 指定这个模块里会用到哪些原生 API,详见:https://developer.android.google.cn/ndk/guides/stable_apis.html
LOCAL_LDLIBS := -llog
# 帮助系统将所有内容连接到一起,固定的,不需要去动
include $(BUILD_SHARED_LIBRARY)

6.对应的Application.mk

# https://developer.android.com/ndk/guides/application_mk.html
# 选择不同的 ABI,多个使用空格作为分隔符,全部是all
APP_ABI := all # armeabi-v7a x86
# 指定要使用的运行时
APP_STL := system

参考:

https://developer.android.com/ndk/guides/android_mk

https://www.cnblogs.com/webor2006/p/9999063.html

http://wuxiaolong.me/2017/12/27/AndroidNDK/

gradle 插件版本、gradle版本 和buildToolsVersion之间的对应关系

一、主要概念

1、Gradle是什么?

Gradle其实就是一个构建项目的工具,即把一堆堆的目录、文件按照一定的规则关联起来,形成一个项目的自动化构建工具。

Gradle版本,如gradle-4.10.1-all.zip

位置:项目主目录 gradle 文件夹->wrapper->gradle-wrapper.properties

#Wed Apr 18 10:44:08 CST 2018
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip

2、Gradle插件又是什么?

Gradle插件是针对Gradle发行版和Android SDK Build Tools封装的一个工具,主要有两大功能:

  1. 调用Gradle本身的代码和批处理工具来构建项目
  2. 调用Android SDK的编译、打包功能

Gradle插件版本

项目主目录下的 build.gradle 中,如“com.android.tools.build:gradle:3.3.0”

Gradle插件会有版本号(3.3.0),每个版本号又对应有一个或一些 Gradle发行版本(一般是限定一个最低版本,如gradle-4.1-all.zip)

 dependencies {
        classpath 'com.android.tools.build:gradle:3.3.0'
//        classpath 'com.android.tools.build:gradle:2.3.3'
        classpath "com.google.protobuf:protobuf-gradle-plugin:0.8.6"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
    }

3、 Android SDK Build Tools Version:Android SDK 构建工具版本

buildToolsVersion 位置:app 目录->buid.gradle 文件

android {
    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion
    defaultConfig {
        applicationId "com.sogou.teemo.translate.launcher"
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.minSdkVersion
        versionCode 48
        versionName "1.4.8.${releaseTime()}"
//        jackOptions {
//            enabled false
//        }
        multiDexEnabled true //使能multDex

        ndk {
            abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
        }
    }
}

二、依赖关系

明确概念:

  • Gradle Plugin Version: Gradle 插件版本
  • Gradle Version: Gradle发行版本
  • Android SDK Build Tools Version:Android SDK 构建工具版本

三者依赖关系

  1. Gradle Plugin 有不同的版本号。 即我们常见的:classpath ‘com.android.tools.build:gradle:3.0.1’】,
    每个插件版本号又对应一个或一些 Gradle 发行版本【即我们常见的:gradle-4.1-all.zip】

如果这两个版本对应不上了,那么构建项目的时候就会报错。

  1. Gradle Plugin 还和 Android SDK BuildTool 有关联,因为它还负责和编译相关的功能,这也是为何我们要在 build.gradle 里注明 buildToolsVersion 的原因。

三者对应关系如下表:

plugin versionRequired Gradle versionRequired Gradle version
1.0.0 – 1.1.32.2.1 – 2.3
1.2.0 – 1.3.12.2.1 – 2.9
1.5.02.2.1 – 2.13
2.0.0 – 2.1.22.10 – 2.1321.1.1+
2.1.3 – 2.2.32.14.1+23.0.2+
2.3.0+3.3+25.0.0+
2.3.0+3.3+
3.0.0+4.1+26.0.2+ 不再需要为构建工具指定版本 – 插件默认使用最低要求的版本。可以删除该android.buildToolsVersion属性
3.1.0+4.4+27.0.3+ 不再需要为构建工具指定版本 – 插件默认使用最低要求的版本。可以删除该android.buildToolsVersion属性
3.2.0 – 3.2.14.6+
3.3.0 – 3.3.24.10.1+
3.4.0+5.1.1+

参考链接:

https://blog.csdn.net/gongxiaoou/article/details/81082387

http://www.blogdaren.com/post-2418.html

https://developer.android.google.cn/studio/releases/gradle-plugin