<feed xmlns='http://www.w3.org/2005/Atom'>
<title>android/scrcpy-android, branch 0.2</title>
<subtitle>[no description]</subtitle>
<link rel='alternate' type='text/html' href='http://git.0xlena.dev/android/scrcpy-android/'/>
<entry>
<title>release: 0.2</title>
<updated>2026-07-01T00:00:00+00:00</updated>
<author>
<name>Lena</name>
<email>lena@omega</email>
</author>
<published>2026-07-01T00:00:00+00:00</published>
<link rel='alternate' type='text/html' href='http://git.0xlena.dev/android/scrcpy-android/commit/?id=0678b16dc31802a069bd3ee76c12abccbe484dd7'/>
<id>0678b16dc31802a069bd3ee76c12abccbe484dd7</id>
<content type='text'>
Cut 0.2 for the F-Droid submission: it carries the opus playback fix,
transactional session bring-up and teardown, the activity hardening,
and the release-input verification. versionCode 2 corresponds to the
already-written changelog for the store listing.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Cut 0.2 for the F-Droid submission: it carries the opus playback fix,
transactional session bring-up and teardown, the activity hardening,
and the release-input verification. versionCode 2 corresponds to the
already-written changelog for the store listing.
</pre>
</div>
</content>
</entry>
<entry>
<title>readme: document security and release policy</title>
<updated>2026-07-01T00:00:00+00:00</updated>
<author>
<name>Lena</name>
<email>lena@omega</email>
</author>
<published>2026-07-01T00:00:00+00:00</published>
<link rel='alternate' type='text/html' href='http://git.0xlena.dev/android/scrcpy-android/commit/?id=701788299cd1b37dfdfc22b36e83ffd85e73a5ff'/>
<id>701788299cd1b37dfdfc22b36e83ffd85e73a5ff</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>build: verify release inputs</title>
<updated>2026-07-01T00:00:00+00:00</updated>
<author>
<name>Lena</name>
<email>lena@omega</email>
</author>
<published>2026-07-01T00:00:00+00:00</published>
<link rel='alternate' type='text/html' href='http://git.0xlena.dev/android/scrcpy-android/commit/?id=0f88f2c1e5e108021ccddeee24f1216107115791'/>
<id>0f88f2c1e5e108021ccddeee24f1216107115791</id>
<content type='text'>
Pin and verify what goes into a release: JitPack confined to the
SPAKE2 module via exclusiveContent, the vendored subtree pulled by
commit SHA instead of a mutable tag, a pinned Docker base digest with
a checksummed cmdline-tools download, and a verifyScrcpyServer task
wired into every assets merge. The expected server checksum can be
overridden with -PscrcpyServerSha256 when the jar is built from
source.

build-apk now requires apksigner and fails unless independent
signature verification succeeds. Split the test image into unit and
e2e targets so JVM-only test runs do not download an emulator. Ship
THIRD_PARTY_NOTICES and the LGPL text for SPAKE2 in the APK. Add
scripts/check as the host quality gate.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Pin and verify what goes into a release: JitPack confined to the
SPAKE2 module via exclusiveContent, the vendored subtree pulled by
commit SHA instead of a mutable tag, a pinned Docker base digest with
a checksummed cmdline-tools download, and a verifyScrcpyServer task
wired into every assets merge. The expected server checksum can be
overridden with -PscrcpyServerSha256 when the jar is built from
source.

build-apk now requires apksigner and fails unless independent
signature verification succeeds. Split the test image into unit and
e2e targets so JVM-only test runs do not download an emulator. Ship
THIRD_PARTY_NOTICES and the LGPL text for SPAKE2 in the APK. Add
scripts/check as the host quality gate.
</pre>
</div>
</content>
</entry>
<entry>
<title>app: fix session lifecycle, teardown, and opus playback</title>
<updated>2026-07-01T00:00:00+00:00</updated>
<author>
<name>Lena</name>
<email>lena@omega</email>
</author>
<published>2026-07-01T00:00:00+00:00</published>
<link rel='alternate' type='text/html' href='http://git.0xlena.dev/android/scrcpy-android/commit/?id=ff7acf898b48359275a5b09b82ed926a945233f8'/>
<id>ff7acf898b48359275a5b09b82ed926a945233f8</id>
<content type='text'>
Opus playback never worked: feed() called dequeueInputBuffer() on a
codec in async-callback mode, which always throws, so every packet
was silently dropped. Feed input through the async callback with a
bounded pending queue instead.

