1.Android-gradle plugin
2.å¦ä½å¨linuxä¸ä½¿ç¨å®è£
ç软件
Android-gradle plugin
agp,即Android-Gradle-Plugin的缩写,项目配置主要在根目录下的build.gradle文件中的dependencies中,配置classpath "com.android.tools.build:gradle:xxx"。在根目录的build.gradle文件中配置好agp后,就可以在任意module的build.gradle文件中apply Android提供的各种plugin。常见的跳广告源码有com.android.application和com.android.library。apply了com.android.application的module使用assemblexxx执行构建命令可打出来一个apk,而apply了com.android.library的module产物则是一个aar。apply java的module表示是个纯java的模块,打出的产物是个jar。
基于gradle构建的项目基本结构包括根目录下的settings.gradle,用来配置项目中的子模块,使用include来引入子模块。如果子模块不在项目目录内,则可以在include之后使用project(":xxx").projectDir = new File("...")来指定外部module的路径。项目根目录下还有一个build.gradle文件,用来配置整个项目的基本依赖,如插件依赖,aar依赖的抓前端源码maven仓库地址等。
根目录和每个module中都会有一个gradle.properties文件,用于配置一些key-value。构建脚本文件可以直接使用gradle.properties中的key-value配置,例如配置DEV_MODE=true,可在gradle文件中直接使用if ("true" == DEV_MODE) { xxx}。但需要注意的是,gradle.properties中配置的value会被当作字符串类型,即使写的是数字或true/false,也会被当作字符串处理。aspqq中心源码同时,配置的key-value被视为常量,不可修改,因此配置KEY的名字时,应使用全大写。
在项目根目录和每个module的gradle.properties文件中配置的key-value存在读范围问题和覆盖问题。子module可以读取本目录和父级目录下的gradle.properties中的key-value,但外部目录不能直接读取子目录下的gradle.properties文件。如果子目录下的2的源码gradle.properties文件中有相同的key值,则子目录中的value值将覆盖父级目录文件中的value值。在构建一个源码/aar切换的Andrid gradle项目时,可以通过在根目录的gradle.properties中配置全局参数,如构建用的Andrid SDK版本号、构建工具版本号和最低支持的系统版本号,而每个module的gradle.properties则可以为每个module配置其aar所需要的maven参数。
应用插件源码中,一般来说只有壳module的build.gradle中会apply application插件,用于打出一个apk供用户安装。检查源码后门应用插件的实现类为AppPlugin,继承自AbstractAppPlugin,最终调用basePluginApply方法,其中重点调用ThreadRecorder创建了三个线程任务。ThreadRecorder#record中的逻辑是通过create方法设置各种id,并使用block.call方法调用write方法,write方法中调用了ProcessProfileWRiter的writeRecord方法,将GradleBuildProfileSpan添加到span队列中,最后在ProcessProfileWriter的finish方法中将相关信息全部写到日志文件中。
BasePlugin中逻辑清晰,threadRecorder.record的逻辑就是调用最后一个lambda参数,包括configureProject、configureExtension和createTaskts。configureProject中创建了AndroidBuilder对象和初始化了DataBindingBuilder成员变量,配置了Java工程应该有的能力,如source、configureSourceSetDefaults、configureOutputDirectoryForSourceSet、createProcessResourcesTask、createCompileJavaTask、configureJavaDoc和configureTest等。
configureBuildNeeded和configureBuildDependents方法分别配置了buildNeeded task和buildDependents task,确保build之后才能执行buildDependents。configureProject方法最后使用gradle.addBuildListener注册了构建监听器,在buildFinished回调中关闭所有进程。
configureExtension创建了buildTypeContainer、productFlavorContainer、signingConfigContainer和buildOutputs四个容器,构建了一个extension对象,并用这个extention创建了variantFactory,为变体配置了buildType、productFlavor、signingConfig和buildOutputs。createTasks方法分为两部分,createTasksBeforeEvaluate构建前的准备工作,createAndroidTasks为真正的构建task。createAndroidTasks方法中,为每个变体调用了createTasksForVariantData方法,判断变体类型后调用taskManager.createTasksForVariantScope(variantScope)为变体配置了众多task,如assembleXXX的相关task,实现多渠道的核心功能。
å¦ä½å¨linuxä¸ä½¿ç¨å®è£ ç软件
ç®åæµè¡ç软件å æ两ç§æ¯è¾å¸¸è§çå½¢å¼ï¼ä¸ç§æ¯ä»¥ RPMãdebå 为代表çæºè½è½¯ä»¶å ï¼å¦ä¸ç§æ¯file.tar.gzå½¢å¼çå缩ã
ä¸ãæºä»£ç å®è£
åºç¨è½¯ä»¶çæºä»£ç ä¸è¬æ¯file.tar.gzæè file.tgzæ ¼å¼ï¼ä¹å°±æ¯è¯´æ¯ä»¥taræ¥æå ï¼ç¶åç¨gzipæ¥å缩ã
以åºç¨è½¯ä»¶xfce-3.8.7.tar.gz为ä¾ï¼å è¿å ¥è½¯ä»¶çå½åç®å½ï¼ç¶å使ç¨gzip解åï¼#gzip -d
xfce-3.8.7.tar.gz(注:-d 代表解å)ãç¶åç¨tar解å ï¼#tar -xvf
xfce-3.8.7.tarãç±äºtarågzipç»å¸¸ä¸èµ·ä½¿ç¨ï¼æ以tarè¿æä¾äºä¸ä¸ªåæ°ï¼å®å¯ä»¥èªå¨è°ç¨gzipæ¥è§£åï¼å³ï¼# tar -xzvf xfce-3.8.7.tar.gzã
è¿å ¥è§£åå®æä¹åæ°å»ºç«çç®å½ï¼ä¸è¬çåºç¨è½¯ä»¶ä¸é½æä¸ä¸ªç¨æ¥é 置软件çå¯æ§è¡æ件
ââconfigureï¼å®çåæ°æ¯è¾å¤ï¼èä¸ç¨æ³ä¹é常çµæ´»ãå½ç¶ï¼å®è£ ä¸åç软件åæ°ä¹ä¸ç¸åï¼å ·ä½æäºä»ä¹åæ°ï¼å¯ä»¥ç¨å½ä»¤:#./configure helpåå¾è¯¦ç»ç帮å©ãä¾å¦./configure --prefix=/usr/local/mysqlï¼è¡¨ç¤ºè®¾ç½®è½¯ä»¶çå®è£ ç®å½ä¸º:/usr/local/mysqlï¼å¨è¿è¡#./configure [options]é 置软件åï¼å®ä¼æ ¹æ®ä½ å½åç³»ç»ãç¼è¯ãå®è£ ç¸å ³çä¿¡æ¯ï¼çæä¸ä¸ªå®è£ é ç½®æ件MakefileãMakefileæ件é常æ¯ç¨æ¥ç¼è¯åå®è£ 软件çï¼è¿è¡makeå½ä»¤æ¶ç³»ç»ä¼èªå¨æ ¹æ®Makefileæ件ä¸ç设置对软件è¿è¡ç¼è¯åå®è£ ï¼å¦æç¼è¯è½å¤é¡ºå©éè¿çè¯ï¼è¿è¡#make installå½ä»¤æ¥å®è£ ã
äºãæºè½å å®è£
ç°å¨ï¼ä»¥æºè½å å½¢å¼æä¾ç软件å¾å¤ï¼åRedHat LinuxçRPMãDebian
LinuxçDEBãKISSãBSD以åSlackwareçãRPMåDebianå ä¹ç»æ²»çLinuxå 管çä¸çæ¯Linuxåè¡çæ¬æ广æ³éç¨çåºç¨è½¯ä»¶ã
RPMæ¯RedHat Package Managerç缩åï¼å®åªè½ä½¿ç¨å¨å®è£ äºRPM软件çç³»ç»ä¸ï¼ä¸è¿å¥½åç®å大å¤æ°ä¸æLinuxåè¡çæ¬é½æ¯æRPM软件å ã
1ãç¨å½ä»¤ç®¡ç
#rpm [options] abc.rpm
ä¾å¦å®è£ python-1.5.2-.i.rpm软件æ¶ï¼å¯ä»¥ä½¿ç¨å¦ä¸å½ä»¤ï¼#rpm âivh python-1.5.2-.i.rpmã
å¦ææ³ç¥éRPM软件å ä¸çç¸å ³ä¿¡æ¯ï¼å¯ä»¥ä½¿ç¨å½ä»¤: #rpm ivhpython1.5.2- .i.rpmã
å¦ææ³ç¥épython-1.5.2-.i.rpmä¼å¨ç³»ç»éå®è£ åªäºæ件ï¼å¯ä»¥ä½¿ç¨ä»¥ä¸è¿ä¸ªå½ä»¤ï¼rpm -qpl python-1.5.2-.i.rpmã
2ãå¾å½¢çé¢å·¥å ·ç®¡ç
ç¸å¯¹å½ä»¤æ¹å¼æ¥è¯´ï¼å¨å¾å½¢ç¯å¢ä¸ï¼å®è£ ãå级ãå¸è½½åæ¥è¯¢RPM软件å æ¯ä¸ä»¶é常ç®åè½»æ¾çäºæ ï¼å 为Linuxæä¾äºå 个åè½å¼ºå¤§çRPMå 管çå·¥å ·ãæ¨è使ç¨Linuxçå¾å½¢ç®¡çå·¥å ·æ¥ç»´æ¤RPM软件å ï¼GNOMEä¸çGnoRPMåKDEä¸çKpackageå°±æ¯åè½å¼ºå¤§çRPMã
ç¹å»Startï¼å¼å§ï¼âSystem toolsï¼ç³»ç»å·¥å ·ï¼âKpackageï¼åºç°Kpackageçé¢ï¼åæ¶åæLinuxç³»ç»ä¸ç RPMæ°æ®åºãå®å°å®è£ 好çRPMå å½¢å¼ç软件æç §åè½åå¨AmusementsãApplicationãDevelopmentãDocumentã ExtensionãExtentionsãNetworkingãSystem EnvironmentãUser Interface以åXçå 个æ å½¢ç®å½ä¸ï¼æ¯ä¸ªç®å½ä¸æç¸åºçæ件å¾æ åå称ãè¦å®è£ æå级软件ï¼åªè¦ç¹å»å·¥å ·æ çç¸åºæé®å°±ä¼å¼¹åºæå¼æ件ç对è¯æ¡ï¼éä¸è¦å®è£ çRPMæ件ï¼åå»OKæé®ï¼å¦æä¸ç¼ºå¿ è¦çè¿è¡åºï¼å°±å¼å§å®è£ 软件äºãå¸è½½è½¯ä»¶æ¶ï¼ç¨é¼ æ éæ©ç¸åºç软件ï¼åå»å³è¾¹çUninstallæé®å°±å¯ä»¥äºã