JonaNorman vor 1 Jahr
Ursprung
Commit
482b79ab68
69 geänderte Dateien mit 758 neuen und 271 gelöschten Zeilen
  1. 1 1
      app/build.gradle
  2. 0 267
      app/src/main/java/com/norman/webviewup/demo/DownloadSinkImpl.java
  3. 1 0
      aria-source/.gitignore
  4. 30 0
      aria-source/build.gradle
  5. 0 0
      aria-source/consumer-rules.pro
  6. 21 0
      aria-source/proguard-rules.pro
  7. 26 0
      aria-source/src/androidTest/java/com/norman/webviewup/lib/ExampleInstrumentedTest.java
  8. 4 0
      aria-source/src/main/AndroidManifest.xml
  9. 157 0
      aria-source/src/main/java/com/norman/webviewup/lib/source/aira/WebViewUrlSource.java
  10. 17 0
      aria-source/src/test/java/com/norman/webviewup/lib/ExampleUnitTest.java
  11. 1 0
      core/.gitignore
  12. 29 0
      core/build.gradle
  13. 0 0
      core/consumer-rules.pro
  14. 21 0
      core/proguard-rules.pro
  15. 26 0
      core/src/androidTest/java/com/norman/webviewup/lib/ExampleInstrumentedTest.java
  16. 4 0
      core/src/main/AndroidManifest.xml
  17. 0 0
      core/src/main/java/com/norman/webviewup/lib/UpgradeCallback.java
  18. 38 0
      core/src/main/java/com/norman/webviewup/lib/UpgradeDirectory.java
  19. 0 2
      core/src/main/java/com/norman/webviewup/lib/UpgradeOptions.java
  20. 7 0
      core/src/main/java/com/norman/webviewup/lib/WebViewUpgrade.java
  21. 0 0
      core/src/main/java/com/norman/webviewup/lib/download/DownloadAction.java
  22. 0 0
      core/src/main/java/com/norman/webviewup/lib/download/DownloadSink.java
  23. 0 1
      core/src/main/java/com/norman/webviewup/lib/hook/PackageManagerHook.java
  24. 0 0
      core/src/main/java/com/norman/webviewup/lib/hook/WebViewUpdateServiceHook.java
  25. 0 0
      core/src/main/java/com/norman/webviewup/lib/reflect/ReflectConstructor.java
  26. 0 0
      core/src/main/java/com/norman/webviewup/lib/reflect/ReflectException.java
  27. 0 0
      core/src/main/java/com/norman/webviewup/lib/reflect/ReflectField.java
  28. 0 0
      core/src/main/java/com/norman/webviewup/lib/reflect/ReflectMethod.java
  29. 0 0
      core/src/main/java/com/norman/webviewup/lib/reflect/ReflectProxy.java
  30. 0 0
      core/src/main/java/com/norman/webviewup/lib/reflect/RuntimeAccess.java
  31. 0 0
      core/src/main/java/com/norman/webviewup/lib/reflect/RuntimeProxy.java
  32. 0 0
      core/src/main/java/com/norman/webviewup/lib/reflect/annotation/ClassName.java
  33. 0 0
      core/src/main/java/com/norman/webviewup/lib/reflect/annotation/ClassType.java
  34. 0 0
      core/src/main/java/com/norman/webviewup/lib/reflect/annotation/Constructor.java
  35. 0 0
      core/src/main/java/com/norman/webviewup/lib/reflect/annotation/Field.java
  36. 0 0
      core/src/main/java/com/norman/webviewup/lib/reflect/annotation/Method.java
  37. 0 0
      core/src/main/java/com/norman/webviewup/lib/reflect/annotation/ParameterName.java
  38. 0 0
      core/src/main/java/com/norman/webviewup/lib/reflect/annotation/ParameterType.java
  39. 0 0
      core/src/main/java/com/norman/webviewup/lib/service/binder/BinderHook.java
  40. 0 0
      core/src/main/java/com/norman/webviewup/lib/service/binder/ProxyBinder.java
  41. 0 0
      core/src/main/java/com/norman/webviewup/lib/service/interfaces/IActivityThread.java
  42. 0 0
      core/src/main/java/com/norman/webviewup/lib/service/interfaces/IApplicationInfo.java
  43. 0 0
      core/src/main/java/com/norman/webviewup/lib/service/interfaces/IContextImpl.java
  44. 0 0
      core/src/main/java/com/norman/webviewup/lib/service/interfaces/IPackageManager.java
  45. 0 0
      core/src/main/java/com/norman/webviewup/lib/service/interfaces/IServiceManager.java
  46. 0 0
      core/src/main/java/com/norman/webviewup/lib/service/interfaces/IVMRuntime.java
  47. 0 0
      core/src/main/java/com/norman/webviewup/lib/service/interfaces/IWebViewFactory.java
  48. 0 0
      core/src/main/java/com/norman/webviewup/lib/service/interfaces/IWebViewProviderResponse.java
  49. 0 0
      core/src/main/java/com/norman/webviewup/lib/service/interfaces/IWebViewUpdateService.java
  50. 0 0
      core/src/main/java/com/norman/webviewup/lib/service/proxy/PackageManagerProxy.java
  51. 0 0
      core/src/main/java/com/norman/webviewup/lib/service/proxy/WebViewUpdateServiceProxy.java
  52. 0 0
      core/src/main/java/com/norman/webviewup/lib/util/ApkUtils.java
  53. 41 0
      core/src/main/java/com/norman/webviewup/lib/util/FileUtils.java
  54. 0 0
      core/src/main/java/com/norman/webviewup/lib/util/Md5Utils.java
  55. 0 0
      core/src/main/java/com/norman/webviewup/lib/util/ProcessUtils.java
  56. 17 0
      core/src/test/java/com/norman/webviewup/lib/ExampleUnitTest.java
  57. BIN
      local-source/.DS_Store
  58. 1 0
      local-source/.gitignore
  59. 30 0
      local-source/build.gradle
  60. 0 0
      local-source/consumer-rules.pro
  61. 21 0
      local-source/proguard-rules.pro
  62. 4 0
      local-source/src/main/AndroidManifest.xml
  63. 91 0
      local-source/src/main/java/com/norman/webviewup/lib/source/WebViewAssetSource.java
  64. 33 0
      local-source/src/main/java/com/norman/webviewup/lib/source/WebViewFileSource.java
  65. 39 0
      local-source/src/main/java/com/norman/webviewup/lib/source/WebViewPackageSource.java
  66. 6 0
      local-source/src/main/java/com/norman/webviewup/lib/source/WebViewPathSource.java
  67. 72 0
      local-source/src/main/java/com/norman/webviewup/lib/source/WebViewSource.java
  68. 17 0
      local-source/src/test/java/com/norman/webviewup/lib/ExampleUnitTest.java
  69. 3 0
      settings.gradle

