Hi all,
I would like to congratulate you on the great job you did with rtl-sdr and I am really admiring you work!
I am the developer of SDR Touch,
I received a copyright violation notice from one of the developers.
I wanted to point out that rtl_tcp_andro and SDR Touch are completely separate binaries in the aggregate called SDRTouch.apk. They are never linked together - neither before, nor after the unrar-ing of the apk onto the user's Android device. They communicate via TCP. Once the installation of the apk is over, the binaries and rtl_tcp_andro reside in completely different directories on the Android device.
rtl_tcp_andro is a derivative work of rtl_tcp and is released under GPL2+ - https://github.com/martinmarinov/rtl_tcp_andro- (In order to honour GPL you can actually visit this webiste via the Help message that you see on SDR Touch).
rtl_tcp_andro is merely started using Runtime.exec() command. It is never linked - neither statically nor dynamically. Furthermore SDR Touch can happily work without the local rtl_tcp and this is there only for user's convenience. SDR Touch can function over the network without requiring a local rtl_tcp.
Since SDR Touch and rtl_tcp are completely separate works, and the user is aware of the license of rtl_tcp_andro and has access to its source code, SDR Touch does not violate GPL2+. It is true they reside in the same installer before being installed on the device, but this is allowed in GPL3 and is called an aggregate.
Does it make sense? Is there anything I can do so we can settle this issue once and for all?
Thanks, Martin
Hi,
Since SDR Touch and rtl_tcp are completely separate works, and the user is aware of the license of rtl_tcp_andro and has access to its source code, SDR Touch does not violate GPL2+. It is true they reside in the same installer before being installed on the device, but this is allowed in GPL3 and is called an aggregate.
That's where our opinions differ. For me the way the package is currently distributed doesn't qualify as an aggregate.
The fact they are separate binaries and that rtl_tcp_andro by itself is properly released is of course a good part of the work toward compliance, but it's not sufficient.
You compared the .apk to an "installer", but I really don't see it that way (AFAIK .apk are not even uncompressed, some files might be cached but they mostly stay bundled). It's not like you have two independent packages that are pulled together, here you have a single package.
And if you want to compare it to something, it's much closer to the OSX way of distributing application where even though on the file system the application is several files, the whole bundle only represent a single larger "Application" and everything else is completely hidden from the user.
I mean a single ELF file is split into sections and 'installed' into distinct RAM pages but it'd be hard to argue it's not a single application because that's just a technicality of the way that platform work.
Same thing for Android: For all intents and purposes, an APK _is_ a single application.
Let's look at the relevant section covering "aggregation" in the GPL:
End of Section 2 of GPLv2:
In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
End of Section 5 of GPLv3
A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.
So basically for this to apply, what's bundled with a GPL Program must not be either "work based on the Program" or "not combined with the Program to form a larger Program".
I really don't see how you could not describe the "SDR touch" application in its whole as not a combination fully including the rtl-sdr code when more than half the description on Google Play describes functionality provided by the rtl-sdr code.
Theses clauses were meant for things like distributions or when shipping installed systems that just happen to contains GPL part among many and I really don't see its applicability here where you only have two parts: - The GPL covered work - A independent application that heavily relies on the GPL work to do what it's supposed to.
Is there anything I can do so we can settle this issue once and for all?
As was suggested elsewhere, a good step towards compliance and gesture of good faith would be:
- Distribute rtl_tcp_andro as a separate Android application - Make sure that second application has the LICENSE both in the package and visible to the user through the interface somewhere.
This would also nicely allows other application to share the device and would probably make it easier for the user to replace rtl_tcp_andro with a self compiled / updated version or whatever. (after all the ability of the user to use a modified version in place of the distributed one without undue hassle, is also a requirement, 'anti-tivoization' stuff, but I'm not familiar enough with android ecosystem to see if applicable here)
Now, this is not perfect and one could argue that the heavy reliance of the java app on the rtl-sdr (contrary to some other application that would support a lot more data source) could be construded as "derivative". But when the application are really split in two independently installed and distributed packages, this becomes a whole lot less clear to me and a definitive answer could only be given by a judge in a court of law.
Cheers,
Sylvain
Obligatory disclaimer:
Of course, IANAL, this doesn't constitute legal advice and the opinions expressed here are my own, I have no right whatsoever to speak for anyone else than myself ...