Update Example
							
								
								
									
										55
									
								
								Example/testHotUpdate/android/app/BUCK
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,55 @@ | ||||
| # To learn about Buck see [Docs](https://buckbuild.com/). | ||||
| # To run your application with Buck: | ||||
| # - install Buck | ||||
| # - `npm start` - to start the packager | ||||
| # - `cd android` | ||||
| # - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"` | ||||
| # - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck | ||||
| # - `buck install -r android/app` - compile, install and run application | ||||
| # | ||||
|  | ||||
| load(":build_defs.bzl", "create_aar_targets", "create_jar_targets") | ||||
|  | ||||
| lib_deps = [] | ||||
|  | ||||
| create_aar_targets(glob(["libs/*.aar"])) | ||||
|  | ||||
| create_jar_targets(glob(["libs/*.jar"])) | ||||
|  | ||||
| android_library( | ||||
|     name = "all-libs", | ||||
|     exported_deps = lib_deps, | ||||
| ) | ||||
|  | ||||
| android_library( | ||||
|     name = "app-code", | ||||
|     srcs = glob([ | ||||
|         "src/main/java/**/*.java", | ||||
|     ]), | ||||
|     deps = [ | ||||
|         ":all-libs", | ||||
|         ":build_config", | ||||
|         ":res", | ||||
|     ], | ||||
| ) | ||||
|  | ||||
| android_build_config( | ||||
|     name = "build_config", | ||||
|     package = "com.testhotupdate", | ||||
| ) | ||||
|  | ||||
| android_resource( | ||||
|     name = "res", | ||||
|     package = "com.testhotupdate", | ||||
|     res = "src/main/res", | ||||
| ) | ||||
|  | ||||
| android_binary( | ||||
|     name = "app", | ||||
|     keystore = "//android/keystores:debug", | ||||
|     manifest = "src/main/AndroidManifest.xml", | ||||
|     package_type = "debug", | ||||
|     deps = [ | ||||
|         ":app-code", | ||||
|     ], | ||||
| ) | ||||
| @@ -9,7 +9,7 @@ import com.android.build.OutputFile | ||||
|  * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the | ||||
|  * bundle directly from the development server. Below you can see all the possible configurations | ||||
|  * and their defaults. If you decide to add a configuration block, make sure to add it before the | ||||
|  * `apply from: "react.gradle"` line. | ||||
|  * `apply from: "../../node_modules/react-native/react.gradle"` line. | ||||
|  * | ||||
|  * project.ext.react = [ | ||||
|  *   // the name of the generated asset file containing your JS bundle | ||||
| @@ -18,6 +18,9 @@ import com.android.build.OutputFile | ||||
|  *   // the entry file for bundle generation | ||||
|  *   entryFile: "index.android.js", | ||||
|  * | ||||
|  *   // https://facebook.github.io/react-native/docs/performance#enable-the-ram-format | ||||
|  *   bundleCommand: "ram-bundle", | ||||
|  * | ||||
|  *   // whether to bundle JS and assets in debug mode | ||||
|  *   bundleInDebug: false, | ||||
|  * | ||||
| @@ -26,11 +29,20 @@ import com.android.build.OutputFile | ||||
|  * | ||||
|  *   // whether to bundle JS and assets in another build variant (if configured). | ||||
|  *   // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants | ||||
|  *   // The configuration property is in the format 'bundleIn${productFlavor}${buildType}' | ||||
|  *   // The configuration property can be in the following formats | ||||
|  *   //         'bundleIn${productFlavor}${buildType}' | ||||
|  *   //         'bundleIn${buildType}' | ||||
|  *   // bundleInFreeDebug: true, | ||||
|  *   // bundleInPaidRelease: true, | ||||
|  *   // bundleInBeta: true, | ||||
|  * | ||||
|  *   // whether to disable dev mode in custom build variants (by default only disabled in release) | ||||
|  *   // for example: to disable dev mode in the staging build type (if configured) | ||||
|  *   devDisabledInStaging: true, | ||||
|  *   // The configuration property can be in the following formats | ||||
|  *   //         'devDisabledIn${productFlavor}${buildType}' | ||||
|  *   //         'devDisabledIn${buildType}' | ||||
|  * | ||||
|  *   // the root of your project, i.e. where "package.json" lives | ||||
|  *   root: "../../", | ||||
|  * | ||||
| @@ -53,15 +65,25 @@ import com.android.build.OutputFile | ||||
|  *   // date; if you have any other folders that you want to ignore for performance reasons (gradle | ||||
|  *   // indexes the entire tree), add them here. Alternatively, if you have JS files in android/ | ||||
|  *   // for example, you might want to remove it from here. | ||||
|  *   inputExcludes: ["android/**", "ios/**"] | ||||
|  *   inputExcludes: ["android/**", "ios/**"], | ||||
|  * | ||||
|  *   // override which node gets called and with what additional arguments | ||||
|  *   nodeExecutableAndArgs: ["node"], | ||||
|  * | ||||
|  *   // supply additional arguments to the packager | ||||
|  *   extraPackagerArgs: [] | ||||
|  * ] | ||||
|  */ | ||||
|  | ||||
| apply from: "react.gradle" | ||||
| project.ext.react = [ | ||||
|     entryFile: "index.js", | ||||
|     enableHermes: false,  // clean and rebuild if changing | ||||
| ] | ||||
|  | ||||
| apply from: "../../node_modules/react-native/react.gradle" | ||||
|  | ||||
| /** | ||||
|  * Set this to true to create three separate APKs instead of one: | ||||
|  *   - A universal APK that works on all devices | ||||
|  * Set this to true to create two separate APKs instead of one: | ||||
|  *   - An APK that only works on ARM devices | ||||
|  *   - An APK that only works on x86 devices | ||||
|  * The advantage is the size of the APK is reduced by about 4MB. | ||||
| @@ -75,30 +97,67 @@ def enableSeparateBuildPerCPUArchitecture = false | ||||
|  */ | ||||
| def enableProguardInReleaseBuilds = false | ||||
|  | ||||
| /** | ||||
|  * The preferred build flavor of JavaScriptCore. | ||||
|  * | ||||
|  * For example, to use the international variant, you can use: | ||||
|  * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` | ||||
|  * | ||||
|  * The international variant includes ICU i18n library and necessary data | ||||
|  * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that | ||||
|  * give correct results when using with locales other than en-US.  Note that | ||||
|  * this variant is about 6MiB larger per architecture than default. | ||||
|  */ | ||||
| def jscFlavor = 'org.webkit:android-jsc:+' | ||||
|  | ||||
| /** | ||||
|  * Whether to enable the Hermes VM. | ||||
|  * | ||||
|  * This should be set on project.ext.react and mirrored here.  If it is not set | ||||
|  * on project.ext.react, JavaScript will not be compiled to Hermes Bytecode | ||||
|  * and the benefits of using Hermes will therefore be sharply reduced. | ||||
|  */ | ||||
| def enableHermes = project.ext.react.get("enableHermes", false); | ||||
|  | ||||
| android { | ||||
|     compileSdkVersion 23 | ||||
|     buildToolsVersion "23.0.1" | ||||
|     compileSdkVersion rootProject.ext.compileSdkVersion | ||||
|  | ||||
|     compileOptions { | ||||
|         sourceCompatibility JavaVersion.VERSION_1_8 | ||||
|         targetCompatibility JavaVersion.VERSION_1_8 | ||||
|     } | ||||
|  | ||||
|     defaultConfig { | ||||
|         applicationId "com.testhotupdate" | ||||
|         minSdkVersion 16 | ||||
|         targetSdkVersion 22 | ||||
|         minSdkVersion rootProject.ext.minSdkVersion | ||||
|         targetSdkVersion rootProject.ext.targetSdkVersion | ||||
|         versionCode 1 | ||||
|         versionName "1.0" | ||||
|         ndk { | ||||
|             abiFilters "armeabi-v7a", "x86" | ||||
|         } | ||||
|     } | ||||
|     splits { | ||||
|         abi { | ||||
|             enable enableSeparateBuildPerCPUArchitecture | ||||
|             universalApk false | ||||
|             reset() | ||||
|             include "armeabi-v7a", "x86" | ||||
|             enable enableSeparateBuildPerCPUArchitecture | ||||
|             universalApk false  // If true, also generate a universal APK | ||||
|             include "armeabi-v7a", "x86", "arm64-v8a", "x86_64" | ||||
|         } | ||||
|     } | ||||
|     signingConfigs { | ||||
|         debug { | ||||
|             storeFile file('debug.keystore') | ||||
|             storePassword 'android' | ||||
|             keyAlias 'androiddebugkey' | ||||
|             keyPassword 'android' | ||||
|         } | ||||
|     } | ||||
|     buildTypes { | ||||
|         debug { | ||||
|             signingConfig signingConfigs.debug | ||||
|         } | ||||
|         release { | ||||
|             // Caution! In production, you need to generate your own keystore file. | ||||
|             // see https://facebook.github.io/react-native/docs/signed-apk-android. | ||||
|             signingConfig signingConfigs.debug | ||||
|             minifyEnabled enableProguardInReleaseBuilds | ||||
|             proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" | ||||
|         } | ||||
| @@ -107,20 +166,36 @@ android { | ||||
|     applicationVariants.all { variant -> | ||||
|         variant.outputs.each { output -> | ||||
|             // For each separate APK per architecture, set a unique version code as described here: | ||||
|             // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits | ||||
|             def versionCodes = ["armeabi-v7a":1, "x86":2] | ||||
|             // https://developer.android.com/studio/build/configure-apk-splits.html | ||||
|             def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4] | ||||
|             def abi = output.getFilter(OutputFile.ABI) | ||||
|             if (abi != null) {  // null for the universal-debug, universal-release variants | ||||
|                 output.versionCodeOverride = | ||||
|                         versionCodes.get(abi) * 1048576 + defaultConfig.versionCode | ||||
|             } | ||||
|  | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| dependencies { | ||||
|     compile project(':react-native-update') | ||||
|     compile fileTree(dir: "libs", include: ["*.jar"]) | ||||
|     compile "com.android.support:appcompat-v7:23.0.1" | ||||
|     compile "com.facebook.react:react-native:0.20.+" | ||||
|     implementation fileTree(dir: "libs", include: ["*.jar"]) | ||||
|     implementation "com.facebook.react:react-native:+"  // From node_modules | ||||
|  | ||||
|     if (enableHermes) { | ||||
|         def hermesPath = "../../node_modules/hermes-engine/android/"; | ||||
|         debugImplementation files(hermesPath + "hermes-debug.aar") | ||||
|         releaseImplementation files(hermesPath + "hermes-release.aar") | ||||
|     } else { | ||||
|         implementation jscFlavor | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Run this once to be able to run the application with BUCK | ||||
| // puts all compile dependencies into folder libs for BUCK to use | ||||
| task copyDownloadableDepsToLibs(type: Copy) { | ||||
|     from configurations.compile | ||||
|     into 'libs' | ||||
| } | ||||
|  | ||||
| apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) | ||||
|   | ||||
							
								
								
									
										19
									
								
								Example/testHotUpdate/android/app/build_defs.bzl
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,19 @@ | ||||
| """Helper definitions to glob .aar and .jar targets""" | ||||
|  | ||||
| def create_aar_targets(aarfiles): | ||||
|     for aarfile in aarfiles: | ||||
|         name = "aars__" + aarfile[aarfile.rindex("/") + 1:aarfile.rindex(".aar")] | ||||
|         lib_deps.append(":" + name) | ||||
|         android_prebuilt_aar( | ||||
|             name = name, | ||||
|             aar = aarfile, | ||||
|         ) | ||||
|  | ||||
| def create_jar_targets(jarfiles): | ||||
|     for jarfile in jarfiles: | ||||
|         name = "jars__" + jarfile[jarfile.rindex("/") + 1:jarfile.rindex(".jar")] | ||||
|         lib_deps.append(":" + name) | ||||
|         prebuilt_jar( | ||||
|             name = name, | ||||
|             binary_jar = jarfile, | ||||
|         ) | ||||
							
								
								
									
										
											BIN
										
									
								
								Example/testHotUpdate/android/app/debug.keystore
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -8,60 +8,3 @@ | ||||
| #   http://developer.android.com/guide/developing/tools/proguard.html | ||||
|  | ||||
| # Add any project specific keep options here: | ||||
|  | ||||
| # If your project uses WebView with JS, uncomment the following | ||||
| # and specify the fully qualified class name to the JavaScript interface | ||||
| # class: | ||||
| #-keepclassmembers class fqcn.of.javascript.interface.for.webview { | ||||
| #   public *; | ||||
| #} | ||||
|  | ||||
| # Disabling obfuscation is useful if you collect stack traces from production crashes | ||||
| # (unless you are using a system that supports de-obfuscate the stack traces). | ||||
| -dontobfuscate | ||||
|  | ||||
| # React Native | ||||
|  | ||||
| # Keep our interfaces so they can be used by other ProGuard rules. | ||||
| # See http://sourceforge.net/p/proguard/bugs/466/ | ||||
| -keep,allowobfuscation @interface com.facebook.proguard.annotations.DoNotStrip | ||||
| -keep,allowobfuscation @interface com.facebook.proguard.annotations.KeepGettersAndSetters | ||||
|  | ||||
| # Do not strip any method/class that is annotated with @DoNotStrip | ||||
| -keep @com.facebook.proguard.annotations.DoNotStrip class * | ||||
| -keepclassmembers class * { | ||||
|     @com.facebook.proguard.annotations.DoNotStrip *; | ||||
| } | ||||
|  | ||||
| -keepclassmembers @com.facebook.proguard.annotations.KeepGettersAndSetters class * { | ||||
|   void set*(***); | ||||
|   *** get*(); | ||||
| } | ||||
|  | ||||
| -keep class * extends com.facebook.react.bridge.JavaScriptModule { *; } | ||||
| -keep class * extends com.facebook.react.bridge.NativeModule { *; } | ||||
| -keepclassmembers,includedescriptorclasses class * { native <methods>; } | ||||
| -keepclassmembers class *  { @com.facebook.react.uimanager.UIProp <fields>; } | ||||
| -keepclassmembers class *  { @com.facebook.react.uimanager.annotations.ReactProp <methods>; } | ||||
| -keepclassmembers class *  { @com.facebook.react.uimanager.annotations.ReactPropGroup <methods>; } | ||||
|  | ||||
| -dontwarn com.facebook.react.** | ||||
|  | ||||
| # okhttp | ||||
|  | ||||
| -keepattributes Signature | ||||
| -keepattributes *Annotation* | ||||
| -keep class com.squareup.okhttp.** { *; } | ||||
| -keep interface com.squareup.okhttp.** { *; } | ||||
| -dontwarn com.squareup.okhttp.** | ||||
|  | ||||
| # okio | ||||
|  | ||||
| -keep class sun.misc.Unsafe { *; } | ||||
| -dontwarn java.nio.file.* | ||||
| -dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement | ||||
| -dontwarn okio.** | ||||
|  | ||||
| # stetho | ||||
|  | ||||
| -dontwarn com.facebook.stetho.** | ||||
|   | ||||
| @@ -1,96 +0,0 @@ | ||||
| import org.apache.tools.ant.taskdefs.condition.Os | ||||
|  | ||||
| def config = project.hasProperty("react") ? project.react : []; | ||||
|  | ||||
| def bundleAssetName = config.bundleAssetName ?: "index.android.bundle" | ||||
| def entryFile = config.entryFile ?: "index.android.js" | ||||
|  | ||||
| // because elvis operator | ||||
| def elvisFile(thing) { | ||||
|     return thing ? file(thing) : null; | ||||
| } | ||||
|  | ||||
| def reactRoot = elvisFile(config.root) ?: file("../../") | ||||
| def inputExcludes = config.inputExcludes ?: ["android/**", "ios/**"] | ||||
|  | ||||
| void runBefore(String dependentTaskName, Task task) { | ||||
|     Task dependentTask = tasks.findByPath(dependentTaskName); | ||||
|     if (dependentTask != null) { | ||||
|         dependentTask.dependsOn task | ||||
|     } | ||||
| } | ||||
|  | ||||
| gradle.projectsEvaluated { | ||||
|     // Grab all build types and product flavors | ||||
|     def buildTypes = android.buildTypes.collect { type -> type.name } | ||||
|     def productFlavors = android.productFlavors.collect { flavor -> flavor.name } | ||||
|  | ||||
|     // When no product flavors defined, use empty | ||||
|     if (!productFlavors) productFlavors.add('') | ||||
|  | ||||
|     productFlavors.each { productFlavorName -> | ||||
|         buildTypes.each { buildTypeName -> | ||||
|             // Create variant and source names | ||||
|             def sourceName = "${buildTypeName}" | ||||
|             def targetName = "${sourceName.capitalize()}" | ||||
|             if (productFlavorName) { | ||||
|                 sourceName = "${productFlavorName}${targetName}" | ||||
|             } | ||||
|  | ||||
|             // React js bundle directories | ||||
|             def jsBundleDirConfigName = "jsBundleDir${targetName}" | ||||
|             def jsBundleDir = elvisFile(config."$jsBundleDirConfigName") ?: | ||||
|                     file("$buildDir/intermediates/assets/${sourceName}") | ||||
|  | ||||
|             def resourcesDirConfigName = "jsBundleDir${targetName}" | ||||
|             def resourcesDir = elvisFile(config."${resourcesDirConfigName}") ?: | ||||
|                     file("$buildDir/intermediates/res/merged/${sourceName}") | ||||
|             def jsBundleFile = file("$jsBundleDir/$bundleAssetName") | ||||
|  | ||||
|             // Bundle task name for variant | ||||
|             def bundleJsAndAssetsTaskName = "bundle${targetName}JsAndAssets" | ||||
|  | ||||
|             def currentBundleTask = tasks.create( | ||||
|                     name: bundleJsAndAssetsTaskName, | ||||
|                     type: Exec) { | ||||
|                 group = "react" | ||||
|                 description = "bundle JS and assets for ${targetName}." | ||||
|  | ||||
|                 // Create dirs if they are not there (e.g. the "clean" task just ran) | ||||
|                 doFirst { | ||||
|                     jsBundleDir.mkdirs() | ||||
|                     resourcesDir.mkdirs() | ||||
|                 } | ||||
|  | ||||
|                 // Set up inputs and outputs so gradle can cache the result | ||||
|                 inputs.files fileTree(dir: reactRoot, excludes: inputExcludes) | ||||
|                 outputs.dir jsBundleDir | ||||
|                 outputs.dir resourcesDir | ||||
|  | ||||
|                 // Set up the call to the react-native cli | ||||
|                 workingDir reactRoot | ||||
|  | ||||
|                 // Set up dev mode | ||||
|                 def devEnabled = !targetName.toLowerCase().contains("release") | ||||
|                 if (Os.isFamily(Os.FAMILY_WINDOWS)) { | ||||
|                     commandLine "cmd", "/c", "react-native", "bundle", "--platform", "android", "--dev", "${devEnabled}", | ||||
|                             "--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir | ||||
|                 } else { | ||||
|                     commandLine "react-native", "bundle", "--platform", "android", "--dev", "${devEnabled}", | ||||
|                             "--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir | ||||
|                 } | ||||
|  | ||||
|                 enabled config."bundleIn${targetName}" ?: targetName.toLowerCase().contains("release") | ||||
|             } | ||||
|  | ||||
|             // Hook bundle${productFlavor}${buildType}JsAndAssets into the android build process | ||||
|             currentBundleTask.dependsOn("merge${targetName}Resources") | ||||
|             currentBundleTask.dependsOn("merge${targetName}Assets") | ||||
|  | ||||
|             runBefore("processArmeabi-v7a${targetName}Resources", currentBundleTask) | ||||
|             runBefore("processX86${targetName}Resources", currentBundleTask) | ||||
|             runBefore("processUniversal${targetName}Resources", currentBundleTask) | ||||
|             runBefore("process${targetName}Resources", currentBundleTask) | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,8 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:tools="http://schemas.android.com/tools"> | ||||
|  | ||||
|     <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> | ||||
|  | ||||
|     <application android:usesCleartextTraffic="true" tools:targetApi="28" tools:ignore="GoogleAppIndexingWarning" /> | ||||
| </manifest> | ||||
| @@ -1,17 +1,20 @@ | ||||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     package="com.testhotupdate"> | ||||
|   package="com.testhotupdate"> | ||||
|  | ||||
|     <uses-permission android:name="android.permission.INTERNET" /> | ||||
|  | ||||
|     <application | ||||
|       android:allowBackup="true" | ||||
|       android:name=".MainApplication" | ||||
|       android:label="@string/app_name" | ||||
|       android:icon="@mipmap/ic_launcher" | ||||
|       android:roundIcon="@mipmap/ic_launcher_round" | ||||
|       android:allowBackup="false" | ||||
|       android:theme="@style/AppTheme"> | ||||
|       <activity | ||||
|         android:name=".MainActivity" | ||||
|         android:label="@string/app_name" | ||||
|         android:configChanges="keyboard|keyboardHidden|orientation|screenSize"> | ||||
|         android:configChanges="keyboard|keyboardHidden|orientation|screenSize" | ||||
|         android:windowSoftInputMode="adjustResize"> | ||||
|         <intent-filter> | ||||
|             <action android:name="android.intent.action.MAIN" /> | ||||
|             <category android:name="android.intent.category.LAUNCHER" /> | ||||
|   | ||||
| @@ -1,40 +1,15 @@ | ||||
| package com.testhotupdate; | ||||
|  | ||||
| import com.facebook.react.ReactActivity; | ||||
| import com.facebook.react.ReactPackage; | ||||
| import com.facebook.react.shell.MainReactPackage; | ||||
|  | ||||
| import java.util.Arrays; | ||||
| import java.util.List; | ||||
|  | ||||
| public class MainActivity extends ReactActivity { | ||||
|  | ||||
|     /** | ||||
|      * Returns the name of the main component registered from JavaScript. | ||||
|      * This is used to schedule rendering of the component. | ||||
|      */ | ||||
|     @Override | ||||
|     protected String getMainComponentName() { | ||||
|         return "testHotUpdate"; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns whether dev mode should be enabled. | ||||
|      * This enables e.g. the dev menu. | ||||
|      */ | ||||
|     @Override | ||||
|     protected boolean getUseDeveloperSupport() { | ||||
|         return BuildConfig.DEBUG; | ||||
|     } | ||||
|  | ||||
|    /** | ||||
|    * A list of packages used by the app. If the app uses additional views | ||||
|    * or modules besides the default ones, add more packages here. | ||||
|   /** | ||||
|    * Returns the name of the main component registered from JavaScript. This is used to schedule | ||||
|    * rendering of the component. | ||||
|    */ | ||||
|     @Override | ||||
|     protected List<ReactPackage> getPackages() { | ||||
|       return Arrays.<ReactPackage>asList( | ||||
|         new MainReactPackage() | ||||
|       ); | ||||
|     } | ||||
|   @Override | ||||
|   protected String getMainComponentName() { | ||||
|     return "testHotUpdate"; | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,81 @@ | ||||
| package com.testhotupdate; | ||||
|  | ||||
| import android.app.Application; | ||||
| import android.content.Context; | ||||
| import com.facebook.react.PackageList; | ||||
| import com.facebook.react.ReactApplication; | ||||
| import com.facebook.react.ReactNativeHost; | ||||
| import com.facebook.react.ReactPackage; | ||||
| import com.facebook.soloader.SoLoader; | ||||
| import java.lang.reflect.InvocationTargetException; | ||||
| import java.util.List; | ||||
|  | ||||
| import cn.reactnative.modules.update.UpdateContext; | ||||
|  | ||||
| public class MainApplication extends Application implements ReactApplication { | ||||
|  | ||||
|   private final ReactNativeHost mReactNativeHost = | ||||
|       new ReactNativeHost(this) { | ||||
|         @Override | ||||
|         protected String getJSBundleFile() { | ||||
|             return UpdateContext.getBundleUrl(MainApplication.this); | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public boolean getUseDeveloperSupport() { | ||||
|           return BuildConfig.DEBUG; | ||||
|         } | ||||
|  | ||||
|         @Override | ||||
|         protected List<ReactPackage> getPackages() { | ||||
|           @SuppressWarnings("UnnecessaryLocalVariable") | ||||
|           List<ReactPackage> packages = new PackageList(this).getPackages(); | ||||
|           // Packages that cannot be autolinked yet can be added manually here, for example: | ||||
|           // packages.add(new MyReactNativePackage()); | ||||
|           return packages; | ||||
|         } | ||||
|  | ||||
|         @Override | ||||
|         protected String getJSMainModuleName() { | ||||
|           return "index"; | ||||
|         } | ||||
|       }; | ||||
|  | ||||
|   @Override | ||||
|   public ReactNativeHost getReactNativeHost() { | ||||
|     return mReactNativeHost; | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void onCreate() { | ||||
|     super.onCreate(); | ||||
|     SoLoader.init(this, /* native exopackage */ false); | ||||
|     initializeFlipper(this); // Remove this line if you don't want Flipper enabled | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Loads Flipper in React Native templates. | ||||
|    * | ||||
|    * @param context | ||||
|    */ | ||||
|   private static void initializeFlipper(Context context) { | ||||
|     if (BuildConfig.DEBUG) { | ||||
|       try { | ||||
|         /* | ||||
|          We use reflection here to pick up the class that initializes Flipper, | ||||
|         since Flipper library is not available in release mode | ||||
|         */ | ||||
|         Class<?> aClass = Class.forName("com.facebook.flipper.ReactNativeFlipper"); | ||||
|         aClass.getMethod("initializeFlipper", Context.class).invoke(null, context); | ||||
|       } catch (ClassNotFoundException e) { | ||||
|         e.printStackTrace(); | ||||
|       } catch (NoSuchMethodException e) { | ||||
|         e.printStackTrace(); | ||||
|       } catch (IllegalAccessException e) { | ||||
|         e.printStackTrace(); | ||||
|       } catch (InvocationTargetException e) { | ||||
|         e.printStackTrace(); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.0 KiB | 
| After Width: | Height: | Size: 4.9 KiB | 
| Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.0 KiB | 
| After Width: | Height: | Size: 2.8 KiB | 
| Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.5 KiB | 
| After Width: | Height: | Size: 6.9 KiB | 
| Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 6.3 KiB | 
| After Width: | Height: | Size: 10 KiB | 
| After Width: | Height: | Size: 9.0 KiB | 
| After Width: | Height: | Size: 15 KiB | 
| @@ -3,6 +3,7 @@ | ||||
|     <!-- Base application theme. --> | ||||
|     <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> | ||||
|         <!-- Customize your theme here. --> | ||||
|         <item name="android:textColor">#000000</item> | ||||
|     </style> | ||||
|  | ||||
| </resources> | ||||
|   | ||||
| @@ -1,11 +1,18 @@ | ||||
| // Top-level build file where you can add configuration options common to all sub-projects/modules. | ||||
|  | ||||
| buildscript { | ||||
|     ext { | ||||
|         buildToolsVersion = "28.0.3" | ||||
|         minSdkVersion = 16 | ||||
|         compileSdkVersion = 28 | ||||
|         targetSdkVersion = 28 | ||||
|     } | ||||
|     repositories { | ||||
|         google() | ||||
|         jcenter() | ||||
|     } | ||||
|     dependencies { | ||||
|         classpath 'com.android.tools.build:gradle:1.3.1' | ||||
|         classpath("com.android.tools.build:gradle:3.4.2") | ||||
|  | ||||
|         // NOTE: Do not place your application dependencies here; they belong | ||||
|         // in the individual module build.gradle files | ||||
| @@ -15,6 +22,17 @@ buildscript { | ||||
| allprojects { | ||||
|     repositories { | ||||
|         mavenLocal() | ||||
|         maven { | ||||
|             // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm | ||||
|             url("$rootDir/../node_modules/react-native/android") | ||||
|         } | ||||
|         maven { | ||||
|             // Android JSC is installed from npm | ||||
|             url("$rootDir/../node_modules/jsc-android/dist") | ||||
|         } | ||||
|  | ||||
|         google() | ||||
|         jcenter() | ||||
|         maven { url 'https://jitpack.io' } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -17,4 +17,5 @@ | ||||
| # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects | ||||
| # org.gradle.parallel=true | ||||
|  | ||||
| android.useDeprecatedNdk=true | ||||
| android.useAndroidX=true | ||||
| android.enableJetifier=true | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| distributionBase=GRADLE_USER_HOME | ||||
| distributionPath=wrapper/dists | ||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-5.5-all.zip | ||||
| zipStoreBase=GRADLE_USER_HOME | ||||
| zipStorePath=wrapper/dists | ||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip | ||||
|   | ||||
							
								
								
									
										126
									
								
								Example/testHotUpdate/android/gradlew
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,4 +1,20 @@ | ||||
| #!/usr/bin/env bash | ||||
| #!/usr/bin/env sh | ||||
|  | ||||
| # | ||||
| # Copyright 2015 the original author or authors. | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| # you may not use this file except in compliance with the License. | ||||
| # You may obtain a copy of the License at | ||||
| # | ||||
| #      http://www.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
| # | ||||
|  | ||||
| ############################################################################## | ||||
| ## | ||||
| @@ -6,47 +22,6 @@ | ||||
| ## | ||||
| ############################################################################## | ||||
|  | ||||
| # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | ||||
| DEFAULT_JVM_OPTS="" | ||||
|  | ||||
| APP_NAME="Gradle" | ||||
| APP_BASE_NAME=`basename "$0"` | ||||
|  | ||||
| # Use the maximum available, or set MAX_FD != -1 to use that value. | ||||
| MAX_FD="maximum" | ||||
|  | ||||
| warn ( ) { | ||||
|     echo "$*" | ||||
| } | ||||
|  | ||||
| die ( ) { | ||||
|     echo | ||||
|     echo "$*" | ||||
|     echo | ||||
|     exit 1 | ||||
| } | ||||
|  | ||||
| # OS specific support (must be 'true' or 'false'). | ||||
| cygwin=false | ||||
| msys=false | ||||
| darwin=false | ||||
| case "`uname`" in | ||||
|   CYGWIN* ) | ||||
|     cygwin=true | ||||
|     ;; | ||||
|   Darwin* ) | ||||
|     darwin=true | ||||
|     ;; | ||||
|   MINGW* ) | ||||
|     msys=true | ||||
|     ;; | ||||
| esac | ||||
|  | ||||
| # For Cygwin, ensure paths are in UNIX format before anything is touched. | ||||
| if $cygwin ; then | ||||
|     [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` | ||||
| fi | ||||
|  | ||||
| # Attempt to set APP_HOME | ||||
| # Resolve links: $0 may be a link | ||||
| PRG="$0" | ||||
| @@ -61,9 +36,49 @@ while [ -h "$PRG" ] ; do | ||||
|     fi | ||||
| done | ||||
| SAVED="`pwd`" | ||||
| cd "`dirname \"$PRG\"`/" >&- | ||||
| cd "`dirname \"$PRG\"`/" >/dev/null | ||||
| APP_HOME="`pwd -P`" | ||||
| cd "$SAVED" >&- | ||||
| cd "$SAVED" >/dev/null | ||||
|  | ||||
| APP_NAME="Gradle" | ||||
| APP_BASE_NAME=`basename "$0"` | ||||
|  | ||||
| # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | ||||
| DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' | ||||
|  | ||||
| # Use the maximum available, or set MAX_FD != -1 to use that value. | ||||
| MAX_FD="maximum" | ||||
|  | ||||
| warn () { | ||||
|     echo "$*" | ||||
| } | ||||
|  | ||||
| die () { | ||||
|     echo | ||||
|     echo "$*" | ||||
|     echo | ||||
|     exit 1 | ||||
| } | ||||
|  | ||||
| # OS specific support (must be 'true' or 'false'). | ||||
| cygwin=false | ||||
| msys=false | ||||
| darwin=false | ||||
| nonstop=false | ||||
| case "`uname`" in | ||||
|   CYGWIN* ) | ||||
|     cygwin=true | ||||
|     ;; | ||||
|   Darwin* ) | ||||
|     darwin=true | ||||
|     ;; | ||||
|   MINGW* ) | ||||
|     msys=true | ||||
|     ;; | ||||
|   NONSTOP* ) | ||||
|     nonstop=true | ||||
|     ;; | ||||
| esac | ||||
|  | ||||
| CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar | ||||
|  | ||||
| @@ -90,7 +105,7 @@ location of your Java installation." | ||||
| fi | ||||
|  | ||||
| # Increase the maximum file descriptors if we can. | ||||
| if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then | ||||
| if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then | ||||
|     MAX_FD_LIMIT=`ulimit -H -n` | ||||
|     if [ $? -eq 0 ] ; then | ||||
|         if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then | ||||
| @@ -114,6 +129,7 @@ fi | ||||
| if $cygwin ; then | ||||
|     APP_HOME=`cygpath --path --mixed "$APP_HOME"` | ||||
|     CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` | ||||
|     JAVACMD=`cygpath --unix "$JAVACMD"` | ||||
|  | ||||
|     # We build the pattern for arguments to be converted via cygpath | ||||
|     ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` | ||||
| @@ -154,11 +170,19 @@ if $cygwin ; then | ||||
|     esac | ||||
| fi | ||||
|  | ||||
| # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules | ||||
| function splitJvmOpts() { | ||||
|     JVM_OPTS=("$@") | ||||
| # Escape application args | ||||
| save () { | ||||
|     for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done | ||||
|     echo " " | ||||
| } | ||||
| eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS | ||||
| JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" | ||||
| APP_ARGS=$(save "$@") | ||||
|  | ||||
| exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" | ||||
| # Collect all arguments for the java command, following the shell quoting and substitution rules | ||||
| eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" | ||||
|  | ||||
| # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong | ||||
| if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then | ||||
|   cd "$(dirname "$0")" | ||||
| fi | ||||
|  | ||||
| exec "$JAVACMD" "$@" | ||||
|   | ||||
							
								
								
									
										30
									
								
								Example/testHotUpdate/android/gradlew.bat
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,3 +1,19 @@ | ||||
| @rem | ||||
| @rem Copyright 2015 the original author or authors. | ||||
| @rem | ||||
| @rem Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| @rem you may not use this file except in compliance with the License. | ||||
| @rem You may obtain a copy of the License at | ||||
| @rem | ||||
| @rem      http://www.apache.org/licenses/LICENSE-2.0 | ||||
| @rem | ||||
| @rem Unless required by applicable law or agreed to in writing, software | ||||
| @rem distributed under the License is distributed on an "AS IS" BASIS, | ||||
| @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| @rem See the License for the specific language governing permissions and | ||||
| @rem limitations under the License. | ||||
| @rem | ||||
|  | ||||
| @if "%DEBUG%" == "" @echo off | ||||
| @rem ########################################################################## | ||||
| @rem | ||||
| @@ -8,14 +24,14 @@ | ||||
| @rem Set local scope for the variables with windows NT shell | ||||
| if "%OS%"=="Windows_NT" setlocal | ||||
|  | ||||
| @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | ||||
| set DEFAULT_JVM_OPTS= | ||||
|  | ||||
| set DIRNAME=%~dp0 | ||||
| if "%DIRNAME%" == "" set DIRNAME=. | ||||
| set APP_BASE_NAME=%~n0 | ||||
| set APP_HOME=%DIRNAME% | ||||
|  | ||||
| @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | ||||
| set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" | ||||
|  | ||||
| @rem Find java.exe | ||||
| if defined JAVA_HOME goto findJavaFromJavaHome | ||||
|  | ||||
| @@ -46,10 +62,9 @@ echo location of your Java installation. | ||||
| goto fail | ||||
|  | ||||
| :init | ||||
| @rem Get command-line arguments, handling Windowz variants | ||||
| @rem Get command-line arguments, handling Windows variants | ||||
|  | ||||
| if not "%OS%" == "Windows_NT" goto win9xME_args | ||||
| if "%@eval[2+2]" == "4" goto 4NT_args | ||||
|  | ||||
| :win9xME_args | ||||
| @rem Slurp the command line arguments. | ||||
| @@ -60,11 +75,6 @@ set _SKIP=2 | ||||
| if "x%~1" == "x" goto execute | ||||
|  | ||||
| set CMD_LINE_ARGS=%* | ||||
| goto execute | ||||
|  | ||||
| :4NT_args | ||||
| @rem Get arguments from the 4NT Shell from JP Software | ||||
| set CMD_LINE_ARGS=%$ | ||||
|  | ||||
| :execute | ||||
| @rem Setup the command line | ||||
|   | ||||
| @@ -1,5 +1,3 @@ | ||||
| rootProject.name = 'testHotUpdate' | ||||
|  | ||||
| apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) | ||||
| include ':app' | ||||
| include ':react-native-update' | ||||
| project(':react-native-update').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-update/android') | ||||
|   | ||||
 sunnylqm
					sunnylqm