+ 1 - 1
app/build.gradle

@@ -43,5 +43,5 @@ android {
 
 dependencies {
     implementation 'androidx.appcompat:appcompat:1.3.0'
-    implementation 'me.laoyuyu.aria:core:3.8.16'
+    implementation project(":core")
 }

+ 0 - 267
app/src/main/java/com/norman/webviewup/demo/DownloadSinkImpl.java

@@ -1,267 +0,0 @@
-package com.norman.webviewup.demo;
-
-import android.util.Log;
-
-import com.arialyy.aria.core.Aria;
-import com.arialyy.aria.core.download.DownloadEntity;
-import com.arialyy.aria.core.download.DownloadReceiver;
-import com.arialyy.aria.core.download.DownloadTaskListener;
-import com.arialyy.aria.core.inf.IEntity;
-import com.arialyy.aria.core.task.DownloadTask;
-import com.norman.webviewup.lib.download.DownloadAction;
-import com.norman.webviewup.lib.download.DownloadSink;
-import com.norman.webviewup.lib.util.FileUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-
-public class DownloadSinkImpl implements DownloadSink {
-
-    private final List<DownloadActionImpl> downloadActionList = new ArrayList<>();
-
-    @Override
-    public synchronized DownloadAction createDownload(String url, String path) {
-        DownloadActionImpl action = null;
-        for (DownloadActionImpl downloadAction : downloadActionList) {
-            if (Objects.equals(downloadAction.url, url)) {
-                action = downloadAction;
-                break;
-            }
-        }
-        if (action != null) {
-            return action;
-        }
-        action = new DownloadActionImpl(url, path);
-        downloadActionList.add(action);
-        return action;
-    }
-
-
-    static class DownloadActionImpl implements DownloadAction, DownloadTaskListener {
-
-        private final String url;
-        private final DownloadReceiver downloadReceiver;
-
-        private final List<DownloadAction.Callback> callbackList = new ArrayList<>();
-
-        private final String path;
-
-        private long taskId;
-
-        private DownloadEntity downloadEntity;
-
-        private boolean restart;
-
-
-        public DownloadActionImpl(String url, String path) {
-            this.url = url;
-            this.path = path;
-            this.downloadReceiver = Aria.download(this);
-            this.downloadReceiver.register();
-            List<DownloadEntity> downloadEntityList = this.downloadReceiver.getDownloadEntity(url);
-            if (downloadEntityList != null) {
-                for (DownloadEntity entity : downloadEntityList) {
-                    if (Objects.equals(entity.getFilePath(), path)) {
-                        downloadEntity = entity;
-                        break;
-                    }
-                }
-            }
-            if (downloadEntity != null) {
-                taskId = downloadEntity.getId();
-            }
-        }
-
-
-        @Override
-        public String getUrl() {
-            return url;
-        }
-
-        @Override
-        public synchronized void start() {
-            if (downloadEntity != null && !Objects.equals(downloadEntity.getUrl(), url)) {
-                downloadReceiver
-                        .load(downloadEntity.getId())
-                        .cancel(true);
-                downloadEntity = null;
-                taskId = 0;
-            }
-            if (downloadEntity == null ||
-                    downloadEntity.getState() == IEntity.STATE_CANCEL) {
-                FileUtils.makeDirectory(path);
-                taskId = downloadReceiver
-                        .load(url)
-                        .setFilePath(path)
-                        .ignoreCheckPermissions()
-                        .ignoreFilePathOccupy()
-                        .create();
-                downloadEntity = downloadReceiver.getDownloadEntity(taskId);
-            } else if (downloadEntity.getState() == IEntity.STATE_WAIT
-                    || downloadEntity.getState() == IEntity.STATE_OTHER
-                    || downloadEntity.getState() == IEntity.STATE_FAIL
-                    || downloadEntity.getState() == IEntity.STATE_STOP) {
-                downloadReceiver
-                        .load(taskId)
-                        .ignoreCheckPermissions()
-                        .resume();
-            } else if (downloadEntity.getState() == IEntity.STATE_COMPLETE) {
-                downloadReceiver
-                        .load(taskId)
-                        .ignoreCheckPermissions()
-                        .cancel(true);
-                downloadEntity = null;
-                restart = true;
-            }
-        }
-
-        @Override
-        public synchronized void stop() {
-            if (downloadEntity == null) {
-                return;
-            }
-            int state = downloadEntity.getState();
-            if (state == IEntity.STATE_PRE
-                    || state == IEntity.STATE_POST_PRE
-                    || state == IEntity.STATE_RUNNING) {
-                downloadReceiver
-                        .load(taskId)
-                        .stop();
-            }
-        }
-
-        @Override
-        public synchronized void delete() {
-            if (downloadEntity == null) {
-                return;
-            }
-            if (downloadEntity.getState() != IEntity.STATE_CANCEL) {
-                downloadReceiver
-                        .load(taskId)
-                        .ignoreCheckPermissions()
-                        .cancel(true);
-                downloadEntity = null;
-            }
-        }
-
-        @Override
-        public synchronized boolean isCompleted() {
-            if (downloadEntity == null) {
-                return false;
-            }
-            int state = downloadEntity.getState();
-            return Objects.equals(downloadEntity.getUrl(), url)
-                    && state == IEntity.STATE_COMPLETE;
-        }
-
-        @Override
-        public synchronized boolean isProcessing() {
-            if (downloadEntity == null) {
-                return false;
-            }
-            int state = downloadEntity.getState();
-            return Objects.equals(downloadEntity.getUrl(), url)
-                    && (state == IEntity.STATE_WAIT
-                    || state == IEntity.STATE_PRE
-                    || state == IEntity.STATE_POST_PRE
-                    || state == IEntity.STATE_RUNNING);
-        }
-
-        @Override
-        public synchronized void addCallback(Callback callback) {
-            if (callbackList.contains(callback)) {
-                return;
-            }
-            callbackList.add(callback);
-        }
-
-        @Override
-        public synchronized void removeCallback(Callback callback) {
-            if (!callbackList.contains(callback)) {
-                return;
-            }
-            callbackList.remove(callback);
-        }
-
-        @Override
-        public void onWait(DownloadTask task) {
-        }
-
-        @Override
-        public synchronized void onPre(DownloadTask task) {
-            downloadEntity = task.getDownloadEntity();
-
-        }
-
-        @Override
-        public void onTaskPre(DownloadTask task) {
-            Log.v("aa", "a");
-        }
-
-        @Override
-        public synchronized void onTaskResume(DownloadTask task) {
-            for (Callback callback : callbackList) {
-                callback.onStart();
-            }
-        }
-
-        @Override
-        public synchronized void onTaskStart(DownloadTask task) {
-            for (Callback callback : callbackList) {
-                callback.onStart();
-            }
-        }
-
-        @Override
-        public synchronized void onTaskStop(DownloadTask task) {
-            downloadEntity = task.getDownloadEntity();
-        }
-
-        @Override
-        public synchronized void onTaskCancel(DownloadTask task) {
-            downloadEntity = task.getDownloadEntity();
-            if (restart) {
-                FileUtils.makeDirectory(path);
-                taskId = downloadReceiver
-                        .load(url)
-                        .setFilePath(path)
-                        .ignoreCheckPermissions()
-                        .ignoreFilePathOccupy()
-                        .create();
-                downloadEntity = downloadReceiver.getDownloadEntity(taskId);
-                restart = false;
-            }
-
-        }
-
-        @Override
-        public synchronized void onTaskFail(DownloadTask task, Exception e) {
-            for (Callback callback : callbackList) {
-                callback.onFail(e);
-            }
-        }
-
-        @Override
-        public synchronized void onTaskComplete(DownloadTask task) {
-
-            for (Callback callback : callbackList) {
-                callback.onComplete(task.getFilePath());
-            }
-        }
-
-        @Override
-        public synchronized void onTaskRunning(DownloadTask task) {
-            float percent = task.getPercent() / 100.0f;
-            for (Callback callback : callbackList) {
-                callback.onProcess(percent);
-            }
-        }
-
-        @Override
-        public void onNoSupportBreakPoint(DownloadTask task) {
-
-
-        }
-    }
-}

+ 1 - 0
aria-source/.gitignore

@@ -0,0 +1 @@
+/build

+ 30 - 0
aria-source/build.gradle

@@ -0,0 +1,30 @@
+plugins {
+    id 'com.android.library'
+}
+
+android {
+    compileSdkVersion 30
+
+    defaultConfig {
+        minSdkVersion 21
+        targetSdkVersion 30
+        consumerProguardFiles "consumer-rules.pro"
+    }
+
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+        }
+    }
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
+}
+
+dependencies {
+    implementation project(":local-source")
+    compileOnly project(":core")
+    implementation 'me.laoyuyu.aria:core:3.8.16'
+}

