diff options
-rw-r--r-- | Makefile.in | 8 | ||||
-rw-r--r-- | tools/android/packaging/Makefile.in | 116 | ||||
-rwxr-xr-x | tools/android/packaging/apksign | 10 | ||||
-rw-r--r-- | tools/android/packaging/xbmc/AndroidManifest.xml.in | 2 | ||||
-rw-r--r-- | tools/android/packaging/xbmc/src/org/xbmc/kodi/Splash.java.in | 52 |
5 files changed, 139 insertions, 49 deletions
diff --git a/Makefile.in b/Makefile.in index 658745a8d1..8cb677c36b 100644 --- a/Makefile.in +++ b/Makefile.in @@ -554,11 +554,11 @@ ifeq ($(findstring osx,@ARCH@), osx) else install: install-binaries install-arch install-datas -apk: apk-clean install - make -C tools/android/packaging +apk obb apk-unsigned apk-obb apk-obb-unsigned apk-noobb: install + make -C tools/android/packaging $@ -apk-clean: - make -C tools/android/packaging clean +apk-clean apk-sign: + make -C tools/android/packaging $@ install-binaries: install-scripts @echo "Copying @APP_NAME_LC@ binary to $(DESTDIR)$(libdir)/@APP_NAME_LC@/" diff --git a/tools/android/packaging/Makefile.in b/tools/android/packaging/Makefile.in index c2b11244b1..e4dcc1bc65 100644 --- a/tools/android/packaging/Makefile.in +++ b/tools/android/packaging/Makefile.in @@ -13,6 +13,16 @@ EXCLUDED_ADDONS = screensaver.rsxs.euphoria visualization.dxspectrum visualizati XBMCROOT = $(shell cd $(CURDIR)/../../..; pwd) COPYDIRS = system addons language media GCC_VERSION=$(shell $(CC) -dumpversion) +ZIP=zip + +SIGN_STORE=~/.android/debug.keystore +SIGN_STOREPASS=android +SIGN_KEY=androiddebugkey +SIGN_KEYPASS= + +ifneq ($(strip $(SIGN_KEYPASS)),) +SIGN_KEYPASS_OPT=-keypass $(SIGN_KEYPASS) +endif X86OVERRIDES=XBMC_OVERRIDE_HOST=i686-android-linux XBMC_OVERRIDE_TOOLCHAIN=$(XBMC_X86_TOOLCHAIN) ARMOVERRIDES=XBMC_OVERRIDE_HOST=arm-linux-androideabi XBMC_OVERRIDE_TOOLCHAIN=$(XBMC_ARM_TOOLCHAIN) @@ -26,6 +36,7 @@ CPU=x86 endif ifeq ($(findstring arm,$(CPU)),arm) ARCH=arm +CPU=armeabi-v7a endif #older ndk x86 @@ -41,57 +52,66 @@ ifneq ($(shell test -f $(GDBPATH) && echo 1),1) GDBPATH=$(NDKROOT)/prebuilt/android-$(ARCH)/gdbserver/gdbserver endif -all: package SRCLIBS = $(addprefix $(PREFIX)/lib/,$(OBJS)) $(addprefix $(PREFIX)/lib/$(SDK_PLATFORM)/,$(PLATFORM_OBJS)) DSTLIBS = $(CPU)/lib/lib@APP_NAME_LC@.so $(addprefix $(CPU)/lib/,$(OBJS)) $(addprefix $(CPU)/lib/,$(PLATFORM_OBJS)) libs= $(DSTLIBS) -multi: x86 arm - @cp images/@APP_NAME_LC@app-debug-skeleton.apk images/@APP_NAME_LC@app-debug-multi-unaligned.apk - @cd xbmc; zip -r -q ../images/@APP_NAME_LC@app-debug-multi-unaligned.apk lib/ assets - @jarsigner -sigalg MD5withRSA -digestalg SHA1 -keystore ~/.android/debug.keystore -storepass android images/@APP_NAME_LC@app-debug-multi-unaligned.apk androiddebugkey - @$(ZIPALIGN) -f 4 images/@APP_NAME_LC@app-debug-multi-unaligned.apk $(XBMCROOT)/@APP_NAME_LC@app-multi-debug.apk - @rm images/@APP_NAME_LC@app-debug-multi-unaligned.apk - @echo "$(XBMCROOT)/@APP_NAME_LC@app-multi-debug.apk created" +all: apk -package: extras - @cp images/@APP_NAME_LC@app-debug-skeleton.apk images/@APP_NAME_LC@app-debug-$(CPU)-unaligned.apk - @javac -classpath $(SDKROOT)/platforms/$(SDK_PLATFORM)/android.jar:xbmc/obj -d xbmc/obj -sourcepath xbmc/src xbmc/src/*.java - @javac -classpath $(SDKROOT)/platforms/$(SDK_PLATFORM)/android.jar:xbmc/obj -d xbmc/obj -sourcepath xbmc/src xbmc/src/org/xbmc/kodi/*.java - @$(DX) --dex --output=xbmc/classes.dex xbmc/obj - @cd xbmc; zip -r -q ../images/@APP_NAME_LC@app-debug-$(CPU)-unaligned.apk lib/$(CPU) assets classes.dex - @jarsigner -sigalg MD5withRSA -digestalg SHA1 -keystore ~/.android/debug.keystore -storepass android images/@APP_NAME_LC@app-debug-$(CPU)-unaligned.apk androiddebugkey - @$(ZIPALIGN) -f 4 images/@APP_NAME_LC@app-debug-$(CPU)-unaligned.apk $(XBMCROOT)/@APP_NAME_LC@app-$(CPU)-debug.apk - @rm images/@APP_NAME_LC@app-debug-$(CPU)-unaligned.apk - @echo "$(XBMCROOT)/@APP_NAME_LC@app-$(CPU)-debug.apk created" +apk: apk-clean sharedapk package apk-sign -extras: libs - rm -rf xbmc/assets - mkdir -p xbmc/assets xbmc/res xbmc/res/raw xbmc/assets/python2.6/lib/ - cp -rfp $(PREFIX)/share/@APP_NAME_LC@/* ./xbmc/assets - find `pwd`/xbmc/assets/ -depth -name ".git" -exec rm -rf {} \; - find `pwd`/xbmc/assets/system/ -name "*.so" -exec rm {} \; - find `pwd`/xbmc/assets/addons/skin.*/media/* -depth -not -iname "Textures.xbt" -exec rm -rf {} \; - find `pwd`/xbmc/assets/system/keymaps/ -depth -name "joystick*.xml" -exec rm {} \; - mv -f `pwd`/xbmc/assets/system/keymaps/joystick.xml.sample `pwd`/xbmc/assets/system/keymaps/joystick.xml - @echo "native_arch=$(ARCH)" > xbmc/res/raw/xbmc.properties - cd xbmc/assets/addons; rm -rf $(EXCLUDED_ADDONS) +obb: apk-clean sharedobb + +apk-unsigned: apk-clean sharedapk package + +apk-obb: apk-clean sharedobb package apk-sign + +apk-obb-unsigned: apk-clean sharedobb package + +apk-noobb: apk-clean package apk-sign + +xbmc/assets: + mkdir -p xbmc/assets + +shared: + mkdir -p assets + cp -rfp $(PREFIX)/share/@APP_NAME_LC@/* ./assets + find `pwd`/assets/ -depth -name ".git" -exec rm -rf {} \; + find `pwd`/assets/system/ -name "*.so" -exec rm {} \; + find `pwd`/assets/addons/skin.*/media/* -depth -not -iname "Textures.xbt" -exec rm -rf {} \; + find `pwd`/assets/system/keymaps/ -depth -name "joystick*.xml" ! -name "joystick.xml" -exec rm {} \; + cd assets; rm -rf $(EXCLUDED_ADDONS) + +sharedapk: shared | xbmc/assets + cp -rfp assets/* ./xbmc/assets + +sharedobb: shared + rm -f $(XBMCROOT)/main.@APP_NAME_LC@.obb + $(ZIP) -9 -q -r $(XBMCROOT)/main.@APP_NAME_LC@.obb assets + @echo "$(XBMCROOT)/main.@APP_NAME_LC@.obb created" + +python: | xbmc/assets + mkdir -p xbmc/assets/python2.6/lib/ cp -rfp $(PREFIX)/lib/python2.6 xbmc/assets/python2.6/lib/ + cd xbmc/assets/python2.6/lib/python2.6/; rm -rf test config lib-dynload + +res: + mkdir -p xbmc/res xbmc/res/raw xbmc/res/values images + @echo "native_arch=$(ARCH)" > xbmc/res/raw/xbmc.properties cp -fp $(XBMCROOT)/media/Splash.png xbmc/res/drawable/splash.png cp -fp media/drawable-hdpi/ic_launcher.png xbmc/res/drawable-hdpi/ic_launcher.png cp -fp media/drawable-ldpi/ic_launcher.png xbmc/res/drawable-ldpi/ic_launcher.png cp -fp media/drawable-mdpi/ic_launcher.png xbmc/res/drawable-mdpi/ic_launcher.png cp -fp media/drawable-xhdpi/ic_launcher.png xbmc/res/drawable-xhdpi/ic_launcher.png cp -fp media/drawable-xxhdpi/ic_launcher.png xbmc/res/drawable-xxhdpi/ic_launcher.png - cd xbmc/assets/python2.6/lib/python2.6/; rm -rf test config lib-dynload - mkdir xbmc/res/values && mv xbmc/strings.xml xbmc/res/values/ + cp xbmc/strings.xml xbmc/res/values/ mkdir -p tmp/res; $(AAPT) c -S xbmc/res -C tmp/res; cp -r -n xbmc/res tmp/ || true $(AAPT) p -f -I $(SDKROOT)/platforms/$(SDK_PLATFORM)/android.jar -S tmp/res/ -M xbmc/AndroidManifest.xml -F images/@APP_NAME_LC@app-debug-skeleton.apk -J xbmc/src @rm -rf tmp/ libs: $(PREFIX)/lib/@APP_NAME_LC@/lib@APP_NAME_LC@.so rm -rf xbmc/lib/$(CPU) xbmc/libs/$(CPU) xbmc/obj/local/$(CPU) - mkdir -p xbmc/lib/$(CPU) images xbmc/assets/python2.6/lib/ xbmc/libs/$(CPU) xbmc/obj/local/$(CPU) + mkdir -p xbmc/lib/$(CPU) xbmc/assets/python2.6/lib/ xbmc/libs/$(CPU) xbmc/obj/local/$(CPU) cp -fp $(SRCLIBS) xbmc/obj/local/$(CPU)/ cp -fp $(PREFIX)/lib/@APP_NAME_LC@/lib@APP_NAME_LC@.so xbmc/obj/local/$(CPU)/ find $(PREFIX)/lib/@APP_NAME_LC@/addons -name "*.so" -exec cp -fp {} xbmc/obj/local/$(CPU)/ \; @@ -105,20 +125,30 @@ libs: $(PREFIX)/lib/@APP_NAME_LC@/lib@APP_NAME_LC@.so "$(NDKROOT)/sources/cxx-stl/gnu-libstdc++/$(GCC_VERSION)/include $(XBMCROOT) $(PREFIX)/include jni" >> ./xbmc/libs/$(CPU)/gdb.setup cp -fp xbmc/libs/$(CPU)/* xbmc/lib/$(CPU) -$(PREFIX)/lib/xbmc/lib@APP_NAME_LC@.so: $(SRCLIBS) - $(MAKE) -C ../../depends/target/xbmc +xbmc/classes.dex: res + mkdir -p xbmc/obj + @javac -classpath $(SDKROOT)/platforms/$(SDK_PLATFORM)/android.jar:xbmc/obj -d xbmc/obj -sourcepath xbmc/src xbmc/src/*.java + @javac -classpath $(SDKROOT)/platforms/$(SDK_PLATFORM)/android.jar:xbmc/obj -d xbmc/obj -sourcepath xbmc/src xbmc/src/org/xbmc/@APP_NAME_LC@/*.java + @$(DX) --dex --output=xbmc/classes.dex xbmc/obj -$(SRCLIBS): +package: libs python xbmc/classes.dex + @echo "Creating package..." + @cp images/@APP_NAME_LC@app-debug-skeleton.apk images/@APP_NAME_LC@app-debug-$(CPU)-unaligned.apk + @cd xbmc; $(ZIP) -r -q ../images/@APP_NAME_LC@app-debug-$(CPU)-unaligned.apk lib/$(CPU) assets classes.dex -arm: armeabi-v7a +apk-sign: + @echo "Signing..." + @jarsigner -sigalg MD5withRSA -digestalg SHA1 -keystore $(SIGN_STORE) -storepass $(SIGN_STOREPASS) $(SIGN_KEYPASS_OPT) images/@APP_NAME_LC@app-debug-$(CPU)-unaligned.apk $(SIGN_KEY) + @$(ZIPALIGN) -f 4 images/@APP_NAME_LC@app-debug-$(CPU)-unaligned.apk $(XBMCROOT)/@APP_NAME_LC@app-$(CPU)-debug.apk + @rm images/@APP_NAME_LC@app-debug-$(CPU)-unaligned.apk + @echo "$(XBMCROOT)/@APP_NAME_LC@app-$(CPU)-debug.apk created" -armeabi-v7a: $(XBMC_ARM_TOOLCHAIN) force - XBMC_OVERRIDE_PLATFORM=$@ $(ARMOVERRIDES) $(MAKE) package +$(PREFIX)/lib/xbmc/libxbmc.so: $(SRCLIBS) + $(MAKE) -C ../../depends/target/xbmc -x86: $(XBMC_X86_TOOLCHAIN) force - XBMC_OVERRIDE_PLATFORM=$@ $(X86OVERRIDES) $(MAKE) package +$(SRCLIBS): -clean: +apk-clean: rm -rf images rm -rf xbmc/lib rm -rf xbmc/libs @@ -130,5 +160,7 @@ clean: rm -f xbmc/res/drawable/splash.png rm -f xbmc/src/R.java rm -f xbmc/classes.dex + rm -rf assets + +.PHONY: force libs assets python sharedapk sharedobb res package -.PHONY: arm armeabi-v7a x86 force extras libs diff --git a/tools/android/packaging/apksign b/tools/android/packaging/apksign new file mode 100755 index 0000000000..0a2289b6c7 --- /dev/null +++ b/tools/android/packaging/apksign @@ -0,0 +1,10 @@ +#!/bin/bash +usage(){ + echo "Usage: $0 <keystore_filename> <keystore_password> <key_name> [<key_password>]" + exit 1 +} + +[[ $# -lt 3 ]] && usage + +make apk-sign SIGN_STORE=$1 SIGN_STOREPASS=$2 SIGN_KEY=$3 SIGN_KEYPASS=$4 + diff --git a/tools/android/packaging/xbmc/AndroidManifest.xml.in b/tools/android/packaging/xbmc/AndroidManifest.xml.in index 7624a0b49b..f3da501237 100644 --- a/tools/android/packaging/xbmc/AndroidManifest.xml.in +++ b/tools/android/packaging/xbmc/AndroidManifest.xml.in @@ -15,7 +15,7 @@ <uses-feature android:name="android.hardware.touchscreen" android:required="false" /> - <application android:icon="@drawable/ic_launcher" android:debuggable="true" android:label="@string/app_name" android:hasCode="true"> + <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:hasCode="true"> <activity android:name=".Splash" android:configChanges="orientation|keyboard|keyboardHidden|navigation|touchscreen" diff --git a/tools/android/packaging/xbmc/src/org/xbmc/kodi/Splash.java.in b/tools/android/packaging/xbmc/src/org/xbmc/kodi/Splash.java.in index 0cad1b81c3..b5f46fcdda 100644 --- a/tools/android/packaging/xbmc/src/org/xbmc/kodi/Splash.java.in +++ b/tools/android/packaging/xbmc/src/org/xbmc/kodi/Splash.java.in @@ -14,6 +14,8 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; +import java.util.Arrays; +import java.util.Comparator; import java.util.Properties; import java.util.Enumeration; import java.util.ArrayList; @@ -357,9 +359,55 @@ public class Splash extends Activity { sXbmcHome = fCacheDir.getAbsolutePath() + "/apk"; } - sPackagePath = getPackageResourcePath(); - fPackagePath = new File(sPackagePath); fXbmcHome = new File(sXbmcHome); + + try + { + sPackagePath = Environment.getExternalStorageDirectory() + + "/Android/obb/" + getPackageName() + "/main." + + getPackageManager().getPackageInfo(getPackageName(), 0).versionCode + + "." + getPackageName() + ".obb"; + } catch (Exception e) + { + } + + fPackagePath = new File(sPackagePath); + if (!fPackagePath.exists()) + { + // Check for latest obb + String obbdir = Environment.getExternalStorageDirectory() + + "/Android/obb/" + getPackageName(); + File[] obbfiles = new File(obbdir).listFiles(); + if (obbfiles != null && obbfiles.length > 0) + { + Arrays.sort(obbfiles, new Comparator<File>() + { + public int compare(File f1, File f2) + { + // Sort by lastmodified descending + return Long.valueOf(f2.lastModified()).compareTo(f1.lastModified()); + } + }); + fPackagePath = obbfiles[0]; + } + } + + if (fPackagePath.exists()) + { + sPackagePath = fPackagePath.getAbsolutePath(); + Log.i(TAG, "Using OBB: " + sPackagePath); + } else + { + sPackagePath = getPackageResourcePath(); + fPackagePath = new File(sPackagePath); + if (fPackagePath.length() < 50 * 1024 * 1024) + { + // No OBB and apk < 50Mb? Nah... + mErrorMsg = "OBB not yet present. Please retry later..."; + Log.e(TAG, mErrorMsg); + mState = InError; + } + } } private void MigrateUserData() { |