Make bring-up transactional: roll back partially opened streams and
the server shell on failure, join reader threads on stop, and close
the owning ADB streams before releasing sinks. Replace the
openAbstract watchdog thread with a real timeout in the vendored
AdbConnection.open(), which also removes the half-open stream from
the lookup table on failure.

Harden the activity: release owned Surfaces, gate callbacks on a
destroyed flag and a session generation, serialize reconnect, and
handle target replacement via singleTask + onNewIntent. Propagate
device-list write failures instead of swallowing them, bound the
clipboard payload and the video pending queue against hostile
peers, and discard incomplete recordings instead of keeping corrupt
files.

Use the mediaPlayback foreground-service type; Android 15 stops
dataSync services after six hours. Drop the unused
ACCESS_NETWORK_STATE permission.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Opus playback never worked: feed() called dequeueInputBuffer() on a
codec in async-callback mode, which always throws, so every packet
was silently dropped. Feed input through the async callback with a
bounded pending queue instead.

Make bring-up transactional: roll back partially opened streams and
the server shell on failure, join reader threads on stop, and close
the owning ADB streams before releasing sinks. Replace the
openAbstract watchdog thread with a real timeout in the vendored
AdbConnection.open(), which also removes the half-open stream from
the lookup table on failure.

Harden the activity: release owned Surfaces, gate callbacks on a
destroyed flag and a session generation, serialize reconnect, and
handle target replacement via singleTask + onNewIntent. Propagate
device-list write failures instead of swallowing them, bound the
clipboard payload and the video pending queue against hostile
peers, and discard incomplete recordings instead of keeping corrupt
files.

