Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

64bit support? #98

Open
moster67 opened this issue Mar 14, 2019 · 106 comments
Open

64bit support? #98

moster67 opened this issue Mar 14, 2019 · 106 comments

Comments

@moster67
Copy link

moster67 commented Mar 14, 2019

Hello and many thanks for your ffmpeg library for Android.

After reading about the new 64bit requirement for Android of native libraries, I noted that your library is not stored in Libs but in Assets. Instructions from Google says to verify for the presence of 64bit by looking at the Directory-names. If I unzip, it only contains Arm and x86 directories and does not give an indication if 64 libs is included.

See this:
https://developer.android.com/distribute/best-practices/develop/64-bit

However, your readme seems to indicate support for 64bit when it says
armv8 (and x86_64).

Can you confirm that your library is OK with Google's new requirements?

Thanks.

@yagilofir
Copy link

+1 for this question. That's a very interesting topic these days.

@jitarun
Copy link

jitarun commented Apr 4, 2019

Please confirm that this library supports 64 bit?

@Brianvdb
Copy link
Member

Brianvdb commented May 1, 2019

There are currently no 64 bit libraries added. Will update back on this.

@yarovoiag-cr
Copy link

Any changes ?

@nikunjparadva
Copy link

nikunjparadva commented May 28, 2019

Google play console must require 64bit support Please do asap to support this Library.
currently 32bit is available , 64 bit folders not found

https://developer.android.com/distribute/best-practices/develop/64-bit#does_your_app_include_64-bit_libraries

Thanks

@kohiyadav
Copy link

Please suggest how to generate ffmpeg binaries for 64-bit. I followed https://github.com/WritingMinds/ffmpeg-android link to generate all architecture binaries but the last command in readme file ./android_build.sh fails with following error:

HOST_OS=linux
HOST_EXE=
HOST_ARCH=x86_64
HOST_TAG=linux-x86_64
HOST_NUM_CPUS=4
BUILD_NUM_CPUS=8
Auto-config: --arch=arm
ERROR: Failed to create toolchain.
~/ffmpeg-android/x264 ~/ffmpeg-android
Makefile:3: config.mak: No such file or directory
./configure
platform: X86_64
byte order: little-endian
system: LINUX
cli: yes
libx264: internal
shared: no
static: no
asm: yes
interlaced: yes
avs: avxsynth
lavf: yes
ffms: no
mp4: no
gpl: yes
thread: posix
opencl: yes
filters: resize crop select_every
debug: no
gprof: no
strip: no
PIC: no
bit depth: 8
chroma format: all

