妈妈网站源码分享,妈妈网平台是怎么回事

各位老铁们好,相信很多人对妈妈网站源码分享都不是特别的了解,因此呢,今天就来为大家分享下关于妈妈网站源码分享以及妈妈网平台是怎么回事的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

CSDN移动将持续为您优选移动开发的精华内容,共同探讨移动开发的技术热点话题,涵盖移动应用、开发工具、移动游戏及引擎、智能硬件、物联网等方方面面。如果您想投稿、寻求《近匠》报道,或给文章挑错,欢迎发送邮件至tangxy改成@)。

1、用Gradle构建

1.1工程结构

如图所示,这是一个不能更普通的Android的Gradle工程了。

根目录下面的settings.gradle当中主要是用来include子模块的,比如我们这个工程有一个叫作app的子模块,那么settings.gradle的内容如下:

include’:app’

根目录下面的build.gradle包含一些通用的配置,这些配置可以在各个子模块当中使用。

gradle.properties文件包含的属性,会成为project的properties的成员,例如我们添加了属性hello,

hello=HelloTas!

taskhello<<{\nprintlnhello\nprintlnproject.getProperties.get(“hello”)\n}

输出的结果是一样地:

14:28:11:Executingexternaltask’hello’…Configurationondemandisanincubatingfeature.:app:helloHelloTas!HelloTas!BUILDSUCCESSFULTotaltime:0.54secs14:28:12:Externaltaskexecutionfinished’hello’.local.properties这个文件在Android工程当中会遇到,我们通常在其中设置Android的SDK和NDK路径。当然,这个AndroidStudio会帮我们设置好的。为了更清楚地了解这一点,我把Android的Gradle插件的部分源码摘录出来:

SDK.groovy,下面的代码主要包含了加载SDK、NDK路径的操作。

privatevoidfindLocation{\nif(TEST_SDK_DIR!=null){\nandroidSdkDir=TEST_SDK_DIR\nreturn\n}\n\ndefrootDir=project.rootDir\ndeflocalProperties=newFile(rootDir,FN_LOCAL_PROPERTIES)\nif(localProperties.exists){\nPropertiesproperties=newProperties\nlocalProperties.withInputStream{instr->\nproperties.load(instr)\n}\ndefsdkDirProp=properties.getProperty(‘sdk.dir’)\n\nif(sdkDirProp!=null){\nandroidSdkDir=newFile(sdkDirProp)\n}else{\nsdkDirProp=properties.getProperty(‘android.dir’)\nif(sdkDirProp!=null){\nandroidSdkDir=newFile(rootDir,sdkDirProp)\nisPlatformSdk=true\n}else{\nthrownewRuntimeException(\n”Nosdk.dirpropertydefinedinlocal.propertiesfile.”)\n}\n}\n\ndefndkDirProp=properties.getProperty(‘ndk.dir’)\nif(ndkDirProp!=null){\nandroidNdkDir=newFile(ndkDirProp)\n}\n\n}else{\nStringenvVar=System.getenv(“ANDROID_HOME”)\nif(envVar!=null){\nandroidSdkDir=newFile(envVar)\n}else{\nStringproperty=System.getProperty(“android.home”)\nif(property!=null){\nandroidSdkDir=newFile(property)\n}\n}\n\nenvVar=System.getenv(“ANDROID_NDK_HOME”)\nif(envVar!=null){\nandroidNdkDir=newFile(envVar)\n}\n}\n}

BasePlugin.groovy,通过这两个方法,我们可以在Gradle脚本当中获取SDK和NDK的路径:

FilegetSdkDirectory{\nreturnsdk.sdkDirectory\n}\n\nFilegetNdkDirectory{\nreturnsdk.ndkDirectory\n}

例如:

taskhello<<{\nprintlnandroid.getSdkDirectory\n}

14:37:33:Executingexternaltask’hello’…Configurationondemandisanincubatingfeature.:app:hello/Users/benny/Library/Android/sdkBUILDSUCCESSFULTotaltime:0.782secs14:37:35:Externaltaskexecutionfinished’hello’.

上面给出的只是最常见的hierarchy结构,还有flat结构,如下图1为flat结构,2为hierarchy结构。有兴趣的话可以Google一下。

1.2几个重要的概念

这一小节的出场顺序基本上跟build.gradle的顺序一致。

1.2.1Repository和Dependency