Use the mediaPlayback foreground-service type; Android 15 stops
dataSync services after six hours. Drop the unused
ACCESS_NETWORK_STATE permission.
</pre>
</div>
</content>
</entry>
<entry>
<title>readme: document vendor/scrcpy and fastlane, fix build steps</title>
<updated>2026-07-01T00:00:00+00:00</updated>
<author>
<name>Lena</name>
<email>lena@omega</email>
</author>
<published>2026-07-01T00:00:00+00:00</published>
<link rel='alternate' type='text/html' href='http://git.0xlena.dev/android/scrcpy-android/commit/?id=bddc306de0cebde44f99b3a9c4ddba130946bef3'/>
<id>bddc306de0cebde44f99b3a9c4ddba130946bef3</id>
<content type='text'>
The layout section did not mention the scrcpy submodule (used by the
F-Droid build to compile scrcpy-server from source) or the fastlane
store metadata. The build steps told everyone to run fetch-vendor,
but the vendored tree is committed; the script is only for bumping
the pin, and running it mutates local history via git subtree.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The layout section did not mention the scrcpy submodule (used by the
F-Droid build to compile scrcpy-server from source) or the fastlane
store metadata. The build steps told everyone to run fetch-vendor,
but the vendored tree is committed; the script is only for bumping
the pin, and running it mutates local history via git subtree.
</pre>
</div>
</content>
</entry>
<entry>
<title>fastlane: add store icon</title>
<updated>2026-07-01T00:00:00+00:00</updated>
<author>
<name>Lena</name>
<email>lena@omega</email>
</author>
<published>2026-07-01T00:00:00+00:00</published>
<link rel='alternate' type='text/html' href='http://git.0xlena.dev/android/scrcpy-android/commit/?id=7619bfd37ed6aef3fbd3dbf8b93e926001a3f968'/>
<id>7619bfd37ed6aef3fbd3dbf8b93e926001a3f968</id>
<content type='text'>
The launcher icon is adaptive-XML-only (vector drawables, no raster
mipmaps), which fdroidserver cannot extract from the APK, so the
F-Droid listing would ship without an icon. Provide the 512x512 PNG
via fastlane metadata: rendered 1:1 from the adaptive-icon vector
drawables, cropped to the inner 72dp of the 108dp viewport.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The launcher icon is adaptive-XML-only (vector drawables, no raster
mipmaps), which fdroidserver cannot extract from the APK, so the
F-Droid listing would ship without an icon. Provide the 512x512 PNG
via fastlane metadata: rendered 1:1 from the adaptive-icon vector
drawables, cropped to the inner 72dp of the 108dp viewport.
</pre>
</div>
</content>
</entry>
<entry>
<title>test-rig: pre-install AGP's build-tools 34 pin</title>
<updated>2026-07-01T00:00:00+00:00</updated>
<author>
<name>Lena</name>
<email>lena@omega</email>
</author>
<published>2026-07-01T00:00:00+00:00</published>
<link rel='alternate' type='text/html' href='http://git.0xlena.dev/android/scrcpy-android/commit/?id=d4250691b403a8d5837bed431d86fe8dcb12c293'/>
<id>d4250691b403a8d5837bed431d86fe8dcb12c293</id>
<content type='text'>
AGP 8.7 downloads build-tools;34.0.0 into the SDK at build time when
it is missing, which made the first test run in a fresh image reach
for the network. Bake it into the image.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
AGP 8.7 downloads build-tools;34.0.0 into the SDK at build time when
it is missing, which made the first test run in a fresh image reach
for the network. Bake it into the image.
</pre>
</div>
</content>
</entry>
<entry>
<title>test: print --help from the header comment block</title>
<updated>2026-07-01T00:00:00+00:00</updated>
<author>
<name>Lena</name>
<email>lena@omega</email>
</author>
<published>2026-07-01T00:00:00+00:00</published>
<link rel='alternate' type='text/html' href='http://git.0xlena.dev/android/scrcpy-android/commit/?id=e4b9241441cc0d3204999da7077535452aa7d43c'/>
<id>e4b9241441cc0d3204999da7077535452aa7d43c</id>
<content type='text'>
The sed line range broke silently whenever the header grew or
shrank. Print from line 2 down to the first non-comment line
instead, so the usage text tracks the header.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The sed line range broke silently whenever the header grew or
shrank. Print from line 2 down to the first non-comment line
instead, so the usage text tracks the header.
</pre>
</div>
</content>
</entry>
<entry>
<title>test: pass /dev/kvm's gid to docker numerically</title>
<updated>2026-07-01T00:00:00+00:00</updated>
<author>
<name>Lena</name>
<email>lena@omega</email>
</author>
<published>2026-07-01T00:00:00+00:00</published>
<link rel='alternate' type='text/html' href='http://git.0xlena.dev/android/scrcpy-android/commit/?id=1cd6695315d52b4d5417fbb9fb8ad3b8c0063104'/>
<id>1cd6695315d52b4d5417fbb9fb8ad3b8c0063104</id>
<content type='text'>
Group names resolved on the host do not exist inside the container,
so the "kvm" fallback broke --group-add on hosts where getent found
no kvm group. stat the device instead; the numeric gid is all that
matters and /dev/kvm is already known to exist at this point.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Group names resolved on the host do not exist inside the container,
so the "kvm" fallback broke --group-add on hosts where getent found
no kvm group. stat the device instead; the numeric gid is all that
matters and /dev/kvm is already known to exist at this point.
</pre>
</div>
</content>
</entry>
<entry>
<title>test: derive the docker image tag from the rig inputs</title>
<updated>2026-07-01T00:00:00+00:00</updated>
<author>
<name>Lena</name>
<email>lena@omega</email>
</author>
<published>2026-07-01T00:00:00+00:00</published>
<link rel='alternate' type='text/html' href='http://git.0xlena.dev/android/scrcpy-android/commit/?id=e89c2290de133104420b02da3b7453a25484429d'/>
<id>e89c2290de133104420b02da3b7453a25484429d</id>
<content type='text'>
The tag suffix had to be bumped by hand whenever the Dockerfile or
sdk-packages.txt changed; forgetting meant silently testing against
a stale image. Hash the two files into the tag so any edit
invalidates the cache automatically.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The tag suffix had to be bumped by hand whenever the Dockerfile or
sdk-packages.txt changed; forgetting meant silently testing against
a stale image. Hash the two files into the tag so any edit
invalidates the cache automatically.
</pre>
</div>
</content>
</entry>
</feed>