You can run 'make' or 'make fprofiled' now.
rm -f common/mc.o common/predict.o common/pixel.o common/macroblock.o common/frame.o common/dct.o common/cpu.o common/cabac.o common/common.o common/osdep.o common/rectangle.o common/set.o common/quant.o common/deblock.o common/vlc.o common/mvpred.o common/bitstream.o encoder/analyse.o encoder/me.o encoder/ratecontrol.o encoder/set.o encoder/macroblock.o encoder/cabac.o encoder/cavlc.o encoder/encoder.o encoder/lookahead.o common/threadpool.o common/x86/mc-c.o common/x86/predict-c.o common/opencl.o encoder/slicetype-cl.o common/x86/const-a.o common/x86/cabac-a.o common/x86/dct-a.o common/x86/deblock-a.o common/x86/mc-a.o common/x86/mc-a2.o common/x86/pixel-a.o common/x86/predict-a.o common/x86/quant-a.o common/x86/cpu-a.o common/x86/dct-64.o common/x86/bitstream-a.o common/x86/sad-a.o common/x86/trellis-64.o x264.o input/input.o input/timecode.o input/raw.o input/y4m.o output/raw.o output/matroska.o output/matroska_ebml.o output/flv.o output/flv_bytestream.o filters/filters.o filters/video/video.o filters/video/source.o filters/video/internal.o filters/video/resize.o filters/video/cache.o filters/video/fix_vfr_pts.o filters/video/select_every.o filters/video/crop.o filters/video/depth.o input/avs.o input/thread.o input/lavf.o *.a *.lib *.exp *.pdb x264 x264.exe .depend TAGS
rm -f checkasm checkasm.exe tools/checkasm.o tools/checkasm-a.o common/oclobj.h x264_lookahead.clbin
rm -f example example.exe example.o
rm -f common/mc.gcda common/predict.gcda common/pixel.gcda common/macroblock.gcda common/frame.gcda common/dct.gcda common/cpu.gcda common/cabac.gcda common/common.gcda common/osdep.gcda common/rectangle.gcda common/set.gcda common/quant.gcda common/deblock.gcda common/vlc.gcda common/mvpred.gcda common/bitstream.gcda encoder/analyse.gcda encoder/me.gcda encoder/ratecontrol.gcda encoder/set.gcda encoder/macroblock.gcda encoder/cabac.gcda encoder/cavlc.gcda encoder/encoder.gcda encoder/lookahead.gcda common/threadpool.gcda common/x86/mc-c.gcda common/x86/predict-c.gcda common/opencl.gcda encoder/slicetype-cl.gcda x264.gcda input/input.gcda input/timecode.gcda input/raw.gcda input/y4m.gcda output/raw.gcda output/matroska.gcda output/matroska_ebml.gcda output/flv.gcda output/flv_bytestream.gcda filters/filters.gcda filters/video/video.gcda filters/video/source.gcda filters/video/internal.gcda filters/video/resize.gcda filters/video/cache.gcda filters/video/fix_vfr_pts.gcda filters/video/select_every.gcda filters/video/crop.gcda filters/video/depth.gcda input/avs.gcda input/thread.gcda input/lavf.gcda common/mc.gcno common/predict.gcno common/pixel.gcno common/macroblock.gcno common/frame.gcno common/dct.gcno common/cpu.gcno common/cabac.gcno common/common.gcno common/osdep.gcno common/rectangle.gcno common/set.gcno common/quant.gcno common/deblock.gcno common/vlc.gcno common/mvpred.gcno common/bitstream.gcno encoder/analyse.gcno encoder/me.gcno encoder/ratecontrol.gcno encoder/set.gcno encoder/macroblock.gcno encoder/cabac.gcno encoder/cavlc.gcno encoder/encoder.gcno encoder/lookahead.gcno common/threadpool.gcno common/x86/mc-c.gcno common/x86/predict-c.gcno common/opencl.gcno encoder/slicetype-cl.gcno x264.gcno input/input.gcno input/timecode.gcno input/raw.gcno input/y4m.gcno output/raw.gcno output/matroska.gcno output/matroska_ebml.gcno output/flv.gcno output/flv_bytestream.gcno filters/filters.gcno filters/video/video.gcno filters/video/source.gcno filters/video/internal.gcno filters/video/resize.gcno filters/video/cache.gcno filters/video/fix_vfr_pts.gcno filters/video/select_every.gcno filters/video/crop.gcno filters/video/depth.gcno input/avs.gcno input/thread.gcno input/lavf.gcno *.dyn pgopti.dpi pgopti.dpi.lock *.pgd *.pgc
-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fno-strict-overflow -fstack-protector-all
No working C compiler found.

I have searched alot but did not get anything.

Please help
Thanks

@8285497507
Copy link