+ 0 - 0
aria-source/consumer-rules.pro


+ 21 - 0
aria-source/proguard-rules.pro

@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# 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 *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile

+ 26 - 0
aria-source/src/androidTest/java/com/norman/webviewup/lib/ExampleInstrumentedTest.java

@@ -0,0 +1,26 @@
+package com.norman.webviewup.lib;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+    @Test
+    public void useAppContext() {
+        // Context of the app under test.
+        Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+        assertEquals("com.norman.webviewup.lib.test", appContext.getPackageName());
+    }
+}

+ 4 - 0
aria-source/src/main/AndroidManifest.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest package="com.norman.webviewup.lib.source">
+
+</manifest>

+ 157 - 0
aria-source/src/main/java/com/norman/webviewup/lib/source/aira/WebViewUrlSource.java

@@ -0,0 +1,157 @@
+package com.norman.webviewup.lib.source.aira;
+
+import android.content.Context;
+import android.text.TextUtils;
+
+import com.arialyy.aria.core.Aria;
+import com.arialyy.aria.core.download.DownloadEntity;
+import com.arialyy.aria.core.download.DownloadReceiver;
+import com.arialyy.aria.core.download.DownloadTaskListener;
+import com.arialyy.aria.core.inf.IEntity;
+import com.arialyy.aria.core.task.DownloadTask;
+import com.norman.webviewup.lib.UpgradeDirectory;
+import com.norman.webviewup.lib.download.DownloadAction;
+import com.norman.webviewup.lib.source.WebViewPathSource;
+import com.norman.webviewup.lib.util.FileUtils;
+import com.norman.webviewup.lib.util.Md5Utils;
+
+import java.io.File;
+import java.util.List;
+import java.util.Objects;
+
+public class WebViewUrlSource extends WebViewPathSource implements DownloadTaskListener {
+
+    private final String url;
+
+    private final String path;
+
+    private final DownloadReceiver downloadReceiver;
+
+    private long taskId;
+
+    private DownloadEntity downloadEntity;
+
+    public WebViewUrlSource(Context context,String url) {
+        this(context,url,null);
+    }
+
+    public WebViewUrlSource(Context context,String url, String path) {
+        this.url = url;
+        if (TextUtils.isEmpty(path)  && !TextUtils.isEmpty(url)) {
+            File apkFile = UpgradeDirectory.getApkFile(context, Md5Utils.getMd5(url));
+            this.path = apkFile.getPath();
+        } else {
+            this.path = path;
+        }
+        this.downloadReceiver = Aria.download(this);
+        this.downloadReceiver.register();
+
+        List<DownloadEntity> downloadEntityList = this.downloadReceiver.getDownloadEntity(url);
+        if (downloadEntityList != null) {
+            for (DownloadEntity entity : downloadEntityList) {
+                if (Objects.equals(entity.getFilePath(), path)) {
+                    downloadEntity = entity;
+                    break;
+                }
+            }
+        }
+        if (downloadEntity != null) {
+            taskId = downloadEntity.getId();
+        }
+    }
+
+
+    @Override
+    protected void onPrepare() {
+        if (downloadEntity == null ||
+                downloadEntity.getState() == IEntity.STATE_CANCEL) {
+            FileUtils.makeDirectory(path);
+            taskId = downloadReceiver
+                    .load(url)
+                    .setFilePath(path)
+                    .ignoreCheckPermissions()
+                    .ignoreFilePathOccupy()
+                    .create();
+            downloadEntity = downloadReceiver.getDownloadEntity(taskId);
+        } else if (downloadEntity.getState() == IEntity.STATE_WAIT
+                || downloadEntity.getState() == IEntity.STATE_OTHER
+                || downloadEntity.getState() == IEntity.STATE_FAIL
+                || downloadEntity.getState() == IEntity.STATE_STOP) {
+            downloadReceiver
+                    .load(taskId)
+                    .ignoreCheckPermissions()
+                    .resume();
+        } else if (downloadEntity.getState() == IEntity.STATE_COMPLETE) {
+            success();
+        }
+    }
+    
+
+    @Override
+    public void onWait(DownloadTask task) {
+
+    }
+
+    @Override
+    public void onPre(DownloadTask task) {
+        downloadEntity = task.getDownloadEntity();
+
+    }
+
+    @Override
+    public void onTaskPre(DownloadTask task) {
+
+    }
+
+    @Override
+    public void onTaskResume(DownloadTask task) {
+
+    }
+
+    @Override
+    public void onTaskStart(DownloadTask task) {
+
+    }
+
+    @Override
+    public void onTaskStop(DownloadTask task) {
+        downloadEntity = task.getDownloadEntity();
+    }
+
+    @Override
+    public void onTaskCancel(DownloadTask task) {
+        downloadEntity = task.getDownloadEntity();
+    }
+
+    @Override
+    public void onTaskFail(DownloadTask task, Exception e) {
+        for (DownloadAction.Callback callback : callbackList) {
+            callback.onFail(e);
+        }
+    }
+
+    @Override
+    public void onTaskComplete(DownloadTask task) {
+        for (DownloadAction.Callback callback : callbackList) {
+            callback.onComplete(task.getFilePath());
+        }
+    }
+
+    @Override
+    public void onTaskRunning(DownloadTask task) {
+        float percent = task.getPercent() / 100.0f;
+        for (DownloadAction.Callback callback : callbackList) {
+            callback.onProcess(percent);
+        }
+    }
+
+    @Override
+    public void onNoSupportBreakPoint(DownloadTask task) {
+
+    }
+
+    @Override
+    public String getPath() {
+        return path;
+    }
+}