如果你只是写Android程序,那么依赖问题可能还不是那么的烦人——如果你用Java写服务端程序,那可就是一把辛酸一把泪了。

仓库的出现,完美的解决了这个问题,我们在开发时只需要知道依赖的id和版本,至于它存放在哪里,我不关心;它又依赖了哪些,构建工具都可以在仓库中帮我们找到并搞定。这一切都是那么自然,要不要来一杯拿铁,让代码构建一会儿?

据说在Java发展史上,涌现出非常多的仓库,不过最著名的当然是Maven了。Maven通过groupId和artifactId来锁定构件,再配置好版本,那么Maven仓库就可以最终锁定一个确定版本的构件供你使用了。比如我们开头那个例子:

<dependency>\n<groupId>com.google.code.gson</groupId>\n<artifactId>gson</artifactId>\n<version>2.4</version>\n</dependency>

Maven就凭这么几句配置就可以帮你搞定gson-2.4.jar,不仅如此,它还会按照你的设置帮你把javadoc和source搞定。妈妈再也不用担心我看不到构件的源码了。

那么这个神奇的Maven仓库在哪儿呢?MavenCentral,中央仓库,是Maven仓库的鼻祖,其他的大多数仓库都会对它进行代理,同时根据需求添加自己的特色库房。简单说几个概念:

代理仓库:要租房,去搜房网啊。你要去驾校报名,我是驾校代理,你找我,我去找驾校。具体到这里,还有点儿不一样,一旦有人从代理仓库下载过一次特定得构件,那么这个构件会被代理仓库缓存起来,以后就不需要找被代理的仓库下载了。

私有仓库:中国特色社会主义。走自己的路,你管我啊?公司内部的仓库里面有几个hosted的仓库,这些仓库就是我们公司内部特有的,里面的构件也是我们自己内部的同事上传以后供团队开发使用的。

本地仓库:大隐隐于市。跟代理仓库的道理很像,只不过,这个仓库是存放在你自己的硬盘上的。

说起来,AndroidSDK下面有个extra目录,里面的很多依赖也是以Maven仓库的形式组织的。不过这是Google特色嘛,人家牛到不往Maven的中央仓库上传,真是没辙。

1.2.2SourceSets

源码集,这里面主要包含你的各种类型的代码的路径,比如’src/main/java’等等。

1.2.3Properties

前面我们其实也稍稍有提到,这个properties其实是gradle的属性,在gradle源码当中,我们找到Project.java这个接口,可以看到:

/**\n*<p>Determinesifthisprojecthasthegivenproperty.See<ahref=”properties”>here</a>fordetailsofthepropertieswhich\n*areavailableforaproject.</p>\n*\n*@returnAmapfrompropertynametovalue.\n*/\nMap<String,?>getProperties;\n\n/**\n*<p>Returnsthevalueofthegivenproperty.Thismethodlocatesapropertyasfollows:</p>\n*\n*<ol>\n*\n*<li>Ifthisprojectobjecthasapropertywiththegivenname,returnthevalueoftheproperty.</li>\n*\n*<li>Ifthisprojecthasanextensionwiththegivenname,returntheextension.</li>\n*\n*<li>Ifthisproject’sconventionobjecthasapropertywiththegivenname,returnthevalueofthe\n*property.</li>\n*\n*<li>Ifthisprojecthasanextrapropertywiththegivenname,returnthevalueoftheproperty.</li>\n*\n*<li>Ifthisprojecthasataskwiththegivenname,returnthetask.</li>\n*\n*<li>Searchupthroughthisproject’sancestorprojectsforaconventionpropertyorextrapropertywiththe\n*givenname.</li>\n*\n*<li>Ifnotfound,a{@linkMissingPropertyException}isthrown.</li>\n*\n*</ol>\n*\n*@parampropertyNameThenameoftheproperty.\n*@returnThevalueoftheproperty,possiblynull.\n*@throwsMissingPropertyExceptionWhenthegivenpropertyisunknown.\n*/\nObjectproperty(StringpropertyName)throwsMissingPropertyException;\n\n/**\n*<p>Setsapropertyofthisproject.Thismethodsearchesforapropertywiththegivennameinthefollowing\n*locations,andsetsthepropertyonthefirstlocationwhereitfindstheproperty.</p>\n*\n*<ol>\n*\n*<li>Theprojectobjectitself.Forexample,the<code>rootDir</code>projectproperty.</li>\n*\n*<li>Theproject’s{@linkConvention}object.Forexample,the<code>srcRootName</code>javaplugin\n*property.</li>\n*\n*<li>Theproject’sextraproperties.</li>\n*\n*</ol>\n*\n*Ifthepropertyisnotfound,a{@linkgroovy.lang.MissingPropertyException}isthrown.\n*\n*@paramnameThenameoftheproperty\n*@paramvalueThevalueoftheproperty\n*/\nvoidsetProperty(Stringname,Objectvalue)throwsMissingPropertyException;

不难知道,properties其实就是一个map,我们可以在gradle.properties当中定义属性,也可以通过gradle脚本来定义:

setProperty(‘hello’,’HelloTasagain!’)

使用方法我们前面已经提到,这里就不多说了。

1.2.4Project和Task

如果你用过ant,那么project基本上类似于ant的project标签,task则类似于ant的target标签。我们在build.gradle当中编写的:

taskhello<<{\n……\n}

实际上,是调用:

TaskProject.task(Stringname)throwsInvalidUserDataException;

创建了一个task,并通过<<来定义这个task的行为。我们看到task还有如下的重载:

Tasktask(Stringname,ClosureconfigureClosure);

所以下面的定义也是合法的:

task(‘hello2’,{\nprintlnhello\n})

简单说,project就是整个构建项目的一个逻辑实体,而task就是这个项目的具体任务点。更多的介绍可以参见官网的文档,和gradle的源码。

2、发布构件

发布构件,还是依赖仓库,我们仍然以Maven仓库为例,私有仓库多数采用sonatype。

2.1UI发布

如果管理员给你开了这个权限,你会在UI上面看到uploadartifact的tab,选择你要上传的构件,配置好对应的参数,点击上传即可。

2.2使用Maven插件

这里的意思是使用Maven的gradle插件,在构建的过程中直接上传。构建好的构件需要签名,请下载GPG4WIN(windows),或者GPGTOOLS(mac),生成自己的key。

直接上代码:

gradle.properties

sonatypeUsername=你的用户名sonatypePassword=你的密码signing.keyId=你的keyidsigning.password=你的keypassmac/linuxsigning.secretKeyRingFile=/Users/你的用户名/.gnupg/secring.gpgsigning.secretKeyRingFile=C:\\\\DocumentsandSettings\\\\<username>\\\\ApplicationData\\\\GnuPG\\\\secring.gpgsigning.secretKeyRingFile=C:\\\\Users\\\\<username>\\\\AppData\\\\Roaming\\\\gnupg\\\\secring.gpgprojectName=你的构件名称group=你的构件groupidartifactId=你的构件artifactid#版本号,采用三位数字的形式,如果是非稳定版本,请务必添加SNAPSHOTversion=0.0.1-SNAPSHOT

build.gradle

