SDL: put binaries.zip to lib/<ARCH>/ so Play Store will (maybe, not tested) strip binaries for unsupported architectures

This commit is contained in:
Sergii Pylypenko
2019-02-25 21:26:54 +02:00
parent 9c3259a969
commit d9ce299843
4 changed files with 84 additions and 37 deletions

View File

@@ -147,7 +147,6 @@ cd project && env PATH=$NDKBUILDPATH BUILD_NUM_CPUS=$NCPU ndk-build -j$NCPU V=1
cd .. && ./copyAssets.sh && cd project && \
{ if $build_release ; then \
$quick_rebuild && { \
ln -s -f libs lib ; \
zip -u -r app/build/outputs/apk/release/app-release-unsigned.apk lib assets || exit 1 ; \
} || ./gradlew assembleRelease || exit 1 ; \
[ '!' -x jni/application/src/AndroidPostBuild.sh ] || {
@@ -155,13 +154,22 @@ cd project && env PATH=$NDKBUILDPATH BUILD_NUM_CPUS=$NCPU ndk-build -j$NCPU V=1
./AndroidPostBuild.sh `pwd`/../../../app/build/outputs/apk/release/app-release-unsigned.apk || exit 1 ; \
cd ../../.. ; \
} || exit 1 ; \
../copyAssets.sh pack-binaries app/build/outputs/apk/release/app-release-unsigned.apk ; \
rm -f app/build/outputs/apk/release/app-release.apk ; \
zipalign 4 app/build/outputs/apk/release/app-release-unsigned.apk app/build/outputs/apk/release/app-release.apk || exit 1 ; \
apksigner sign --ks ~/.android/debug.keystore --ks-key-alias androiddebugkey --ks-pass pass:android app/build/outputs/apk/release/app-release.apk || exit 1 ; \
else \
./gradlew assembleDebug && \
mv -f app/build/outputs/apk/debug/app-debug.apk app/build/outputs/apk/release/app-release.apk \
|| exit 1 ; \
./gradlew assembleDebug || exit 1 ; \
[ '!' -x jni/application/src/AndroidPostBuild.sh ] || {
cd jni/application/src ; \
./AndroidPostBuild.sh `pwd`/../../../app/build/outputs/apk/debug/app-debug.apk || exit 1 ; \
cd ../../.. ; \
} || exit 1 ; \
mkdir -p app/build/outputs/apk/release ; \
../copyAssets.sh pack-binaries app/build/outputs/apk/debug/app-debug.apk && \
zipalign 4 app/build/outputs/apk/debug/app-debug.apk app/build/outputs/apk/release/app-release.apk &&
apksigner sign --ks ~/.android/debug.keystore --ks-key-alias androiddebugkey --ks-pass pass:android app/build/outputs/apk/release/app-release.apk || \
mv -f app/build/outputs/apk/debug/app-debug.apk app/build/outputs/apk/release/app-release.apk || exit 1 ; \
fi ; } && \
{ if $sign_apk; then cd .. && ./sign.sh && cd project ; else true ; fi ; } && \
{ $install_apk && [ -n "`adb devices | tail -n +2`" ] && \

View File

@@ -1073,6 +1073,9 @@ fi
if [ -e project/jni/application/src/project.patch ]; then patch -p1 --dry-run -f -R < project/jni/application/src/project.patch > /dev/null 2>&1 || patch -p1 --no-backup-if-mismatch < project/jni/application/src/project.patch || exit 1 ; fi
rm -f project/lib
ln -s -f libs project/lib
echo Cleaning up dependencies
rm -rf project/libs/*/* project/gen

View File

@@ -1,16 +1,25 @@
#!/bin/sh
ARCHES="arm64-v8a armeabi-v7a x86 x86_64"
if [ "$1" = "pack-binaries" ]; then
echo "Copying binaries.zip to .apk file"
COPIED=1
for ARCH in $ARCHES; do
[ -e lib/$ARCH/binaries.zip ] && zip "$2" lib/$ARCH/binaries.zip && COPIED=0
done
exit $COPIED
fi
echo "Copying app data files from project/jni/application/src/AndroidData to project/assets"
mkdir -p project/assets
rm -f -r project/assets/*
if [ -d "project/jni/application/src/AndroidData" ] ; then
cp -L -r project/jni/application/src/AndroidData/* project/assets/
exit 0 # Do not split assets, this was needed only for Andorid 2.3 with it's stupid limitations
for F in project/assets/*; do
if [ `cat $F | wc -c` -gt 1000000 ] ; then
echo "The file $F is bigger than 1 megabyte - splitting it into smaller chunks"
split -b 1000000 -a 3 -d $F $F && rm $F || { echo "Error: 'split' command not installed" ; exit 1 ; }
fi
done
fi
for ARCH in $ARCHES; do
mv project/assets/binaries-$ARCH.zip project/libs/$ARCH/binaries.zip 2>/dev/null
done
exit 0

View File

@@ -97,6 +97,8 @@ import android.app.UiModeManager;
import android.Manifest;
import android.content.pm.PermissionInfo;
import java.util.Arrays;
import java.util.zip.ZipFile;
import java.util.ArrayList;
public class MainActivity extends Activity
@@ -1309,38 +1311,56 @@ public class MainActivity extends Activity
}
}
ZipFile myApk = null;
try
{
myApk = new ZipFile(getPackageResourcePath());
}
catch( IOException eeeeeeeee ) {}
String [] binaryZipNames = { "binaries-" + android.os.Build.CPU_ABI + ".zip", "binaries-" + android.os.Build.CPU_ABI2 + ".zip", "binaries.zip" };
if ( android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN )
binaryZipNames = new String[] { "binaries-" + android.os.Build.CPU_ABI + "-pie.zip", "binaries-" + android.os.Build.CPU_ABI2 + "-pie.zip", "binaries-" + android.os.Build.CPU_ABI + ".zip", "binaries-" + android.os.Build.CPU_ABI2 + ".zip", "binaries.zip" };
for(String binaryZip: binaryZipNames)
if ( android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP )
{
ArrayList<String> a = new ArrayList<String>();
for( String arch: android.os.Build.SUPPORTED_ABIS )
{
a.add("binaries-" + arch + ".zip");
}
a.add("binaries.zip");
binaryZipNames = a.toArray(new String[0]);
}
for( String binaryZip: binaryZipNames )
{
try {
Log.i("SDL", "libSDL: Trying to extract binaries from assets " + binaryZip);
InputStream in = null;
try
{
for( int i = 0; ; i++ )
{
InputStream in2 = getAssets().open(binaryZip + String.format("%02d", i));
if( in == null )
in = in2;
else
in = new SequenceInputStream( in, in2 );
}
//Log.i("SDL", "libSDL: Trying to extract binaries from assets/" + binaryZip);
if( in == null )
in = getAssets().open(binaryZip);
Log.i("SDL", "libSDL: Found binaries at assets/" + binaryZip);
}
catch( IOException ee )
catch( Exception eee ) {}
if( binaryZip.equals("binaries.zip") )
{
try
for( String arch: android.os.Build.SUPPORTED_ABIS )
{
if( in == null )
in = getAssets().open(binaryZip);
try
{
if( in == null && myApk != null )
{
//Log.i("SDL", "libSDL: Trying to extract binaries from lib/" + arch + "/" + binaryZip);
in = myApk.getInputStream(myApk.getEntry("lib/" + arch + "/" + binaryZip));
Log.i("SDL", "libSDL: Found binaries at lib/" + arch + "/" + binaryZip);
}
}
catch( Exception eeee ) {}
}
catch( IOException eee ) {}
}
if( in == null )
throw new RuntimeException("libSDL: Extracting binaries failed, the .apk file packaged incorrectly");
throw new RuntimeException("libSDL: Extracting binaries failed");
ZipInputStream zip = new ZipInputStream(in);
@@ -1354,10 +1374,8 @@ public class MainActivity extends Activity
{
ZipEntry entry = null;
entry = zip.getNextEntry();
/*
if( entry != null )
Log.i("SDL", "Extracting lib " + entry.getName());
*/
//if( entry != null )
// Log.i("SDL", "Extracting binary " + entry.getName());
if( entry == null )
{
Log.i("SDL", "Extracting binaries finished");
@@ -1373,13 +1391,16 @@ public class MainActivity extends Activity
OutputStream out = null;
String path = libDir.getAbsolutePath() + "/" + entry.getName();
try {
try
{
File outDir = new File( path.substring(0, path.lastIndexOf("/") ));
if( !(outDir.exists() && outDir.isDirectory()) )
outDir.mkdirs();
} catch( SecurityException eeeeeee ) { };
}
catch( SecurityException eeeeeee ) { };
try {
try
{
CheckedInputStream check = new CheckedInputStream( new FileInputStream(path), new CRC32() );
while( check.read(buf, 0, buf.length) > 0 ) {};
check.close();
@@ -1417,6 +1438,12 @@ public class MainActivity extends Activity
//Log.i("SDL", "libSDL: Error: " + eee.toString());
}
}
try
{
if (myApk != null)
myApk.close();
}
catch( IOException eeeeeeeeee ) {}
};
public static String GetMappedLibraryName(final String s)