+ 17 - 0
aria-source/src/test/java/com/norman/webviewup/lib/ExampleUnitTest.java

@@ -0,0 +1,17 @@
+package com.norman.webviewup.lib;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+public class ExampleUnitTest {
+    @Test
+    public void addition_isCorrect() {
+        assertEquals(4, 2 + 2);
+    }
+}

+ 1 - 0
core/.gitignore

@@ -0,0 +1 @@
+/build

+ 29 - 0
core/build.gradle

@@ -0,0 +1,29 @@
+plugins {
+    id 'com.android.library'
+}
+
+android {
+    compileSdkVersion 30
+
+    defaultConfig {
+        minSdkVersion 21
+        targetSdkVersion 30
+        consumerProguardFiles "consumer-rules.pro"
+    }
+
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+        }
+    }
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
+}
+
+dependencies {
+    implementation 'androidx.appcompat:appcompat:1.6.1'
+    implementation project(':local-source')
+}

+ 0 - 0
core/consumer-rules.pro


+ 21 - 0
core/proguard-rules.pro

@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# 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 *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile

+ 26 - 0
core/src/androidTest/java/com/norman/webviewup/lib/ExampleInstrumentedTest.java

@@ -0,0 +1,26 @@
+package com.norman.webviewup.lib;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+    @Test
+    public void useAppContext() {
+        // Context of the app under test.
+        Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+        assertEquals("com.norman.webviewup.lib.test", appContext.getPackageName());
+    }
+}