By August 1, 2019, all apps that use native code must provide a 64-bit version in addition to the 32-bit version in order to publish an update. This past January, we reiterated that this is required in order to make way for innovation and in anticipation of future Android devices that only support 64-bit code.As the deadline approaches, we wanted to remind you that at least one of your apps* uses native code but does not currently offer a 64-bit variant: By August 1, 2019, all apps that use native code must provide a 64-bit version in addition to the 32-bit version in order to publish an update. This past January, we reiterated that this is required in order to make way for innovation and in anticipation of future Android devices that only support 64-bit code.As the deadline approaches, we wanted to remind you that at least one of your apps* uses native code but does not currently offer a 64-bit variant: By August 1, 2019, all apps that use native code must provide a 64-bit version in addition to the 32-bit version in order to publish an update. This past January, we reiterated that this is required in order to make way for innovation and in anticipation of future Android devices that only support 64-bit code. As the deadline approaches, we wanted to remind you that at least one of your apps* uses native code but does not currently offer a 64-bit variant:
By August 1, 2019, all apps that use native code must provide a 64-bit version in addition to the 32-bit version in order to publish an update. This past January, we reiterated that this is required in order to make way for innovation and in anticipation of future Android devices that only support 64-bit code.As the deadline approaches, we wanted to remind you that at least one of your apps* uses native code but does not currently offer a 64-bit variant: By August 1, 2019, all apps that use native code must provide a 64-bit version in addition to the 32-bit version in order to publish an update. This past January, we reiterated that this is required in order to make way for innovation and in anticipation of future Android devices that only support 64-bit code. As the deadline approaches, we wanted to remind you that at least one of your apps* uses native code but does not currently offer a 64-bit variant:
By August 1, 2019, all apps that use native code must provide a 64-bit version in addition to the 32-bit version in order to publish an update. This past January, we reiterated that this is required in order to make way for innovation and in anticipation of future Android devices that only support 64-bit code.
As the deadline approaches, we wanted to remind you that at least one of your apps* uses native code but does not currently offer a 64-bit variant:

#How to create library that support 64 bit ..........

@ghost
Copy link

ghost commented Jun 13, 2019

If you share the compiler script? Is the best option to reduce binary size or add https support

@niallwatchorn
Copy link

Any updates on this? Is there a 64-bit library available yet? Time is edging closer to the cutoff point, and I assume many apps on Android use FFMPEG for video editing. Be useful to get it updated to 64 bit asap.

Also, any plans to implement hardware acceleration? Currently runs so slowly on the Pixel 3 doing basic operations.

@yadavkohi
Copy link

Hello guys,

I am working on 64-bit ffmpeg binaries. Once completed I will update you on it.

@nikunjparadva
Copy link

@yadavkohi have you completed this 64bit update?, I am really waiting for that

@yadavkohi
Copy link

guys still working on it.

@sushinpv
Copy link

Hi @yadavkohi ,

We are literally waiting for your update

@thucnd55
Copy link

Any update ?
Why i can not find any question in google search with this problem. It's so Critical @@

@formatBCE
Copy link

I can't even imagine, how many apps are using this library, and how many devs are waiting for update...

@sysquare
Copy link

@yadavkohi , any rough idea by when everyone can get it ? 32 bit support will shut down in 4 weeks

@yadavkohi
Copy link

I will try to finish it by mid july

@8285497507
Copy link

8285497507 commented Jul 10, 2019

Guys , i got Solution for this problems. now wait for 2 days to confirmation

@formatBCE
Copy link

Hey guys. Could it be, that, since library is using ffmpeg binary by itself (copy -> run), it should work as is? There's no any pre-compilled .so files, referring to certain architecture. It's just binary executable file, which is launched by app itself, and has no influence in code (and it is in assets folder, btw). So it could be possible, that Google will know nothing about this binary during app publishing.

@8285497507
Copy link

