diff options
author | cyberta <cyberta@riseup.net> | 2019-12-11 16:57:26 -0800 |
---|---|---|
committer | cyberta <cyberta@riseup.net> | 2019-12-11 16:57:26 -0800 |
commit | d0d3f1b9d082308626c6a34d5b8d530de654ead4 (patch) | |
tree | a0af2806574961d1650c6c099db06f354eec5f68 /app | |
parent | 307d4398ca4bb341f44bc331abcdacb1fba46eb5 (diff) | |
parent | 938f54ffd546fb8372e65edfd5a4de0c6ca9a569 (diff) |
Merge branch 'reduce_apk_size2' into 'master'
Reduce apk size
See merge request leap/bitmask_android!95
Diffstat (limited to 'app')
22 files changed, 189 insertions, 22 deletions
diff --git a/app/build.gradle b/app/build.gradle index 7e4a6e03..0726cca8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -56,10 +56,11 @@ android { } } - flavorDimensions "branding", "implementation" + flavorDimensions "branding", "implementation", "abi" productFlavors { productFlavors.all { - ext.appName = null; + ext.appName = null + ext.splitApk = false } production { dimension "implementation" @@ -67,12 +68,13 @@ android { insecure { dimension "implementation" } + normal { dimension "branding" appName = "Bitmask" + splitApk = true } - custom { dimension "branding" @@ -106,10 +108,69 @@ android { //The duration in days to trigger the donation reminder buildConfigField 'int', 'donation_reminder_duration', '30' + // Build apks for each architecture, in addition to one 'fat' apk containing libraries for all all architectures + // enable this if you're publishing in gplay + ext { + splitApk = false + } + //************************************************************************** //************************************************************************** } + + + fat { + dimension "abi" + ext { + abiVersionCode = 0 + abiFilter = "" + } + } + + x86 { + dimension "abi" + ndk { + abiFilters "x86" + } + ext { + abiVersionCode = 1 + abiFilter = "x86" + } + } + + armv7 { + dimension "abi" + ndk { + abiFilters "armeabi-v7a" + } + ext { + abiVersionCode = 2 + abiFilter = "armeabi-v7a" + } + } + + x86_64 { + dimension "abi" + ndk { + abiFilters "x86_64" + } + ext { + abiVersionCode = 3 + abiFilter = "x86_64" + } + } + + arm64 { + dimension "abi" + ndk { + abiFilters "arm64-v8a" + } + ext { + abiVersionCode = 4 + abiFilter = "arm64-v8a" + } + } } buildTypes { @@ -120,6 +181,8 @@ android { //runProguard true if(signingConfigs.contains(release)) signingConfig signingConfigs.release.isSigningReady() ? signingConfigs.release : signingConfigs.debug + //minifyEnabled = true + //shrinkResources true } beta { initWith release @@ -159,8 +222,61 @@ android { java.srcDirs += ['src/sharedTest/java'] } } + + /** + * BUILD VARAIANTS: + * ================= + * Development builds: + * -------------------- + * customProductionFatDebug -> branded development build, includes all ABIs + * normalProductionFatDebug -> Bitmask development build, includes all ABIS + * customInsecureFatDebug -> branded development build, doesn't checks certificates (for test server setup w/o valid certificates), includes all ABIs + * normalInsecureFatDebug -> Bitmask development build, doesn't checks certificates (for test server setup w/o valid certificates), includes all ABIs + * + * Branded Releases: + * ----------------- + * customProductionFatBeta -> branded build, includes all ABI's, Beta release + * customProductionFatRelease -> branded build, includes all ABI's, stable release (-> F-Droid, GPlay if not splitApk is set to true) + * + * Bitmask Beta releases: + * ---------------------- + * normalProductionArm64Beta -> Bitmask build, only for ABI arm64, for GPlay Beta channel with split apks (1 of 4) + * normalProductionArmv7Beta -> Bitmask build, only for ABI armeabi-v7a, for GPlay Beta channel with split apks (2 of 4) + * normalProductionX86Beta -> Bitmask build, only for ABI x86, for GPlay Beta channel with split apks (3 of 4) + * normalProductionX86_64Beta -> Bitmask build, only for ABI x86 64 bit, for GPlay Beta channel with split apks (4 of 4) + * normalProductionFatBeta -> Bitmask build, including all ABIS, for izzysoft's F-Droid repo and beta link on download page + * + * Bitmask Stable releases: + * ------------------------ + * normalProductionArm64Release -> Bitmask build, only for ABI arm64, for GPlay releases with split apks (1 of 4) + * normalProductionArmv7Release -> Bitmask build, only for ABI armeabi-v7a, for GPlay releases with split apks (2 of 4) + * normalProductionX86Release -> Bitmask build, only for ABI x86, for GPlay releases with split apks (3 of 4) + * normalProductionX86_64Release -> Bitmask build, only for ABI x86 64 bit, for GPlay releases with split apks (4 of 4) + * normalProductionFatRelease -> Bitmask build, including all ABIS, for official F-Droid repo and stable link on download page + */ + + variantFilter { variant -> + + def names = variant.flavors*.name + def buildTypeName = variant.buildType.name + // flavorDimensions "branding" -> 0, "implementation" -> 1, "abi" -> 2 + def supportsSplitApk = variant.flavors[0].splitApk + // To check for a certain build type, use variant.buildType.name == "<buildType>" + if (((names.contains("insecure") && !names.contains("fat")) || + (names.contains("insecure") && buildTypeName.contains("beta")) || + (names.contains("insecure") && buildTypeName.contains("release")) || + (buildTypeName.contains("debug") && !names.contains("fat")) || + (!supportsSplitApk && !names.contains("fat"))) + ) { + // Gradle ignores any variants that satisfy the conditions above. + setIgnore(true) + } + } } + + + dependencies { testImplementation 'junit:junit:4.12' //outdated mockito-core version due to powermock dependency @@ -205,11 +321,48 @@ dependencies { } android.applicationVariants.all { variant -> + // configure app name and apk file name for different build variants def flavors = variant.productFlavors - // flavorDimensions "branding" -> 0, "implementation" -> 1 + // flavorDimensions "branding" -> 0, "implementation" -> 1, "abi" -> 2 def branding = flavors[0] + def trimmedAppName = branding.appName.replaceAll(' ', '') + def abiDimension = flavors[2] + def abiFilter = abiDimension.abiFilter + if (abiFilter.length() > 0) { + abiFilter = "_"+abiFilter + } def buildType = variant.buildType + def tag = getTag() + if (tag.length() > 0) { + tag = "_"+tag + } + variant.resValue "string", "app_name", "\"${branding.appName}${buildType.appSuffix}\"" + + variant.outputs.all { output -> + output.outputFileName = "${trimmedAppName}${abiFilter}_${buildType.name}${tag}.apk" + } + + // reconfigure version codes for split builds + variant.outputs.each { output -> + // if not a fat build + if (abiDimension.abiVersionCode > 0) { + output.versionCodeOverride = android.defaultConfig.versionCode * 1000 + abiDimension.abiVersionCode + } + } + + // remove unrelated abi specific assets + variant.mergeAssets.doLast { + // if not a fat build + if (abiDimension.abiVersionCode > 0) { + def filesToDelete = fileTree(dir: variant.mergeAssets.outputDir, excludes: ["*pie_openvpn.${abiDimension.abiFilter}", + 'urls/', + '*.url', + '*.json', + '*.pem']) + delete(filesToDelete) + } + } } @@ -334,7 +487,7 @@ def removeDuplicatedStrings() { def replaceDuplicatesForSource(File it, String type) { def ics_openvpn_file = file(it.absolutePath.replace(type+'.xml', type+'-icsopenvpn.xml')) if(ics_openvpn_file.exists()) { - def ics_openvpn_strings_names = (new XmlParser()).parse(ics_openvpn_file) + def ics_openvpn_strings_names = new XmlParser().parse(ics_openvpn_file) def current_file = it ics_openvpn_strings_names.string.each { @@ -381,11 +534,11 @@ task mergeUntranslatable(dependsOn: 'copyIcsOpenVPNFiles', type: Copy ) { task copyIcsOpenVPNFiles(dependsOn: 'updateIcsOpenVpn') { println "copyIcsOpenVPNFiles" -/* copyIcsOpenVPNClasses + copyIcsOpenVPNClasses copyIcsOpenVPNXml copyIcsOpenVPNImages //mergeUntranslatable.execute() - removeDuplicatedStrings()*/ + removeDuplicatedStrings() } task updateIcsOpenVpn( type: Exec ) { @@ -394,6 +547,11 @@ task updateIcsOpenVpn( type: Exec ) { } +def getTag() { + String commit = "git log --pretty=format:'%h' -n 1".execute().text.trim().replaceAll("'", "") + return ("git describe --tags --exact-match "+ commit).execute().text.trim() +} + task cleanNative( type: Delete ) { def shouldClean = getCurrentFlavorForBetaOrRelease() == "production" @@ -431,4 +589,4 @@ def getCurrentFlavorForBetaOrRelease() { { return ""; } -}
\ No newline at end of file +} diff --git a/app/src/custom/res/drawable-land/background_main.png b/app/src/custom/res/drawable-land/background_main.png Binary files differdeleted file mode 100644 index ce11f5b4..00000000 --- a/app/src/custom/res/drawable-land/background_main.png +++ /dev/null diff --git a/app/src/custom/res/drawable-land/background_main.webp b/app/src/custom/res/drawable-land/background_main.webp Binary files differnew file mode 100644 index 00000000..c28c2183 --- /dev/null +++ b/app/src/custom/res/drawable-land/background_main.webp diff --git a/app/src/custom/res/drawable-land/ic_splash_background.png b/app/src/custom/res/drawable-land/ic_splash_background.png Binary files differdeleted file mode 100644 index 09103e4b..00000000 --- a/app/src/custom/res/drawable-land/ic_splash_background.png +++ /dev/null diff --git a/app/src/custom/res/drawable-land/ic_splash_background.webp b/app/src/custom/res/drawable-land/ic_splash_background.webp Binary files differnew file mode 100644 index 00000000..f939c114 --- /dev/null +++ b/app/src/custom/res/drawable-land/ic_splash_background.webp diff --git a/app/src/custom/res/drawable-sw600dp-port/background_main.png b/app/src/custom/res/drawable-sw600dp-port/background_main.png Binary files differdeleted file mode 100644 index 23c7ffa6..00000000 --- a/app/src/custom/res/drawable-sw600dp-port/background_main.png +++ /dev/null diff --git a/app/src/custom/res/drawable-sw600dp-port/background_main.webp b/app/src/custom/res/drawable-sw600dp-port/background_main.webp Binary files differnew file mode 100644 index 00000000..6d23e9e1 --- /dev/null +++ b/app/src/custom/res/drawable-sw600dp-port/background_main.webp diff --git a/app/src/custom/res/drawable-sw600dp-port/ic_splash_background.png b/app/src/custom/res/drawable-sw600dp-port/ic_splash_background.png Binary files differdeleted file mode 100644 index c5abd96a..00000000 --- a/app/src/custom/res/drawable-sw600dp-port/ic_splash_background.png +++ /dev/null diff --git a/app/src/custom/res/drawable-sw600dp-port/ic_splash_background.webp b/app/src/custom/res/drawable-sw600dp-port/ic_splash_background.webp Binary files differnew file mode 100644 index 00000000..227fcb24 --- /dev/null +++ b/app/src/custom/res/drawable-sw600dp-port/ic_splash_background.webp diff --git a/app/src/custom/res/drawable-sw600dp/background_main.png b/app/src/custom/res/drawable-sw600dp/background_main.png Binary files differdeleted file mode 100644 index d11acde1..00000000 --- a/app/src/custom/res/drawable-sw600dp/background_main.png +++ /dev/null diff --git a/app/src/custom/res/drawable-sw600dp/background_main.webp b/app/src/custom/res/drawable-sw600dp/background_main.webp Binary files differnew file mode 100644 index 00000000..aa6b452b --- /dev/null +++ b/app/src/custom/res/drawable-sw600dp/background_main.webp diff --git a/app/src/custom/res/drawable-sw600dp/ic_splash_background.png b/app/src/custom/res/drawable-sw600dp/ic_splash_background.png Binary files differdeleted file mode 100644 index b3fb1f9c..00000000 --- a/app/src/custom/res/drawable-sw600dp/ic_splash_background.png +++ /dev/null diff --git a/app/src/custom/res/drawable-sw600dp/ic_splash_background.webp b/app/src/custom/res/drawable-sw600dp/ic_splash_background.webp Binary files differnew file mode 100644 index 00000000..f1a035ec --- /dev/null +++ b/app/src/custom/res/drawable-sw600dp/ic_splash_background.webp diff --git a/app/src/custom/res/drawable/background_drawer.png b/app/src/custom/res/drawable/background_drawer.png Binary files differdeleted file mode 100644 index ed138c42..00000000 --- a/app/src/custom/res/drawable/background_drawer.png +++ /dev/null diff --git a/app/src/custom/res/drawable/background_drawer.webp b/app/src/custom/res/drawable/background_drawer.webp Binary files differnew file mode 100644 index 00000000..8e0c4a6f --- /dev/null +++ b/app/src/custom/res/drawable/background_drawer.webp diff --git a/app/src/custom/res/drawable/background_main.png b/app/src/custom/res/drawable/background_main.png Binary files differdeleted file mode 100644 index 23c7ffa6..00000000 --- a/app/src/custom/res/drawable/background_main.png +++ /dev/null diff --git a/app/src/custom/res/drawable/background_main.webp b/app/src/custom/res/drawable/background_main.webp Binary files differnew file mode 100644 index 00000000..6d23e9e1 --- /dev/null +++ b/app/src/custom/res/drawable/background_main.webp diff --git a/app/src/custom/res/drawable/ic_splash_background.png b/app/src/custom/res/drawable/ic_splash_background.png Binary files differdeleted file mode 100644 index c5abd96a..00000000 --- a/app/src/custom/res/drawable/ic_splash_background.png +++ /dev/null diff --git a/app/src/custom/res/drawable/ic_splash_background.webp b/app/src/custom/res/drawable/ic_splash_background.webp Binary files differnew file mode 100644 index 00000000..227fcb24 --- /dev/null +++ b/app/src/custom/res/drawable/ic_splash_background.webp diff --git a/app/src/custom/res/drawable/logo_square.png b/app/src/custom/res/drawable/logo_square.png Binary files differdeleted file mode 100644 index d20cedd5..00000000 --- a/app/src/custom/res/drawable/logo_square.png +++ /dev/null diff --git a/app/src/custom/res/drawable/logo_square.webp b/app/src/custom/res/drawable/logo_square.webp Binary files differnew file mode 100644 index 00000000..cd3ad9d0 --- /dev/null +++ b/app/src/custom/res/drawable/logo_square.webp diff --git a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java index 0485e907..a6f8040f 100644 --- a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java +++ b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java @@ -324,13 +324,17 @@ public class EipFragment extends Fragment implements Observer { return; } - AlertDialog.Builder alertBuilder = new AlertDialog.Builder(getActivity()); - showPendingStartCancellation = true; - alertDialog = alertBuilder.setTitle(activity.getString(R.string.eip_cancel_connect_title)) - .setMessage(activity.getString(R.string.eip_cancel_connect_text)) - .setPositiveButton((android.R.string.yes), (dialog, which) -> stopEipIfPossible()) - .setNegativeButton(activity.getString(android.R.string.no), (dialog, which) -> { - }).setOnDismissListener(dialog -> showPendingStartCancellation = false).show(); + try { + AlertDialog.Builder alertBuilder = new AlertDialog.Builder(getActivity()); + showPendingStartCancellation = true; + alertDialog = alertBuilder.setTitle(activity.getString(R.string.eip_cancel_connect_title)) + .setMessage(activity.getString(R.string.eip_cancel_connect_text)) + .setPositiveButton((android.R.string.yes), (dialog, which) -> stopEipIfPossible()) + .setNegativeButton(activity.getString(android.R.string.no), (dialog, which) -> { + }).setOnDismissListener(dialog -> showPendingStartCancellation = false).show(); + } catch (IllegalStateException e) { + e.printStackTrace(); + } } @@ -340,13 +344,18 @@ public class EipFragment extends Fragment implements Observer { Log.e(TAG, "activity is null when asking to stop EIP"); return; } - AlertDialog.Builder alertBuilder = new AlertDialog.Builder(activity); - showAskToStopEip = true; - alertDialog = alertBuilder.setTitle(activity.getString(R.string.eip_cancel_connect_title)) - .setMessage(activity.getString(R.string.eip_warning_browser_inconsistency)) - .setPositiveButton((android.R.string.yes), (dialog, which) -> stopEipIfPossible()) - .setNegativeButton(activity.getString(android.R.string.no), (dialog, which) -> { - }).setOnDismissListener(dialog -> showAskToStopEip = false).show(); + try { + AlertDialog.Builder alertBuilder = new AlertDialog.Builder(activity); + showAskToStopEip = true; + alertDialog = alertBuilder.setTitle(activity.getString(R.string.eip_cancel_connect_title)) + .setMessage(activity.getString(R.string.eip_warning_browser_inconsistency)) + .setPositiveButton((android.R.string.yes), (dialog, which) -> stopEipIfPossible()) + .setNegativeButton(activity.getString(android.R.string.no), (dialog, which) -> { + }).setOnDismissListener(dialog -> showAskToStopEip = false).show(); + } catch (IllegalStateException e) { + e.printStackTrace(); + } + } @Override |