+ 4 - 0
core/src/main/AndroidManifest.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest package="com.norman.webviewup.lib">
+
+</manifest>

+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/UpgradeCallback.java → core/src/main/java/com/norman/webviewup/lib/UpgradeCallback.java


+ 38 - 0
core/src/main/java/com/norman/webviewup/lib/UpgradeDirectory.java

@@ -0,0 +1,38 @@
+package com.norman.webviewup.lib;
+
+import android.content.Context;
+
+import com.norman.webviewup.lib.util.FileUtils;
+import com.norman.webviewup.lib.util.Md5Utils;
+
+import java.io.File;
+
+public class UpgradeDirectory {
+
+    private static final String UPGRADE_DIRECTORY_NAME = "WebViewUpgrade";
+
+    private static final String APK_DIRECTORY_NAME = "apk";
+
+    public static File getRoot(Context context) {
+        return new File(context.getFilesDir(),
+                UPGRADE_DIRECTORY_NAME);
+    }
+
+
+    public static File createDirectory(Context context, String child) {
+        File childDir = new File(getRoot(context), child);
+        FileUtils.makeDirectory(childDir);
+        return childDir;
+    }
+
+    public static File getApkDirectory(Context context) {
+        return createDirectory(context, APK_DIRECTORY_NAME);
+    }
+
+    public static File getApkFile(Context context, String name) {
+        File apkFile = new File(getApkDirectory(context), name);
+        FileUtils.createFile(apkFile);
+        return apkFile;
+    }
+
+}

+ 0 - 2
app/src/main/java/com/norman/webviewup/lib/UpgradeOptions.java → core/src/main/java/com/norman/webviewup/lib/UpgradeOptions.java