android {
compileSdkVersion 29
defaultConfig {
applicationId "com.xyz.videoEditor"
minSdkVersion 16
targetSdkVersion 29
versionCode 2
ndk.abiFilters 'arm64-v8a','x86_64' //Ads this line
versionName "1.2"

    multiDexEnabled true
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}

@formatBCE
Copy link

In which world should it resolve current issue, and how?
It just filters 64-bit architectures, but we don't want that!

@thucnd55
Copy link

In short time, i'm using https://github.com/tanersener/mobile-ffmpeg for hot fix . It'seem be resolve 64-bit issue

@sysquare
Copy link

sysquare commented Jul 13, 2019

@yadavkohi any update ?
Also, may I know who are the persons who has ownership of this ticket.
Can we know when and from whom we can expect this fix so that stop asking everyday. Its on SEV-1 now in our project

Does anyone has any idea that what worst can happen if we were not able to update before August1 and is there any workaround or temporary solution ?

@sysquare
Copy link

Hey ALL,
I just uploaded a build on play store and its not showing me any warning for 64 bit, is there anything which got changed ?

@formatBCE
Copy link

As i suggested, most probably we'll be all good with this library. Binary native file is used from assets folder, and Google takes eye on lib folder.

@sysquare
Copy link

May be you are true but my concern is that until my last upload on play store(which was approx 3 weeks before) google was giving me 64-bit warning but now its not. I have not changed anything.

@yadavkohi
Copy link

yadavkohi commented Jul 16, 2019

Hello guys,

I have created the 64-bit binaries.
Please follow the below git repository.

https://github.com/yadavkohi/FFmpeg-64Bit

@sysquare
Copy link

Thanks @yadavkohi
Do we have to just add binaries provided in above link under "src/main/assets/" ?? Thats it or something else needs to be done ?

@yadavkohi
Copy link

yes just add the binaries under "src/main/assets" and try with your ffmpeg commands.

@luifermoron
Copy link

thank you for answering. do you know if it is possible to put the files located on assets folder on libs folder? will it work? I am newbie too

@formatBCE
Copy link

@Luifer94 no, it's not. Assets folder is the only which stays untouched during build, and reachable in runtime for binaries copying to system app folder. That's how this solution works.
Other (right) way to do this is create .so libraries for ffmpeg, and put them into libs (with NDK). But in that case, every command should be wrapped by additional java lib method. There's a lot of work to do it. I don't think, that somebody did that already. That's why we use this solution, though it has some consequences...

@alexcohn
Copy link

@Luifer94 you can look at my pull request that does exactly this (I have not added the 64-bit variant, because I did not have time to test it, but this doesn't require code changes with my solution). The advantage of moving the binaries to libs folder is that this also works on Android Q.

@darrinps
Copy link

@alexcohn Do you have plans to add the 64-bit variant soon? Seems to me it would take care of both issues (working with Android Q/10 as the target and the 64 bit support) at the same time.

@rafabets
Copy link

Hello guys,

I have created the 64-bit binaries.
Please follow the below git repository.

https://github.com/yadavkohi/FFmpeg-64Bit

I have verified that you built with the following libraries:
  -libmp3lame -libx264 -libfreetype -libfontconfig

Could you build with the same bravobit libraries? Now i'm getting these messages: "Unknown decoder 'libvpx-vp9'" and "Unknown encoder 'libfdk_aac'"
I will be very grateful.

Bravobit build libraries:
x264, libpng, freetype2, libmp3lame, libvorbis, libvpx, libopus, fontconfig, libass, fribidi, expat, fdk-aac

@alexcohn
Copy link

alexcohn commented Aug 26, 2019

@darrinps as you see in @rafabets comment, the 64-bit variants built by @yadavkohi cannot exactly replace the 32-bit binaries included in @bravobit solution. But you can easily drop them in if they satisfy your requirements.

Actually, it's enough to put these binaries in the jniLibs folder in your app (renamed to lib..ffmpeg..so), and they will be loaded correctly. No code changes required.

@darrinps
Copy link

darrinps commented Aug 27, 2019

@alexcohn I appreciate your response here. That followup begs the question though, if the variants built by @yadavkohi don't work as well as the current 32 bit ones already included in FFmpeg-Android, can ones that do work as well be created, and if so, are there plans to get those into it?

We all need good 64 bit versions after all correct? Would think this would be at the top of the list of priorities (although I understand this isn't a "day job" for folks here).

@equationl
Copy link

Hey guys, I just found a project from this which support 64bit.
But I think the size too big to me, so I just edited a project like this, Use download instead of packaging all binaries. Now it just 20kb.

@mati-araujo
Copy link

I am able to generate the APK as expected, but unfortunately both arm64-v8a and x86_64 versions do not contain any 64-bit code.

There is no lib directory when analyzing the APK in Android Studio while the APK armeabi-v7a includes lib / libarm_arch.so.

Any one could solve this problem and publish his app in google play?

@alexcohn
Copy link

Where did you find libarm_arch.so? It's not in the latest AAR and not in the source tree.

@mati-araujo
Copy link

When I analyze my APK the ffmpeg compilations appears under assets directory and I think they are working but also I find libarm_arch.so under the lib directory but only for 32 bit, and this compilations are being generated because I'm using ffmpeg in my project.

@alexcohn
Copy link

This libarm_arch.so may come from a different repo, e.g. https://github.com/WritingMinds/ffmpeg-android-java

@afsaredrisy
Copy link

Hi @marsvoltero have you fixed that issue? I am also facing the same issue, having libarm_arch.so in armeabi-v7a and x86 but not in x86_64 and arm64-v8a

@alexcohn
Copy link

actually, I would recommend to everybody worried about 64 bit and Android Q to try this different approach: https://github.com/tanersener/mobile-ffmpeg. It works with libffmpeg.so instead of executable, which is better supported by the system, but does have its own caveats.

@manikanta1219
Copy link

Hey guys, I just found a project from this which support 64bit.
But I think the size too big to me, so I just edited a project like this, Use download instead of packaging all binaries. Now it just 20kb.

can you tell me clearly how it is possible.

@manikanta1219
Copy link

actually, I would recommend to everybody worried about 64 bit and Android Q to try this different approach: https://github.com/tanersener/mobile-ffmpeg. It works with libffmpeg.so instead of executable, which is better supported by the system, but does have its own caveats.

hii @alexcohn how to use this by removing static binary files from project.can you explain thank you

@alexcohn
Copy link

alexcohn commented Nov 5, 2019

I just edited a project like this, Use download instead of packaging all binaries. Now it just 20kb.

@equationl I am not sure if downloading binaries complies with Play Store policies, but it will definitely not work on Android Q.

@equationl
Copy link

I just edited a project like this, Use download instead of packaging all binaries. Now it just 20kb.

@equationl I am not sure if downloading binaries complies with Play Store policies, but it will definitely not work on Android Q.

Actually I already post it to google play,also I'm not sure it complies with Play Store policies.
It work well on Android Q, I just run it by Android Virtual Device.

@manikanta1219
Copy link

screen-4

Anybody please tell me how to integrate online music into android app like above image..
Thank you

@pankajtalaviya97
Copy link

https://github.com/WritingMinds/ffmpeg-android is not a 64 bit library

@darrinps
Copy link

darrinps commented Nov 16, 2019 via email

@alexcohn
Copy link

running on Android Q on a physical device

That's cool

@pratikbutani
Copy link

I got a solution and My app is published successfully without warning. I have also tested in Firebase Testlab with 5 different devices.

The build.gradle may help you:

apply plugin: 'com.android.application'
// Apply the Firebase Crashlytics plugin.
apply plugin: 'com.google.firebase.crashlytics'

android {
	compileSdkVersion 29
	buildToolsVersion "29.0.2"
	defaultConfig {
		applicationId 'com.example.demo'
		minSdkVersion 21
		targetSdkVersion 28
		multiDexEnabled true
		versionCode 3
		versionName '1.2'
		resConfigs "en"
		testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
		vectorDrawables.useSupportLibrary true

		renderscriptTargetApi 19
		renderscriptSupportModeEnabled true
		ndk.abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64'
	}
	dataBinding {
		enabled true
	}
	buildTypes {
		release {
			minifyEnabled true
			shrinkResources true
			proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

			//Other parameters
			debuggable false
			jniDebuggable false
			renderscriptDebuggable false
			//signingConfig playStoreConfig //Add your own signing config
			pseudoLocalesEnabled false
			zipAlignEnabled true
		}
	}
	packagingOptions {
		exclude 'META-INF/DEPENDENCIES'
		exclude 'META-INF/LICENSE'
		exclude 'META-INF/LICENSE.txt'
		exclude 'META-INF/license.txt'
		exclude 'META-INF/NOTICE'
		exclude 'META-INF/NOTICE.txt'
		exclude 'META-INF/notice.txt'
		exclude 'META-INF/ASL2.0'
	}
       aaptOptions {
            ignoreAssetsPattern "!*ffprobe"
            ignoreAssetsPattern "!*ffmpeg"
            ignoreAssetsPattern "!arm"
            ignoreAssetsPattern "!x86"
            additionalParameters "--no-version-vectors"
            cruncherEnabled = false
        }
	compileOptions {
             sourceCompatibility JavaVersion.VERSION_1_8
             targetCompatibility JavaVersion.VERSION_1_8
	}
}

dependencies {
	implementation fileTree(dir: 'libs', include: ['*.jar'])
	implementation 'androidx.appcompat:appcompat:1.1.0'
	implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
	implementation 'com.google.android.material:material:1.1.0'

	implementation 'com.google.firebase:firebase-firestore:21.4.3'
	implementation 'com.firebaseui:firebase-ui-firestore:6.0.2'
	implementation 'com.google.firebase:firebase-analytics:17.4.0'
	implementation 'com.google.firebase:firebase-messaging:20.1.6'
	implementation 'com.google.firebase:firebase-config:19.1.4'
    implementation 'com.google.firebase:firebase-crashlytics:17.0.0'
    implementation 'com.google.android.gms:play-services-ads:19.1.0'
    implementation 'com.google.firebase:firebase-auth:19.3.1'
    implementation 'com.google.android.gms:play-services-auth:18.0.0'

	implementation 'com.github.bumptech.glide:glide:4.11.0'
	annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'

	annotationProcessor 'androidx.annotation:annotation:1.1.0'

	implementation 'io.github.inflationx:calligraphy3:3.1.1'
	implementation 'io.github.inflationx:viewpump:2.0.3'

	testImplementation 'junit:junit:4.13'
	implementation 'androidx.multidex:multidex:2.0.1'
	androidTestImplementation 'androidx.test:runner:1.2.0'
	androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

    implementation 'com.squareup.retrofit2:retrofit:2.8.1'
    implementation 'com.squareup.retrofit2:converter-gson:2.8.1'

	implementation 'com.danikula:videocache:2.7.1'
	implementation 'com.github.HamidrezaAmz:MagicalExoPlayer:1.0.14'

	implementation 'com.github.AppIntro:AppIntro:5.1.0'
	implementation 'com.writingminds:FFmpegAndroid:0.3.2'
}

apply plugin: 'com.google.gms.google-services'

I made three changes in that:

  1. Added lines in default config:
                renderscriptTargetApi 19
		renderscriptSupportModeEnabled true
		ndk.abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64'
  1. added packagingOptions
  2. added aaptOptions

Try. May you will get success.

alexcohn referenced this issue in alexcohn/FFmpeg-Android May 21, 2020
This reverts commit e50d1c4
See https://issuetracker.google.com/issues/152645643 for discussion: this is not supposed to work, wrap.sh is a special well-known name. Also, older devices (e.g. API 24) don't install files from libs directory if they don't match the expected "lib.*\.so" pattern.
@thomas-coinjar
Copy link

Awesome work @alexcohn,

Thanks for helping with the 64bit implementation.

I too started using this project and ran into the Android Q problem.

I really hope I don't have to use another library and rewrite the code again. Hence your help is much appreciated.

In the meantime could I just put this binary into the arm64-v8a folder or will that not work?

@alexcohn
Copy link

alexcohn commented Jun 6, 2020

@thomas-coinjar: feel free to put these alternative binaries into your project. @yadavkohi built ffmpeg with a very specific set of extra libraries, so it won't be wise to use them for general purposes. OTOH, there is no real benefit switching to 64-bit. As I have explained before, you can simply copy the 32-bit binaries (ffmpeg and/or ffprobe) to src/main/jniLibs/arm64-v8a.

When you distribute your app, I recommend to use ABI splits, so that only one copy of CPU-dependent binaries is downloaded to each device.

@Ahmed-Basalib10
Copy link

Can any one explain the steps that make it working on android Q plz ?

@alexcohn

@alexcohn
Copy link

Can any one explain the steps that make it working on android Q plz ?

Maybe it's time to switch to https://github.com/tanersener/mobile-ffmpeg as @thucnd55 suggested a year ago?

@Ahmed-Basalib10
Copy link

@alexcohn i switched to mobile-ffmpeg but it increased my app size

@alexcohn
Copy link

@Ahmed715 there are some recommendations how to reduce the app size. First of all, use ABI splits so that 32-bit and 64-bit libraries are not distributed in one APK. Also, only enable the relevant external libraries.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests