From e8dcd3005bd7676fb3d847cdcd401efb93c99497 Mon Sep 17 00:00:00 2001 From: "Guo,Feng(RIM)" Date: Fri, 6 Jul 2018 17:58:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=8A=A8=E6=80=81=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E7=BC=96=E8=AF=91=E5=93=AA=E4=BA=9B=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=EF=BC=8C=E4=BB=A5=E5=8F=8A=E6=A8=A1=E5=9D=97=E5=8F=AF=E4=BB=A5?= =?UTF-8?q?=E5=8D=95=E7=8B=AC=E7=BC=96=E8=AF=91=E4=B8=BA=E5=8F=AF=E8=BF=90?= =?UTF-8?q?=E8=A1=8C=20app?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 6 +- config.gradle | 100 ++++++++++++++++++ gradle.properties | 4 + .../com/spinytech/macore/MaApplication.java | 8 +- .../router/WideRouterApplicationLogic.java | 2 +- .../router/WideRouterConnectService.java | 2 +- maindemo/build.gradle | 24 ++++- .../com/spinytech/maindemo/MyApplication.java | 56 +++++++--- musicdemo/app/AndroidManifest.xml | 21 ++++ .../musicdemo/MusicDemoActivity.java | 16 +++ musicdemo/app/res/layout/music_layout.xml | 6 ++ musicdemo/build.gradle | 32 +++++- picdemo/build.gradle | 29 ++++- picdemo/src/main/app/AndroidManifest.xml | 17 +++ .../spinytech/picdemo/PicDemoActivity.java | 69 ++++++++++++ settings.gradle | 17 ++- webdemo/build.gradle | 28 ++++- webdemo/src/main/app/AndroidManifest.xml | 17 +++ .../spinytech/webdemo/WebDemoActivity.java | 56 ++++++++++ .../com/spinytech/webdemo/WebActivity.java | 6 +- 20 files changed, 484 insertions(+), 32 deletions(-) create mode 100644 config.gradle create mode 100644 musicdemo/app/AndroidManifest.xml create mode 100644 musicdemo/app/java/com/spinytech/musicdemo/MusicDemoActivity.java create mode 100644 musicdemo/app/res/layout/music_layout.xml create mode 100644 picdemo/src/main/app/AndroidManifest.xml create mode 100644 picdemo/src/main/app/java/com/spinytech/picdemo/PicDemoActivity.java create mode 100644 webdemo/src/main/app/AndroidManifest.xml create mode 100644 webdemo/src/main/app/java/com/spinytech/webdemo/WebDemoActivity.java diff --git a/build.gradle b/build.gradle index 3438c38..8473f5b 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. - +apply from: "config.gradle" buildscript { repositories { jcenter() @@ -14,6 +14,10 @@ buildscript { } allprojects { + configurations.all { + // don't cache changing modules at all + resolutionStrategy.cacheChangingModulesFor 0, 'seconds' + } repositories { jcenter() } diff --git a/config.gradle b/config.gradle new file mode 100644 index 0000000..fd691f9 --- /dev/null +++ b/config.gradle @@ -0,0 +1,100 @@ +/*全局配置信息及第三方依赖统一管理*/ +ext { + + appModuleMusicDemo = project.hasProperty("appModuleMusicDemo") ? project.property("appModuleMusicDemo").equals("1").toString() : false + appModulePicDemo = project.hasProperty("appModulePicDemo") ? project.property("appModulePicDemo").equals("1").toString() : false + appModuleWebDemo = project.hasProperty("appModuleWebDemo") ? project.property("appModuleWebDemo").equals("1").toString() : false + + + android = [compileSdkVersion : 27, + buildToolsVersion : '27.0.3', + minSdkVersion : 17, + targetSdkVersion : 23, + versionCode : 1, + versionName : "1.0.0", + applicationId : "com.example.tome.framedemomo2", + + androidSupportSdkVersion: "27.0.2" + + ] + + dependencies = ["appcompat_v7" : "com.android.support:appcompat-v7:${android["androidSupportSdkVersion"]}", + "constraint_layout" : 'com.android.support.constraint:constraint-layout:1.1.1', + "runner" : 'com.android.support.test:runner:1.0.1', + "espresso_core" : 'com.android.support.test.espresso:espresso-core:3.0.1', + "junit" : 'junit:junit:4.12', + "support_annotations" : 'com.android.support:support-annotations:24.0.0', + "design" : "com.android.support:design:${android["androidSupportSdkVersion"]}", + "support-v4" : "com.android.support:support-v4:${android["androidSupportSdkVersion"]}", + "cardview-v7" : "com.android.support:cardview-v7:${android["androidSupportSdkVersion"]}", + "recyclerview-v7" : "com.android.support:recyclerview-v7:${android["androidSupportSdkVersion"]}", + + //方法数超过65535解决方法64K MultiDex分包方法 + "multidex" : 'com.android.support:multidex:1.0.2', + + //路由 + "arouter_api" : 'com.alibaba:arouter-api:1.2.4', + "arouter_compiler" : 'com.alibaba:arouter-compiler:1.1.4', + "arouter_annotation" : 'com.alibaba:arouter-annotation:1.0.4', + + //黄油刀 + "butterknife_compiler" : 'com.jakewharton:butterknife-compiler:8.4.0', + "butterknife" : 'com.jakewharton:butterknife:8.4.0', + + //网络 + //retrofit2包含okhttp + //"okhttp3" : 'com.squareup.okhttp3:okhttp:3.9.0', + "retrofit2" : 'com.squareup.retrofit2:retrofit:2.3.0', + "converter-gson" : 'com.squareup.retrofit2:converter-gson:2.3.0', + "adapter-rxjava2" : 'com.squareup.retrofit2:adapter-rxjava2:2.3.0', + "rxjava2:rxandroid" : 'io.reactivex.rxjava2:rxandroid:2.0.1', + "rxjava2" : 'io.reactivex.rxjava2:rxjava:2.1.5', + //日志拦截器 + "logging-interceptor" : 'com.squareup.okhttp3:logging-interceptor:3.4.1', + //暂时没用上 + "rxbinding2" : 'com.jakewharton.rxbinding2:rxbinding:2.1.0', + //日志 + "logger" : 'com.orhanobut:logger:2.1.1', + //图片 + "glide" : 'com.github.bumptech.glide:glide:4.5.0', + "glide:okhttp3" : 'com.github.bumptech.glide:okhttp3-integration:4.5.0', + //图片选择器 + "PictureSelector" : 'com.github.LuckSiege.PictureSelector:picture_library:v2.2.3', + //图片缩放 + "photoview" : 'com.github.chrisbanes.photoview:library:1.2.4', + //时间,地址,条件选择器 + "pickerView" : 'com.contrarywind:Android-PickerView:3.2.7', + //SmartRefreshLayout + "smartRefreshLayout" : 'com.scwang.smartrefresh:SmartRefreshLayout:1.0.5.1', + "SmartRefreshHeader" : 'com.scwang.smartrefresh:SmartRefreshHeader:1.0.5.1', + //banner + "banner" : 'com.youth.banner:banner:1.4.10', + //eventbus + "eventbus" : 'org.greenrobot:eventbus:3.0.0', + //baseRecyclerViewAdapterHelper + "baseRecyclerViewAdapterHelper" : 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.22', + //Bugly集成 + "bugly" : 'com.tencent.bugly:crashreport_upgrade:latest.release', + //仿ios进度条 + // "kprogresshud" : 'com.kaopiz:kprogresshud:1.1.0', + //6.0权限管理 + "permissionsdispatcher" : 'com.github.hotchemi:permissionsdispatcher:3.0.1', + "permissionsdispatcher_processor": 'com.github.hotchemi:permissionsdispatcher-processor:3.0.1', + //dagger 暂时没用 + "dagger" : 'com.google.dagger:dagger:2.0.2', + "dagger-compiler" : 'com.google.dagger:dagger-compiler:2.0.2', + "javax-annotation" : 'org.glassfish:javax.annotation:10.0-b28', + //greendao + "greendao" : 'org.greenrobot:greendao:3.2.2', + //Android屏幕适配 + "autolayout" : 'com.zhy:autolayout:1.4.5', + //安卓调试神器-Stetho + "stetho" : 'com.facebook.stetho:stetho:1.5.0', + "stetho-okhttp3" : 'com.facebook.stetho:stetho-okhttp3:1.5.0', + // 仿ios弹出对话窗体 + "alertview" : 'com.bigkoo:alertview:1.0.3', + //bugly sdk + "tencent-bugly" : 'com.tencent.bugly:crashreport_upgrade:latest.release', + //节操播放器 + "jiecao" : 'fm.jiecao:jiecaovideoplayer:5.7',] +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index aac7c9b..928e0d5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,3 +15,7 @@ org.gradle.jvmargs=-Xmx1536m # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true +// 某个模块是否 app 0否 1是 +appModulePicDemo = 1 +appModuleMusicDemo = 1 +appModuleWebDemo = 1 \ No newline at end of file diff --git a/macore/src/main/java/com/spinytech/macore/MaApplication.java b/macore/src/main/java/com/spinytech/macore/MaApplication.java index c6beb90..755eb55 100644 --- a/macore/src/main/java/com/spinytech/macore/MaApplication.java +++ b/macore/src/main/java/com/spinytech/macore/MaApplication.java @@ -32,12 +32,14 @@ public abstract class MaApplication extends Application { @CallSuper @Override public void onCreate() { + // wait for debugger for muti process + // android.os.Debug.waitForDebugger(); super.onCreate(); sInstance = this; Logger.d(TAG,"Application onCreate start: "+System.currentTimeMillis()); init(); startWideRouter(); - initializeLogic(); + registerAllApplicationLogic(); dispatchLogic(); instantiateLogic(); @@ -65,9 +67,9 @@ protected void startWideRouter() { } } - public abstract void initializeAllProcessRouter(); + public abstract void registerAllProcessRouter(); - protected abstract void initializeLogic(); + protected abstract void registerAllApplicationLogic(); public abstract boolean needMultipleProcess(); diff --git a/macore/src/main/java/com/spinytech/macore/router/WideRouterApplicationLogic.java b/macore/src/main/java/com/spinytech/macore/router/WideRouterApplicationLogic.java index d2bcc3e..78d94f6 100644 --- a/macore/src/main/java/com/spinytech/macore/router/WideRouterApplicationLogic.java +++ b/macore/src/main/java/com/spinytech/macore/router/WideRouterApplicationLogic.java @@ -15,6 +15,6 @@ public void onCreate() { protected void initRouter() { WideRouter.getInstance(mApplication); - mApplication.initializeAllProcessRouter(); + mApplication.registerAllProcessRouter(); } } diff --git a/macore/src/main/java/com/spinytech/macore/router/WideRouterConnectService.java b/macore/src/main/java/com/spinytech/macore/router/WideRouterConnectService.java index 9a7d24b..d318a04 100644 --- a/macore/src/main/java/com/spinytech/macore/router/WideRouterConnectService.java +++ b/macore/src/main/java/com/spinytech/macore/router/WideRouterConnectService.java @@ -49,7 +49,7 @@ public IBinder onBind(Intent intent) { boolean hasRegistered = WideRouter.getInstance(MaApplication.getMaApplication()).checkLocalRouterHasRegistered(domain); if (!hasRegistered) { Logger.e(TAG, "Bind error: The local router of process " + domain + " is not bidirectional." + - "\nPlease create a Service extend LocalRouterConnectService then register it in AndroidManifest.xml and the initializeAllProcessRouter method of MaApplication." + + "\nPlease create a Service extend LocalRouterConnectService then register it in AndroidManifest.xml and the registerAllProcessRouter method of MaApplication." + "\nFor example:" + "\n" + "\nWideRouter.registerLocalRouter(\"your process name\",XXXConnectService.class);"); diff --git a/maindemo/build.gradle b/maindemo/build.gradle index 550947b..29d2613 100644 --- a/maindemo/build.gradle +++ b/maindemo/build.gradle @@ -1,4 +1,6 @@ + apply plugin: 'com.android.application' +def channel = hasProperty("channel") ? property("channel") : "test" android { compileSdkVersion 24 @@ -10,18 +12,22 @@ android { targetSdkVersion 24 versionCode 1 versionName "1.0" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + // read gradle.properties + buildConfigField "boolean", "channel", project.hasProperty("channel") ? project.property("channel").equals("2").toString() : "false" + } buildTypes { release { + manifestPlaceholders = [ + "channel": "\"$channel\"" + ] minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } - dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { @@ -30,8 +36,16 @@ dependencies { compile 'com.android.support:appcompat-v7:24.2.1' testCompile 'junit:junit:4.12' compile project(':macore') - compile project(':musicdemo') - compile project(':picdemo') - compile project(':webdemo') + + + if (!Boolean.valueOf(rootProject.ext.appModulePicDemo)) { + compile project(':picdemo') + } + if (!Boolean.valueOf(rootProject.ext.appModuleMusicDemo)) { + compile project(':musicdemo') + } + if (!Boolean.valueOf(rootProject.ext.appModuleWebDemo)) { + compile project(':webdemo') + } } diff --git a/maindemo/src/main/java/com/spinytech/maindemo/MyApplication.java b/maindemo/src/main/java/com/spinytech/maindemo/MyApplication.java index 01765cb..d5fbc6c 100644 --- a/maindemo/src/main/java/com/spinytech/maindemo/MyApplication.java +++ b/maindemo/src/main/java/com/spinytech/maindemo/MyApplication.java @@ -1,31 +1,59 @@ package com.spinytech.maindemo; +import android.util.Pair; + import com.spinytech.macore.MaApplication; +import com.spinytech.macore.multiprocess.BaseApplicationLogic; +import com.spinytech.macore.router.LocalRouterConnectService; import com.spinytech.macore.router.WideRouter; -import com.spinytech.musicdemo.MusicApplicationLogic; -import com.spinytech.musicdemo.MusicRouterConnectService; -import com.spinytech.picdemo.PicApplicationLogic; -import com.spinytech.picdemo.PicRouterConnectService; -import com.spinytech.webdemo.WebApplicationLogic; + +import java.util.LinkedList; /** * Created by wanglei on 2016/11/29. */ public class MyApplication extends MaApplication { + public static LinkedList> applicationLogic; + public static LinkedList> allProcessRouter; + + static { + applicationLogic = new LinkedList<>(); + applicationLogic.add(new Pair("com.spinytech.maindemo", "com.spinytech.maindemo.MainApplicationLogic")); + applicationLogic.add(new Pair("com.spinytech.maindemo", "com.spinytech.webdemo.WebApplicationLogic")); + applicationLogic.add(new Pair("com.spinytech.maindemo:music", "com.spinytech.musicdemo.MusicApplicationLogic")); + applicationLogic.add(new Pair("com.spinytech.maindemo:pic", "com.spinytech.picdemo.PicApplicationLogic")); + + + allProcessRouter = new LinkedList<>(); + allProcessRouter.add(new Pair("com.spinytech.maindemo", "com.spinytech.maindemo.MainRouterConnectService")); + allProcessRouter.add(new Pair("com.spinytech.maindemo:music", "com.spinytech.musicdemo.MusicRouterConnectService")); + allProcessRouter.add(new Pair("com.spinytech.maindemo:pic", "com.spinytech.picdemo.PicRouterConnectService")); + + } @Override - public void initializeAllProcessRouter() { - WideRouter.registerLocalRouter("com.spinytech.maindemo",MainRouterConnectService.class); - WideRouter.registerLocalRouter("com.spinytech.maindemo:music",MusicRouterConnectService.class); - WideRouter.registerLocalRouter("com.spinytech.maindemo:pic",PicRouterConnectService.class); + public void registerAllProcessRouter() { + for (Pair processRouter : allProcessRouter) { + try { + Class localRouterClass = (Class) Class.forName(processRouter.second); + WideRouter.registerLocalRouter(processRouter.first,localRouterClass); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } + } @Override - protected void initializeLogic() { - registerApplicationLogic("com.spinytech.maindemo",999, MainApplicationLogic.class); - registerApplicationLogic("com.spinytech.maindemo",998, WebApplicationLogic.class); - registerApplicationLogic("com.spinytech.maindemo:music",999, MusicApplicationLogic.class); - registerApplicationLogic("com.spinytech.maindemo:pic",999, PicApplicationLogic.class); + protected void registerAllApplicationLogic() { + for (Pair processLogic : applicationLogic) { + try { + Class applicationLogicClass = (Class) Class.forName(processLogic.second); + registerApplicationLogic(processLogic.first, 998, applicationLogicClass); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } } @Override diff --git a/musicdemo/app/AndroidManifest.xml b/musicdemo/app/AndroidManifest.xml new file mode 100644 index 0000000..2509c0b --- /dev/null +++ b/musicdemo/app/AndroidManifest.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + diff --git a/musicdemo/app/java/com/spinytech/musicdemo/MusicDemoActivity.java b/musicdemo/app/java/com/spinytech/musicdemo/MusicDemoActivity.java new file mode 100644 index 0000000..dd7838d --- /dev/null +++ b/musicdemo/app/java/com/spinytech/musicdemo/MusicDemoActivity.java @@ -0,0 +1,16 @@ +package com.spinytech.musicdemo; + +import android.app.Activity; +import android.os.Bundle; + +public class MusicDemoActivity extends Activity { + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.music_layout); + } + + +} diff --git a/musicdemo/app/res/layout/music_layout.xml b/musicdemo/app/res/layout/music_layout.xml new file mode 100644 index 0000000..f9504c9 --- /dev/null +++ b/musicdemo/app/res/layout/music_layout.xml @@ -0,0 +1,6 @@ + + + + diff --git a/musicdemo/build.gradle b/musicdemo/build.gradle index 7e56760..8e051f8 100644 --- a/musicdemo/build.gradle +++ b/musicdemo/build.gradle @@ -1,4 +1,9 @@ -apply plugin: 'com.android.library' +appModuleMusicDemo = rootProject.ext.appModuleMusicDemo +if (Boolean.valueOf(appModuleMusicDemo)) { + apply plugin: 'com.android.application' +} else { + apply plugin: 'com.android.library' +} android { compileSdkVersion 24 @@ -9,6 +14,10 @@ android { targetSdkVersion 24 versionCode 1 versionName "1.0" + multiDexEnabled true + ndk { + abiFilters "armeabi", "x86" + } testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" @@ -19,6 +28,26 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + sourceSets{ + main { + if (Boolean.valueOf(appModuleMusicDemo)) { + manifest.srcFile 'app/AndroidManifest.xml' + java.srcDirs = ['src/main/java','app/java'] + resources.srcDirs = ['src/main/resources','app/resources'] + aidl.srcDirs = ['src/main/aidl','app/aidl'] + renderscript.srcDirs = ['src/main/rs','app/rs'] + res.srcDirs = ['src/main/res','app/res'] + assets.srcDirs = ['src/main/assets','app/assets'] + jniLibs.srcDirs = ['src/main/jniLibs','app/jniLibs'] + } else { + manifest.srcFile 'src/main/AndroidManifest.xml' + java { + //排除java/debug文件夹下的所有文件 + exclude '*debug' + } + } + } + } } dependencies { @@ -29,4 +58,5 @@ dependencies { compile 'com.android.support:appcompat-v7:24.2.1' testCompile 'junit:junit:4.12' compile project(':macore') + annotationProcessor rootProject.ext.dependencies["butterknife_compiler"] } diff --git a/picdemo/build.gradle b/picdemo/build.gradle index b2461be..c713780 100644 --- a/picdemo/build.gradle +++ b/picdemo/build.gradle @@ -1,4 +1,10 @@ -apply plugin: 'com.android.library' +appModulePicDemo = rootProject.ext.appModuleWebDemo +if (Boolean.valueOf(appModulePicDemo)) { + apply plugin: 'com.android.application' +} else { + apply plugin: 'com.android.library' +} + android { compileSdkVersion 25 @@ -19,6 +25,27 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + + sourceSets{ + main { + if (Boolean.valueOf(appModulePicDemo)) { + manifest.srcFile 'src/main/app/AndroidManifest.xml' + java.srcDirs = ['src/main/java','src/main/app/java'] + resources.srcDirs = ['src/main/resources','src/main/app/resources'] + aidl.srcDirs = ['src/main/aidl','src/main/app/aidl'] + renderscript.srcDirs = ['src/main/rs','src/main/app/rs'] + res.srcDirs = ['src/main/res','src/main/app/res'] + assets.srcDirs = ['src/main/assets','src/main/app/assets'] + jniLibs.srcDirs = ['src/main/jniLibs','src/main/app/jniLibs'] + } else { + manifest.srcFile 'src/main/AndroidManifest.xml' + java { + //排除java/debug文件夹下的所有文件 + exclude '*debug' + } + } + } + } } dependencies { diff --git a/picdemo/src/main/app/AndroidManifest.xml b/picdemo/src/main/app/AndroidManifest.xml new file mode 100644 index 0000000..efd8e3c --- /dev/null +++ b/picdemo/src/main/app/AndroidManifest.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/picdemo/src/main/app/java/com/spinytech/picdemo/PicDemoActivity.java b/picdemo/src/main/app/java/com/spinytech/picdemo/PicDemoActivity.java new file mode 100644 index 0000000..c288739 --- /dev/null +++ b/picdemo/src/main/app/java/com/spinytech/picdemo/PicDemoActivity.java @@ -0,0 +1,69 @@ +package com.spinytech.picdemo; + +import android.app.Activity; +import android.content.Intent; +import android.content.res.AssetManager; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.os.Bundle; +import android.view.Window; +import android.view.WindowManager; +import android.widget.ImageView; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +public class PicDemoActivity extends Activity { + + private static List oomList = new ArrayList<>(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); + requestWindowFeature(Window.FEATURE_NO_TITLE); + setContentView(R.layout.activity_pic); + showPic(); + } + private void showPic(){ + Intent intent = getIntent(); + if(intent!=null){ + boolean isBig = intent.getBooleanExtra("is_big",false); + if(!isBig){ + ((ImageView)findViewById(R.id.pic_iv)).setImageBitmap(getImageFromAssetsFile("messi.png")); + } + //Do something crazy.... like OOM + else{ + new Thread(new Runnable() { + @Override + public void run() { + for(int i = 0;i<100;i++){ + oomList.add(getImageFromAssetsFile("messi.png")); + } + } + }).start(); + } + } + } + + private Bitmap getImageFromAssetsFile(String fileName) + { + Bitmap image = null; + AssetManager am = getResources().getAssets(); + try + { + InputStream is = am.open(fileName); + image = BitmapFactory.decodeStream(is); + is.close(); + } + catch (IOException e) + { + e.printStackTrace(); + } + + return image; + } +} diff --git a/settings.gradle b/settings.gradle index bc63f52..4e6834f 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,16 @@ -include ':macore', ':musicdemo', ':maindemo', ':picdemo', ':webdemo' +// core +include ':macore' + +// base-lib + +// module +include ':musicdemo' + +// module +include ':picdemo' + +// module +include ':webdemo' + +// app +include ':maindemo' diff --git a/webdemo/build.gradle b/webdemo/build.gradle index b2461be..84981a6 100644 --- a/webdemo/build.gradle +++ b/webdemo/build.gradle @@ -1,4 +1,9 @@ -apply plugin: 'com.android.library' +appModuleWebDemo = rootProject.ext.appModuleWebDemo +if (Boolean.valueOf(appModuleWebDemo)) { + apply plugin: 'com.android.application' +} else { + apply plugin: 'com.android.library' +} android { compileSdkVersion 25 @@ -19,6 +24,27 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + + sourceSets{ + main { + if (Boolean.valueOf(appModuleWebDemo)) { + manifest.srcFile 'src/main/app/AndroidManifest.xml' + java.srcDirs = ['src/main/java','src/main/app/java'] + resources.srcDirs = ['src/main/resources','src/main/app/resources'] + aidl.srcDirs = ['src/main/aidl','src/main/app/aidl'] + renderscript.srcDirs = ['src/main/rs','src/main/app/rs'] + res.srcDirs = ['src/main/res','src/main/app/res'] + assets.srcDirs = ['src/main/assets','src/main/app/assets'] + jniLibs.srcDirs = ['src/main/jniLibs','src/main/app/jniLibs'] + } else { + manifest.srcFile 'src/main/AndroidManifest.xml' + java { + //排除java/debug文件夹下的所有文件 + exclude '*debug' + } + } + } + } } dependencies { diff --git a/webdemo/src/main/app/AndroidManifest.xml b/webdemo/src/main/app/AndroidManifest.xml new file mode 100644 index 0000000..8680036 --- /dev/null +++ b/webdemo/src/main/app/AndroidManifest.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/webdemo/src/main/app/java/com/spinytech/webdemo/WebDemoActivity.java b/webdemo/src/main/app/java/com/spinytech/webdemo/WebDemoActivity.java new file mode 100644 index 0000000..80ec4bd --- /dev/null +++ b/webdemo/src/main/app/java/com/spinytech/webdemo/WebDemoActivity.java @@ -0,0 +1,56 @@ +package com.spinytech.webdemo; + +import android.app.Activity; +import android.os.Bundle; +import android.text.TextUtils; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +import com.spinytech.macore.MaApplication; +import com.spinytech.macore.router.LocalRouter; +import com.spinytech.macore.router.RouterRequest; + +public class WebDemoActivity extends Activity { + + private WebView mContentWv; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_web); + mContentWv = (WebView) findViewById(R.id.web); + mContentWv.setWebViewClient(new MyWebViewClient()); + mContentWv.getSettings().setBuiltInZoomControls(true); + mContentWv.getSettings().setJavaScriptEnabled(true); + mContentWv.getSettings().setSupportZoom(true); + mContentWv.getSettings().setUseWideViewPort(true); + mContentWv.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); + mContentWv.getSettings().setLoadWithOverviewMode(true); + mContentWv.loadUrl("file:///android_asset/page.html"); + } + + + public void dispatchAction(String url) { + if (url.indexOf("your_protocol://") >= 0) { + String command = url.substring("your_protocol://".length()); + try { + LocalRouter.getInstance(MaApplication.getMaApplication()).route(this, new RouterRequest.Builder(this).url(command).build()); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + class MyWebViewClient extends WebViewClient { + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + if (!TextUtils.isEmpty(url) && url.startsWith("your_protocol://")) { + dispatchAction(url); + } else { + mContentWv.loadUrl(url); + } + return true; + } + } +} diff --git a/webdemo/src/main/java/com/spinytech/webdemo/WebActivity.java b/webdemo/src/main/java/com/spinytech/webdemo/WebActivity.java index f351cfb..6312c31 100644 --- a/webdemo/src/main/java/com/spinytech/webdemo/WebActivity.java +++ b/webdemo/src/main/java/com/spinytech/webdemo/WebActivity.java @@ -32,8 +32,8 @@ protected void onCreate(Bundle savedInstanceState) { public void dispatchAction(String url) { - if (url.indexOf("your_protocol://") >= 0) { - String command = url.substring("your_protocol://".length()); + if (url.indexOf("yourprotocol://") >= 0) { + String command = url.substring("yourprotocol://".length()); try { LocalRouter.getInstance(MaApplication.getMaApplication()).route(this, new RouterRequest.Builder(this).url(command).build()); } catch (Exception e) { @@ -45,7 +45,7 @@ public void dispatchAction(String url) { class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { - if (!TextUtils.isEmpty(url) && url.startsWith("your_protocol://")) { + if (!TextUtils.isEmpty(url) && url.startsWith("yourprotocol://")) { dispatchAction(url); } else { mContentWv.loadUrl(url);