@@ -15,13 +15,11 @@ public class UpgradeOptions {
 
 
     private UpgradeOptions(UpgradeOptions.Builder builder) {
-        this.downloaderSink = builder.downloaderSink;
         this.context = builder.context;
         this.url = builder.url;
     }
 
     public static class Builder {
-        DownloadSink downloaderSink;
         Application context;
         String url;
 

+ 7 - 0
app/src/main/java/com/norman/webviewup/lib/WebViewUpgrade.java → core/src/main/java/com/norman/webviewup/lib/WebViewUpgrade.java

@@ -22,6 +22,7 @@ import com.norman.webviewup.lib.reflect.RuntimeAccess;
 import com.norman.webviewup.lib.service.interfaces.IServiceManager;
 import com.norman.webviewup.lib.service.interfaces.IWebViewFactory;
 import com.norman.webviewup.lib.service.interfaces.IWebViewUpdateService;
+import com.norman.webviewup.lib.source.WebViewFileSource;
 import com.norman.webviewup.lib.util.ApkUtils;
 import com.norman.webviewup.lib.util.FileUtils;
 import com.norman.webviewup.lib.util.Md5Utils;
@@ -440,4 +441,10 @@ public class WebViewUpgrade {
         return null;
     }
 
+    public  class FileCache {
+
+        public  static File getRootDirectory(Context context){
+            return context.getFilesDir()+""
+        }
+    }
 }

+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/download/DownloadAction.java → core/src/main/java/com/norman/webviewup/lib/download/DownloadAction.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/download/DownloadSink.java → core/src/main/java/com/norman/webviewup/lib/download/DownloadSink.java


+ 0 - 1
app/src/main/java/com/norman/webviewup/lib/hook/PackageManagerHook.java → core/src/main/java/com/norman/webviewup/lib/hook/PackageManagerHook.java

@@ -3,7 +3,6 @@ package com.norman.webviewup.lib.hook;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.ContextWrapper;
-import android.content.Intent;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.os.Build;

+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/hook/WebViewUpdateServiceHook.java → core/src/main/java/com/norman/webviewup/lib/hook/WebViewUpdateServiceHook.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/reflect/ReflectConstructor.java → core/src/main/java/com/norman/webviewup/lib/reflect/ReflectConstructor.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/reflect/ReflectException.java → core/src/main/java/com/norman/webviewup/lib/reflect/ReflectException.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/reflect/ReflectField.java → core/src/main/java/com/norman/webviewup/lib/reflect/ReflectField.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/reflect/ReflectMethod.java → core/src/main/java/com/norman/webviewup/lib/reflect/ReflectMethod.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/reflect/ReflectProxy.java → core/src/main/java/com/norman/webviewup/lib/reflect/ReflectProxy.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/reflect/RuntimeAccess.java → core/src/main/java/com/norman/webviewup/lib/reflect/RuntimeAccess.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/reflect/RuntimeProxy.java → core/src/main/java/com/norman/webviewup/lib/reflect/RuntimeProxy.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/reflect/annotation/ClassName.java → core/src/main/java/com/norman/webviewup/lib/reflect/annotation/ClassName.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/reflect/annotation/ClassType.java → core/src/main/java/com/norman/webviewup/lib/reflect/annotation/ClassType.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/reflect/annotation/Constructor.java → core/src/main/java/com/norman/webviewup/lib/reflect/annotation/Constructor.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/reflect/annotation/Field.java → core/src/main/java/com/norman/webviewup/lib/reflect/annotation/Field.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/reflect/annotation/Method.java → core/src/main/java/com/norman/webviewup/lib/reflect/annotation/Method.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/reflect/annotation/ParameterName.java → core/src/main/java/com/norman/webviewup/lib/reflect/annotation/ParameterName.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/reflect/annotation/ParameterType.java → core/src/main/java/com/norman/webviewup/lib/reflect/annotation/ParameterType.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/service/binder/BinderHook.java → core/src/main/java/com/norman/webviewup/lib/service/binder/BinderHook.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/service/binder/ProxyBinder.java → core/src/main/java/com/norman/webviewup/lib/service/binder/ProxyBinder.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/service/interfaces/IActivityThread.java → core/src/main/java/com/norman/webviewup/lib/service/interfaces/IActivityThread.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/service/interfaces/IApplicationInfo.java → core/src/main/java/com/norman/webviewup/lib/service/interfaces/IApplicationInfo.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/service/interfaces/IContextImpl.java → core/src/main/java/com/norman/webviewup/lib/service/interfaces/IContextImpl.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/service/interfaces/IPackageManager.java → core/src/main/java/com/norman/webviewup/lib/service/interfaces/IPackageManager.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/service/interfaces/IServiceManager.java → core/src/main/java/com/norman/webviewup/lib/service/interfaces/IServiceManager.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/service/interfaces/IVMRuntime.java → core/src/main/java/com/norman/webviewup/lib/service/interfaces/IVMRuntime.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/service/interfaces/IWebViewFactory.java → core/src/main/java/com/norman/webviewup/lib/service/interfaces/IWebViewFactory.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/service/interfaces/IWebViewProviderResponse.java → core/src/main/java/com/norman/webviewup/lib/service/interfaces/IWebViewProviderResponse.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/service/interfaces/IWebViewUpdateService.java → core/src/main/java/com/norman/webviewup/lib/service/interfaces/IWebViewUpdateService.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/service/proxy/PackageManagerProxy.java → core/src/main/java/com/norman/webviewup/lib/service/proxy/PackageManagerProxy.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/service/proxy/WebViewUpdateServiceProxy.java → core/src/main/java/com/norman/webviewup/lib/service/proxy/WebViewUpdateServiceProxy.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/util/ApkUtils.java → core/src/main/java/com/norman/webviewup/lib/util/ApkUtils.java


+ 41 - 0
app/src/main/java/com/norman/webviewup/lib/util/FileUtils.java → core/src/main/java/com/norman/webviewup/lib/util/FileUtils.java

@@ -1,5 +1,7 @@
 package com.norman.webviewup.lib.util;
 
+import android.text.TextUtils;
+
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
 import java.io.File;
@@ -12,6 +14,10 @@ import java.io.OutputStream;
 
 public class FileUtils {
 
+    public static void delete(String path) {
+        delete(new File(path));
+    }
+
 
     public static void delete(File file) {
         if (file.isFile()) {
@@ -160,4 +166,39 @@ public class FileUtils {
 
         }
     }
+
+    public static boolean existDirectory(String path) {
+        if (TextUtils.isEmpty(path)) {
+            return false;
+        }
+        File file = new File(path);
+        return file.isDirectory() && file.exists();
+    }
+
+    public static boolean existFile(String path) {
+        if (TextUtils.isEmpty(path)) {
+            return false;
+        }
+        File file = new File(path);
+        return file.isFile() && file.exists();
+    }
+
+    public static boolean isNotEmptyFile(String path) {
+        if (TextUtils.isEmpty(path)) {
+            return false;
+        }
+        File file = new File(path);
+        return file.isFile() && file.exists() && file.length() != 0;
+    }
+
+    public static boolean createFile(File file){
+        if (!file.exists()){
+            try {
+               return file.createNewFile();
+            } catch (IOException ignore) {
+                return false;
+            }
+        }
+        return true;
+    }
 }

+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/util/Md5Utils.java → core/src/main/java/com/norman/webviewup/lib/util/Md5Utils.java


+ 0 - 0
app/src/main/java/com/norman/webviewup/lib/util/ProcessUtils.java → core/src/main/java/com/norman/webviewup/lib/util/ProcessUtils.java


+ 17 - 0
core/src/test/java/com/norman/webviewup/lib/ExampleUnitTest.java

@@ -0,0 +1,17 @@
+package com.norman.webviewup.lib;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+public class ExampleUnitTest {
+    @Test
+    public void addition_isCorrect() {
+        assertEquals(4, 2 + 2);
+    }
+}

BIN
local-source/.DS_Store


+ 1 - 0
local-source/.gitignore

@@ -0,0 +1 @@
+/build

+ 30 - 0
local-source/build.gradle

@@ -0,0 +1,30 @@
+plugins {
+    id 'com.android.library'
+}
+
+android {
+    compileSdkVersion 30
+
+    defaultConfig {
+        minSdkVersion 21
+        targetSdkVersion 30
+        consumerProguardFiles "consumer-rules.pro"
+    }
+
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+        }
+    }
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
+}
+
+dependencies {
+
+    implementation 'androidx.appcompat:appcompat:1.6.1'
+    compileOnly project(":core")
+}

+ 0 - 0
local-source/consumer-rules.pro


+ 21 - 0
local-source/proguard-rules.pro

@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# 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 *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile

+ 4 - 0
local-source/src/main/AndroidManifest.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest package="com.norman.webviewup.lib.source">
+
+</manifest>

+ 91 - 0
local-source/src/main/java/com/norman/webviewup/lib/source/WebViewAssetSource.java

@@ -0,0 +1,91 @@
+package com.norman.webviewup.lib.source;
+
+import android.content.Context;
+import android.content.res.AssetFileDescriptor;
+import android.content.res.AssetManager;
+import android.text.TextUtils;
+
+import com.norman.webviewup.lib.UpgradeDirectory;
+import com.norman.webviewup.lib.util.FileUtils;
+import com.norman.webviewup.lib.util.Md5Utils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.channels.FileChannel;
+
+public class WebViewAssetSource extends WebViewPathSource {
+
+    private final String assetName;
+
+    private final Context context;
+
+    private final String path;
+
+    public WebViewAssetSource(Context context, String assetName, String path) {
+        this.assetName = assetName;
+        this.context = context == null ? null : context.getApplicationContext();
+        if (TextUtils.isEmpty(path) && context != null && !TextUtils.isEmpty(assetName)) {
+            File apkFile = UpgradeDirectory.getApkFile(context, Md5Utils.getMd5(assetName));
+            this.path = apkFile.getPath();
+        } else {
+            this.path = path;
+        }
+    }
+
+    public WebViewAssetSource(Context context, String assetName) {
+        this(context, assetName, null);
+    }
+
+    @Override
+    public String getPath() {
+        return path;
+    }
+
+    @Override
+    protected void onPrepare() {
+        if (FileUtils.isNotEmptyFile(path)) {
+            success();
+        } else {
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    FileOutputStream outputStream = null;
+                    FileInputStream inputStream = null;
+                    try {
+                        outputStream = new FileOutputStream(path);
+                        FileChannel dstChannel = outputStream.getChannel();
+                        AssetManager assetManager = context.getAssets();
+                        AssetFileDescriptor assetFileDescriptor = assetManager.openFd(assetName);
+                        inputStream = assetFileDescriptor.createInputStream();
+                        FileChannel fileChannel = inputStream.getChannel();
+                        long startOffset = assetFileDescriptor.getStartOffset();
+                        long declaredLength = assetFileDescriptor.getDeclaredLength();
+                        fileChannel.transferTo(startOffset, declaredLength, dstChannel);
+
+                    } catch (Throwable e) {
+                        FileUtils.delete(path);
+                        throw new RuntimeException(e);
+                    } finally {
+                        if (outputStream != null) {
+                            try {
+                                outputStream.close();
+                            } catch (IOException ignore) {
+
+                            }
+                        }
+                        if (inputStream != null) {
+                            try {
+                                inputStream.close();
+                            } catch (IOException ignore) {
+
+                            }
+                        }
+                    }
+
+                }
+            }).start();
+        }
+    }
+}