applyplugin:’com.android.library’\napplyplugin:’maven’\napplyplugin:’signing’\n\nandroid{\ncompileSdkVersion21\nbuildToolsVersion”21.1.2″\n\ndefaultConfig{\nminSdkVersion17\ntargetSdkVersion21\nversionCode1\nversionName”0.2″\n}\nbuildTypes{\nrelease{\nminifyEnabledfalse\nproguardFilesgetDefaultProguardFile(‘proguard-android.txt’),’proguard-rules.pro’\n}\n}\n}\n\ndependencies{\ncompilefileTree(include:[‘*.jar’],dir:’libs’)\n……\n}\n\ndefisSnapshot=version.endsWith(‘-SNAPSHOT’)\ndefsonatypeRepositoryUrl\nif(isSnapshot){\nsonatypeRepositoryUrl=”http://maven.oa.com/nexus/content/repositories/thirdparty-snapshots/”\n}else{\nsonatypeRepositoryUrl=”http://maven.oa.com/nexus/content/repositories/thirdparty/”\n}\n\nsourceSets{\nmain{\njava{\nsrcDir’src/main/java’\n}\n}\n}\ntasksourcesJar(type:Jar){\nfromsourceSets.main.allSource\nclassifier=’sources’\n}\n\nartifacts{\n//archivesjavadocJar\narchivessourcesJar\n}\n\nsigning{\nif(project.hasProperty(‘signing.keyId’)&&project.hasProperty(‘signing.password’)&&\nproject.hasProperty(‘signing.secretKeyRingFile’)){\nsignconfigurations.archives\n}else{\nprintln”Signinginformationmissing/incompletefor${project.name}”\n}\n}\n\nuploadArchives{\nrepositories{\nmavenDeployer{\n\nif(project.hasProperty(‘preferedRepo’)&&project.hasProperty(‘preferedUsername’)\n&&project.hasProperty(‘preferedPassword’)){\n\nconfiguration=configurations.archives\nrepository(url:preferedRepo){\n\nauthentication(userName:preferedUsername,password:preferedPassword)\n}\n\n}elseif(project.hasProperty(‘sonatypeUsername’)&&project.hasProperty(‘sonatypePassword’)){\n\nbeforeDeployment{MavenDeploymentdeployment->signing.signPom(deployment)}\n\nrepository(url:sonatypeRepositoryUrl){\nauthentication(userName:sonatypeUsername,password:sonatypePassword)\n\n}\n}else{\nprintln”SettingssonatypeUsername/sonatypePasswordmissing/incompletefor${project.name}”\n}\n\npom.artifactId=artifactId\npom.project{\nnameprojectName\npackaging’aar’\n\ndevelopers{\ndeveloper{\nid’wecar’\nname’wecar’\n}\n}\n}\n}\n}\n}

然后运行gradleuploadArchives就可以将打包的aar发布到公司的Maven仓库当中了。jar包的方式类似,这里就不在列出了。

2.3使用Maven命令

这个可以通过mvn在cmdline直接发布构件,命令使用说明:

mvndeploy:deploy-file-Durl=file://C:\\m2-repo\\-DrepositoryId=some.id\\-Dfile=your-artifact-1.0.jar\\[-DpomFile=your-pom.xml]\\[-DgroupId=org.some.group]\\[-DartifactId=your-artifact]\\[-Dversion=1.0]\\[-Dpackaging=jar]\\[-Dclassifier=test]\\[-DgeneratePom=true]\\[-DgeneratePom.description=”MyProjectDescription”]\\[-DrepositoryLayout=legacy]\\[-DuniqueVersion=false]

当然这里仍然有个认证的问题,我们需要首先在maven的settings配置当中加入:

<servers>\n<server>\n<id>Maven.oa.com</id>\n<username>rdm</username>\n<password>rdm</password>\n</server>\n</servers>

然后我们就可以使用命令上传了:

mvndeploy:deploy-file-DgroupId=com.tencent.test-DartifactId=test-Dversion=1.0.0-Dpackaging=aar-Dfile=test.aar-Durl=http://maven.oa.com/nexus/content/repositories/thirdparty-DrepositoryId=Maven.oa.com

3、插件

3.1什么是插件

插件其实就是用来让我们偷懒的。如果没有插件,我们想要构建一个Java工程,就要自己定义sourceSets,自己定义classpath,自己定义构建步骤等等。

简单地说,插件其实就是一组配置和任务的合集。

gradle插件的存在形式主要由三种,

gradle文件中直接编写,你可以在你的build.gradle当中写一个插件来直接引入:

applyplugin:GreetingPlugin\nclassGreetingPluginimplementsPlugin<Project{\nvoidapply(Projectproject){\nproject.task(‘hello’)<<{\nprintln”HellofromtheGreetingPlugin”\n}\n}\n}

buildSrc工程,这个就是在你的工程根目录下面有一个标准的Groovy插件工程,目录是buildSrc,你可以直接引用其中编写的插件。

独立的工程,从结构上跟buildSrc工程是一样的,只不过这种需要通过发布到仓库的形式引用。通常我们接触的插件都是这种形式。

3.2常见的插件

目前接触到的插件,有下面这么几种:

java,构建java工程war,发布war包用,构建web工程会用到groovy,构建groovy工程com.android.application,构建Androidapp工程com.android.library,构建Androidlibrary,通常输出aarsign,签名maven,发布到maven仓库org.jetbrains.intellij,构建intellij插件工程

3.3自己动手写一个插件

创建一个普通的groovy工程(java工程也没有关系),创建src/main/groovy目录,编写下面的代码:

packagecom.tencent.wecar.plugin\n\nimportorg.gradle.api.Plugin\nimportorg.gradle.api.internal.project.ProjectInternal\n\nclassGreetingPluginimplementsPlugin<ProjectInternal>{\n\nvoidapply(ProjectInternalproject){\nproject.task(‘hello’)<<{\nprintln’hello’\n}\n}\n}

在src/main/resources创建META-INF/gradle-plugins目录,创建greetings.properties文件:

implementation-class=com.tencent.wecar.plugin.GreetingPlugin

其中greettings就是你的插件id。

build.gradle

group’com.tencent.wecar.plugin’\nversion’1.1-SNAPSHOT’\n\nbuildscript{\nrepositories{\nmavenLocal\n}\n}\n\napplyplugin:’groovy’\napplyplugin:’java’\n\nrepositories{\nmavenCentral\n}\n\nsourceSets{\nmain{\ngroovy{\nsrcDirs=[\n’src/main/groovy’,\n’src/main/java’\n]\n}//compileeverythinginsrc/withgroovy\njava{srcDirs=}//nosourcedirsforthejavacompiler\n\n}\n}\n\ndependencies{\n//tasks.withType(Compile){options.encoding=”UTF-8″}\ncompilegradleApi\n}\n\n//customtasksforcreatingsourcejars\ntasksourcesJar(type:Jar,dependsOn:classes){\nclassifier=’sources’\nfromsourceSets.main.allSource\n}\n\n//addsourcejartasksasartifacts\nartifacts{archivessourcesJar}\n\n//uploadtolocal\nuploadArchives{\nrepositories{\nmavenLocal\n}\n}

运行uploadArchives发布到本地仓库,那么就可以找到我们自己的插件了,由于当中没有指定artifactId,那么我们的插件的artifactId就是我们的工程名称,比如这里是deployplugin。

那么我们要怎么引入这个插件呢?

首先要再buildScript增加依赖:

buildscript{\nrepositories{\nmavenLocal\n}\ndependencies{\nclasspath’com.tencent.wecar.plugin:deployplugin:1.1-SNAPSHOT’\n}\n}

然后:

applyplugin:’greetings’

这样我们的task“hello”就被引入了。

4、Gradle运行慢?

用过Gradle的朋友多少会感觉到这货有时候会比较慢。我们可以通过下面的三个手段加速你的Gradle。

不用中央仓库。如果你的repository配置的是mavenCentral,放开它吧,全世界的人都在琢磨着怎么虐它,你就不要瞎掺和了。试试jCenter。升级最新的Gradle版本。目前最新的版本是2.4,AndroidStudio从1.3开始默认使用Gradle2.4。开启Gradle的电动小马达。在gradle.properties(眼熟?没错,就是它!!)

里面添加下面的配置:

如果你的任务没有时序要求,那么打开这个选项可以并发处理多个任务,充分利用硬件资源。。嗯,如果你的是单核CPU。。当我没说。。org.gradle.parallel=true这个也可以在命令行通过参数的形式启动,3个小时有效。守护进程可以使编译时间大大缩短org.gradle.daemon=true这个看需求吧,Gradle是运行在Java虚拟机上的,这个指定了这个虚拟机的堆内存初始化为256M,最大为1G。如果你内存只有2G,那当我没说。。org.gradle.jvmargs=-Xms256m-Xmx1024m

当然,建议的方式是在你的用户目录下面的.gradle/下面创建一个gradle.properties,免得坑你的队友。。。

本文为腾讯Bugly投稿,Bugly是腾讯内部产品质量监控平台的外发版本,经团队四年打磨,支持iOS和Android两大主流平台,其主要功能是App发布以后,对用户端发生的Crash以及卡顿现象进行监控并上报,让开发同学可以第一时间了解到App的质量情况,及时修改。目前腾讯内部所有的产品,均在使用其进行线上产品的崩溃监控。

【活动预告】由CSDN主办的“2015开发工具及服务年度大奖评选”活动已正式启动。近两年,开发工具及服务不断涌现,从云服务、即时通讯、安全到统计监测、人工智能、物联网平台等。CSDN将通过公开征集,并结合平台内用户数据采集分析,评选出CSDN2015开发工具及服务年度大奖。赶快为你的开发工具与服务报名参与评选吧。更多详情,请关注评选活动官网。

第一时间掌握最新移动开发相关信息和技术,请关注mobilehub公众微信号(ID:mobilehub)。

OK,关于妈妈网站源码分享和妈妈网平台是怎么回事的内容到此结束了,希望对大家有所帮助。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平