低版本项目来自
https://github.com/shihyu/vlc-android/tree/master
高版本使用vlc官方即可
https://github.com/videolan/vlc-android
高版本编译过程未更新完成,待更新 1228
1 低版本
最终效果如图
可直接运行在as的版本 已上传至github https://github.com/yyoujinga/vlc-android/tree/master
提示:低版本和现在的相比,缺失很多功能(如倍速播放),但假如仅用来做视频播放器,还是很合适的,已经支持多格式。
本文章重要记录了报错和办理方案
重要修改的地方为项目级build.gradle和两个模块的build.gralde,gradle插件和gradle版本,因为是十几年前的项目,我最终可正常运行的版本如图所示
1 预备工作
旧版本没有gradle文件夹,从本地已有的项目中拷贝一个过去即可(假如不想测试可运行的最终版本,可参考我上面的版本)
2
The “android” command is no longer included in the SDK. Any references to it (e.g. by third-party plugins) should be removed.
com.android.build.gradle.internal.crash.ExternalApiUsageException: groovy.lang.GroovyRuntimeException: Could not find matching constructor for: com.android.builder.core.DefaultManifestParser()
Cannot invoke method include() on null object
修改项目级build.gradle
- // Top-level build file where you can add configuration options common to all sub-projects/modules.
- buildscript {
- repositories {
- maven { url 'https://maven.aliyun.com/repository/public/' }
- maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
- maven { url 'https://maven.aliyun.com/repository/central' }
- google()
- jcenter()
- }
- dependencies {
- classpath 'com.android.tools.build:gradle:3.1.0'
- classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.12.+'
- }
- }
- allprojects {
- repositories {
- maven { url 'https://maven.aliyun.com/repository/public/' }
- maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
- maven { url 'https://maven.aliyun.com/repository/central' }
- google()
- jcenter()
- }
- // apply plugin: 'android-sdk-manager'
- }
- ext {
- buildToolsVersion = "22"
- compileSdkVersion = 22
- }
复制代码
参考
https://stackoverflow.com/questions/42720255/errorthe-android-command-is-no-longer-included-in-the-sdk-any-references-to
3
Could not find matching constructor for: com.android.builder.core.DefaultManifestParser()
DefaultManifestParser 在较新的 Gradle 插件版本中被移除了,该版本我记得是2.2的gradle,相对有点太低了,移除该方法即可,因为是要对播放器进行定制,以是原获取版本的方法也不太需要,我这边都注释掉了。
模块libvlc目录下的build.gradle(模块vlc-android目录下同理,下面会直接po代码)
libvlc
- import com.sun.corba.se.impl.orbutil.concurrent.Sync
- apply plugin: 'com.android.library'
- android {
- compileSdkVersion rootProject.ext.compileSdkVersion
- buildToolsVersion rootProject.ext.buildToolsVersion
- sourceSets {
- main {
- jni.srcDirs = [] // Prevent gradle from building native code with ndk; we have our own Makefile for it.
- jniLibs.srcDir 'jni/libs' // Where generated .so files are placed.
- manifest.srcFile 'AndroidManifest.xml'
- java.srcDirs = ['src']
- resources.srcDirs = ['src']
- aidl.srcDirs = ['src']
- renderscript.srcDirs = ['src']
- res.srcDirs = ['res']
- assets.srcDirs = ['assets']
- }
- }
- defaultConfig {
- minSdkVersion 7
- targetSdkVersion 22
- }
- buildTypes {
- release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
- }
- }
- // Make per-variant version code
- libraryVariants.all { variant ->
- // def manifestParser = new com.android.builder.core.DefaultManifestParser()
- // get the version code of each flavor
- // def vlcVersion = manifestParser.getVersionName(android.sourceSets.main.manifest.srcFile)
- //Custom APK name
- // def vlcVersion = 'c'+variant.getVersionCode()
- def vlcVersion = 'c'+ 2.2
- // variant.outputs.each { output ->
- // def outputFile = output.outputFile
- // if (outputFile != null && outputFile.name.endsWith('.aar')) {
- // def fileName = "libvlc-${vlcVersion}.aar"
- // output.outputFile = new File(outputFile.parent, fileName)
- // }
- // }
- variant.outputs.all { output ->
- def outputFileName = "your-custom-output-file-name.apk"
- output.outputFileName = outputFileName
- }
- }
- }
- /*
- * Include GDB files into apk
- */
- //afterEvaluate {
- // Sync packageTask = project.getTasks().findByName("packageReleaseJniLibs")
- // packageTask.include(['**/gdbserver', '**/gdb.setup'])
- //}
- afterEvaluate {
- Sync packageTask = project.getTasks().findByName("packageReleaseJniLibs")
- if (packageTask != null) {
- packageTask.include(['**/gdbserver', '**/gdb.setup'])
- } else {
- println("Task 'packageReleaseJniLibs' not found. Skipping include configuration.")
- }
- }
- class BuildNative extends Exec {
- }
- tasks.withType(BuildNative){
- /*
- Properties set for Android Studio own shell.
- when you run gradlew from cli, OS shell env variables will be used
- To be able to build from Android Studio, you have to set ndk.dir & sdk.dir
- properties in local.properties in the root folder, like this (for example):
- sdk.dir=/home/<username>/SDK/android-sdk-linux
- ndk.dir=/home/<username>/SDK/android-ndk-r10b
- */
- if (System.getenv('ANDROID_SDK') == null || System.getenv('ANDROID_NDK') == null) {
- Properties properties = new Properties()
- properties.load(project.rootProject.file('local.properties').newDataInputStream())
- environment 'ANDROID_NDK', properties.getProperty('ndk.dir')
- environment 'ANDROID_SDK', properties.getProperty('sdk.dir')
- }
- workingDir '..'
- // commandLine './compile-libvlc.sh'
- }
- //task buildDebugARMv5(type:BuildNative) {
- // args('-a', "armeabi-v5")
- //}
- task buildDebugARMv6(type:BuildNative) {
- args('-a', "armeabi")
- }
- task buildDebugARMv6_nofpu(type:BuildNative) {
- args('-a', "armeabi-nofpu")
- }
- task buildDebugARMv7(type:BuildNative) {
- args('-a', "armeabi-v7a")
- }
- task buildDebugARM64(type:BuildNative) {
- args('-a', "arm64-v8a")
- }
- task buildDebugx86(type:BuildNative) {
- args('-a', "x86")
- }
- task buildDebugx86_64(type:BuildNative) {
- args('-a', "x86_64")
- }
- task buildDebugMIPS(type:BuildNative) {
- args('-a', "mips")
- }
- task buildDebugMIPS64(type:BuildNative) {
- args('-a', "mips64")
- }
- dependencies {
- compile 'com.android.support:support-annotations:22.2.0'
- }
复制代码
模块vlc-android 目录下
- apply plugin: 'com.android.application'
- android {
- compileSdkVersion rootProject.ext.compileSdkVersion
- buildToolsVersion rootProject.ext.buildToolsVersion
- flavorDimensions "target", "abi"
- lintOptions {
- abortOnError false
- disable 'MissingTranslation', 'ExtraTranslation'
- }
- defaultConfig {
- applicationId "org.videolan.vlc"
- resValue "string", "build_time", buildTime()
- resValue "string", "build_host", hostName()
- resValue "string", "build_revision", revision()
- //Set the build ABI according to build types only if not launched from compile.sh
- if (System.getenv('PASSWORD_KEYSTORE') == null)
- tasks.whenTaskAdded { task ->
- if (task.name.startsWith('assemble')) {
- /*if (task.name.endsWith('ARMv5Debug'))
- task.dependsOn(":libvlc:buildDebugARMv5")
- else */if (task.name.endsWith('ARMv6fpuDebug'))
- task.dependsOn(":libvlc:buildDebugARMv6")
- else if (task.name.endsWith('ARMv6nofpuDebug'))
- task.dependsOn(":libvlc:buildDebugARMv6_nofpu")
- else if (task.name.endsWith('ARMv7Debug'))
- task.dependsOn(":libvlc:buildDebugARMv7")
- else if (task.name.endsWith('ARMv8Debug'))
- task.dependsOn(":libvlc:buildDebugARM64")
- else if (task.name.endsWith('X86Debug'))
- task.dependsOn(":libvlc:buildDebugx86")
- else if (task.name.endsWith('X86_64Debug'))
- task.dependsOn(":libvlc:buildDebugx86_64")
- else if (task.name.endsWith('MIPSDebug'))
- task.dependsOn(":libvlc:buildDebugMIPS")
- else if (task.name.endsWith('MIPS64Debug'))
- task.dependsOn(":libvlc:buildDebugMIPS64")
- }
- }
- }
- signingConfigs {
- release {
- /*
- To set this properties, create file gradle.properties with these 3 props.
- e.g.
- keyStoreFile=/home/<username>/.android/debug.keystore
- storealias=androiddebugkey
- storepwd=android
- */
- storeFile file(keyStoreFile)
- keyAlias storealias
- if (System.getenv('PASSWORD_KEYSTORE') != null && !System.getenv('PASSWORD_KEYSTORE').isEmpty()){
- storePassword = System.getenv('PASSWORD_KEYSTORE')
- keyPassword = System.getenv('PASSWORD_KEYSTORE')
- } else {
- storePassword storepwd
- keyPassword storepwd
- }
- }
- }
- buildTypes {
- release {
- signingConfig signingConfigs.release
- minifyEnabled true
- shrinkResources false
- proguardFile 'proguard.cfg'
- }
- debug {
- applicationIdSuffix ".debug"
- jniDebuggable true
- }
- }
- productFlavors {
- vanilla {
- dimension "target"
- versionCode = 0
- buildConfigField "boolean", "tv", "false"
- }
- tv {
- minSdkVersion 17
- dimension "target"
- versionCode = 1
- buildConfigField "boolean", "tv", "true"
- }
- chrome {
- minSdkVersion 19
- dimension "target"
- versionCode = 2
- buildConfigField "boolean", "tv", "false"
- }
- ARMv5 {
- dimension "abi"
- versionCode = 1
- }
- ARMv6nofpu {
- dimension "abi"
- versionCode = 2
- }
- ARMv6fpu {
- dimension "abi"
- versionCode = 3
- }
- ARMv7 {
- dimension "abi"
- versionCode = 4
- }
- x86 {
- dimension "abi"
- versionCode = 5
- }
- MIPS {
- dimension "abi"
- versionCode = 6
- }
- ARMv8 {
- dimension "abi"
- versionCode = 7
- }
- x86_64 {
- dimension "abi"
- versionCode = 8
- }
- MIPS64 {
- dimension "abi"
- versionCode = 9
- }
- }
- // make per-variant version code
- applicationVariants.all { variant ->
- // def manifestParser = new com.android.builder.core.DefaultManifestParser()
- // // get the version code of each flavor
- // def vlcVersion = manifestParser.getVersionName(android.sourceSets.main.manifest.srcFile)
- // def targetVersion = variant.productFlavors.get(0).versionCode
- // def abiVersion = variant.productFlavors.get(1).versionCode
- //
- // // set the composite code
- // variant.mergedFlavor.versionCode = targetVersion * 10000000 + manifestParser.getVersionCode(android.sourceSets.main.manifest.srcFile) + abiVersion
- // variant.mergedFlavor.versionName = vlcVersion
- def versionName = 'v'+ variant.getVersionName()
- def vlcVersion = 'c'+variant.getVersionCode()
- //Custom APK name
- // variant.outputs.each { output ->
- // def outputName = "VLC-Android-"
- // if (!variant.productFlavors.get(0).name.equals("vanilla"))
- // outputName += variant.productFlavors.get(0).name.toUpperCase()+"-"
- // outputName += vlcVersion+"-"+variant.productFlavors.get(1).name+".apk"
- // output.outputFile = new File(output.outputFile.parentFile, outputName);
- // }
- variant.outputs.each { output ->
- def outputName = "VLC-Android-"
- if (!variant.productFlavors.get(0).name.equals("vanilla"))
- outputName += variant.productFlavors.get(0).name.toUpperCase() + "-"
- outputName += vlcVersion + "-" + variant.productFlavors.get(1).name + ".apk"
- output.outputFileName = outputName // 使用 outputFileName 替代 outputFile
- }
- }
- sourceSets.main {
- manifest.srcFile 'AndroidManifest.xml'
- java.srcDirs = ['src']
- resources.srcDirs = ['src']
- aidl.srcDirs = ['src']
- renderscript.srcDirs = ['src']
- res.srcDirs = ['res']
- assets.srcDirs = ['assets']
- }
- sourceSets.test {
- java.srcDirs = ['test']
- }
- sourceSets.tv {
- manifest.srcFile 'tv/AndroidManifest.xml'
- java.srcDirs = ['tv/src']
- resources.srcDirs = ['tv/src']
- aidl.srcDirs = ['tv/src']
- renderscript.srcDirs = ['tv/src']
- res.srcDirs = ['tv/res']
- assets.srcDirs = ['tv/assets']
- }
- sourceSets.chrome {
- manifest.srcFile 'chrome/AndroidManifest.xml'
- }
- }
- dependencies {
- compile project(':libvlc')
- compile 'com.android.support:appcompat-v7:22.2.0'
- compile 'com.android.support:cardview-v7:22.2.0'
- compile 'com.android.support:recyclerview-v7:22.2.0'
- compile 'com.android.support:design:22.2.0'
- compile 'com.android.support:support-annotations:22.2.0'
- tvCompile 'com.android.support:leanback-v17:22.2.0'
- testCompile 'junit:junit:4.12'
- }
- def buildTime() {
- return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
- }
- def hostName() {
- return System.getProperty("user.name") + "@" + InetAddress.localHost.hostName
- }
- def revision() {
- def code = new ByteArrayOutputStream()
- // exec {
- // commandLine 'git', 'rev-parse', '--short', 'HEAD'
- // standardOutput = code
- // }
- return code.toString()
- }
复制代码
4
Cannot set the value of read-only property ‘outputFile’ for object of type com.android.build.gradle.internal.api.LibraryVariantOutputImpl.
缘故原由:
outputFile 属性在 Gradle 3.x 或更高版本中被标记为 只读。
假如项目代码中实验直接修改 outputFile,例如在 build.gradle 文件中有类似如下代码:
output.outputFile = …
就会触发该错误。
办理: 具体buildgradle文档上面已经给出,这里不再重复
output.outputFileName = outputName // 使用 outputFileName 替代 outputFile
5
Build file ‘E:\oproject\vlc-video\vlc-android-master\libvlc\build.gradle’ line: 65
A problem occurred configuring project ‘:libvlc’.
Cannot invoke method include() on null objectafterEvaluate {
Sync packageTask = project.getTasks().findByName(“packageReleaseJniLibs”)
packageTask.include([‘/gdbserver’, '/gdb.setup’])
}
class BuildNative extends Exec {
}
办理:
代码实验访问 packageTask 时,没有精确找到任务,导致 packageTask 为 null。
直接写个判断,假如为null就不进行该操纵了(目前我没有用到该方法,假如有用到的请再斟酌一下)
- afterEvaluate {
- Sync packageTask = project.getTasks().findByName("packageReleaseJniLibs")
- if (packageTask != null) {
- packageTask.include(['**/gdbserver', '**/gdb.setup'])
- } else {
- println("Task 'packageReleaseJniLibs' not found. Skipping include configuration.")
- }
- }
复制代码 6
A problem occurred evaluating project ‘:vlc-android’.
Process ‘command ‘git’’ finished with non-zero exit value 128def revision() {
def code = new ByteArrayOutputStream()
exec {
commandLine ‘git’, ‘rev-parse’, ‘–short’, ‘HEAD’
standardOutput = code
}
return code.toString()
}
办理
我没有用gitclone,直接下载下来到本地解压运行的,这里注释掉即可。
7
libvlc模块中注册清单中 爆红
办理
我直接注释掉了,但很奇怪另一个模块同样的代码没有报错
到这里 设置问题基本已经办理了,接下来是小问题
8
vlc-video\vlc-android-master\vlc-android\src\org\videolan\vlc\gui\video\VideoPlayerActivity.java:381: ����: �Ҳ�������
mSysTime = (TextView) findViewById(R.id.player_overlay_systime);
^
����: ���� player_overlay_systime
�: �� id mSysTime = (TextView) findViewById(R.id.player_overlay_systime);
办理
layout文件中有两个activity_videoplayer,两个文件都确保添加player_overlay_systime即可
到这里即可正常运行了,整体项目代码已放在文章开头
2 高版本
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |