安卓安装apk失败错误码-15

应用仅仅属于测试的debug版本,仅限于adb安装,其他安装方式会失败。

用Android Studio编译app,调试的时候一切正常,但是在手机上安装或者是用adb安装的时候就提示失败,adb安装时提示的错误:INSTALL_FAILED_TEST_ONLY。

Android Studio 3.0以上会在debug apk的manifest文件application标签里自动添加 android:testOnly=”true”属性,导致IDE中run跑出的apk在大部分手机上只能用adb install -t 来安装,在一些安卓手机上甚至安装不了
解决办法:在gradle.properties(项目根目录或者gradle全局配置目录 ~/.gradle/)文件中添加android.injected.testOnly=false

以上方法如果还没有用的话。比如,Android Studio 不是用gradle编译的情况下,就需要用如下办法。

在新版AS中,点这个绿三角生成的apk,都会被标记为test only。

正确的做法是,选择Build APK(s),如下图所示:

参考:
https://blog.csdn.net/kernel_/article/details/78780192
https://blog.csdn.net/qq_25330791/article/details/89540054
https://blog.csdn.net/lihenhao/article/details/79146211

PHP 7.3 “continue” targeting switch is equivalent to “break”. Did you mean to use “continue 2”?

Composer PHP7.3 SHA384 is not supported by your openssl extension
在使用composer 更新时候的,报错
解决方法
composer selfupdate
composer self-update

再次报错如下:
SHA384 is not supported by your openssl extension, could not verify the phar file integrity

解决(mac)
重新下载在安装
rm -f /usr/local/bin/composer
curl -s https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

Remove Your older versions and install the latest version of Composer,
Remove Your older version: sudo rm -f /usr/local/bin/composer
Download the installer: sudo curl -s https://getcomposer.org/installer | php
Move the composer.phar file: sudo mv composer.phar /usr/local/bin/composer

参考:
https://www.heibaiketang.com/forum/show/173.html

Java微信语音amr格式转mp3格式,兼容Linux/Mac/Windows,支持Maven

其实之间用dadiyang的jave库就可以了,建议切换maven到ali的国内镜像库。但是由于mac升级,需要用最新版本的ffmpeg来运行,其它没有什么特别要注意的地方啦。

建议参考我这边fork的库,其实就是更新了ffmpeg-mac这个文件咯。

参考:

https://blog.csdn.net/dadiyang/article/details/85003240

https://github.com/deaboway/jave

https://baijiahao.baidu.com/s?id=1596812208203490238&wfr=spider&for=pc

http://ffmpeg.org/

从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