+ 33 - 0
local-source/src/main/java/com/norman/webviewup/lib/source/WebViewFileSource.java

@@ -0,0 +1,33 @@
+package com.norman.webviewup.lib.source;
+
+
+import com.norman.webviewup.lib.util.FileUtils;
+
+import java.io.File;
+import java.io.IOException;
+
+public class WebViewFileSource extends WebViewPathSource {
+    private final String path;
+
+    public WebViewFileSource(String path) {
+        this.path = path;
+    }
+
+    public WebViewFileSource(File file) {
+        this.path = file != null ? file.getPath() : null;
+    }
+
+    @Override
+    public synchronized String getPath() {
+        return path;
+    }
+
+    @Override
+    protected void onPrepare() {
+        if (FileUtils.isNotEmptyFile(path)) {
+            success();
+        } else {
+            error(new IOException("file not exist, path is " + path));
+        }
+    }
+}

+ 39 - 0
local-source/src/main/java/com/norman/webviewup/lib/source/WebViewPackageSource.java

@@ -0,0 +1,39 @@
+package com.norman.webviewup.lib.source;
+
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+
+public class WebViewPackageSource extends WebViewSource {
+
+    private final String packageName;
+    private final Context context;
+
+    private int flags;
+
+    private PackageInfo packageInfo;
+
+    public WebViewPackageSource(Context context, String packageName) {
+        this.context = context == null ? null : context.getApplicationContext();
+        this.packageName = packageName;
+    }
+
+
+    public synchronized void setFlags(int flags) {
+        this.flags = flags;
+    }
+
+
+    public synchronized PackageInfo getPackageInfo() {
+        return packageInfo;
+    }
+
+    @Override
+    protected void onPrepare() {
+        try {
+            packageInfo = context.getPackageManager().getPackageInfo(packageName, flags);
+        } catch (PackageManager.NameNotFoundException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}

+ 6 - 0
local-source/src/main/java/com/norman/webviewup/lib/source/WebViewPathSource.java

@@ -0,0 +1,6 @@
+package com.norman.webviewup.lib.source;
+
+public abstract class WebViewPathSource extends WebViewSource {
+
+    public abstract String getPath();
+}

+ 72 - 0
local-source/src/main/java/com/norman/webviewup/lib/source/WebViewSource.java

@@ -0,0 +1,72 @@
+package com.norman.webviewup.lib.source;
+
+import androidx.annotation.NonNull;
+
+import java.util.HashSet;
+
+public abstract class WebViewSource {
+
+    private final HashSet<OnPrepareCallback> prepareCallbackSet = new HashSet<>();
+
+    private boolean success;
+
+    private boolean running;
+
+    private Throwable errorThrowable;
+
+
+
+    public synchronized final boolean isSuccess() {
+        return success;
+    }
+
+    public synchronized void prepare(OnPrepareCallback prepareCallback) {
+        if (success) {
+            prepareCallback.onPrepareSuccess(this);
+        } else if (errorThrowable != null) {
+            prepareCallback.onPrepareError(this, errorThrowable);
+        } else {
+            prepareCallbackSet.add(prepareCallback);
+            if (!running) {
+                running = true;
+                try {
+                    onPrepare();
+                } catch (Throwable throwable) {
+                    error(throwable);
+                }
+            }
+        }
+    }
+
+    protected abstract void onPrepare();
+
+    protected synchronized final void success() {
+        if (success || errorThrowable != null) {
+            return;
+        }
+        success = true;
+        for (OnPrepareCallback prepareCallback : prepareCallbackSet) {
+            prepareCallback.onPrepareSuccess(this);
+        }
+        prepareCallbackSet.clear();
+    }
+
+    protected synchronized final void error(@NonNull Throwable throwable) {
+        if (success || errorThrowable != null) {
+            return;
+        }
+        errorThrowable = throwable;
+        for (OnPrepareCallback prepareCallback : prepareCallbackSet) {
+            prepareCallback.onPrepareError(this, throwable);
+        }
+        prepareCallbackSet.clear();
+    }
+
+
+    public interface OnPrepareCallback {
+
+        void onPrepareSuccess(WebViewSource webViewSource);
+
+        void onPrepareError(WebViewSource webViewSource, Throwable throwable);
+    }
+}

+ 17 - 0
local-source/src/test/java/com/norman/webviewup/lib/ExampleUnitTest.java

@@ -0,0 +1,17 @@
+package com.norman.webviewup.lib;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+public class ExampleUnitTest {
+    @Test
+    public void addition_isCorrect() {
+        assertEquals(4, 2 + 2);
+    }
+}

+ 3 - 0
settings.gradle

@@ -1 +1,4 @@
 include ':app'
+include ':core'
+include ':local-source'
+include ':aria-source'