| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> Android中Gradle构建相关知识 -> 正文阅读 |
|
[移动开发]Android中Gradle构建相关知识 |
目录 1.project与module模块的区分<1>每一个project下都包含多个module模块 <2>每一个module模块都是一个独立可执行的程序 <3>可以将若干个module模块关联到同一个project下面 2.Android项目的三块组成部分<1>编译系统:Android Studio是由Gradle来处理的。 <2>配置文件:它会配置一些我们id的属性,文件的属性之类的内容。 <3>应用模块 3.project下目录讲解<1>.gradle:这个文件夹下包含一些gradle编译的脚本。gradle是谷歌推荐使用的一个编译系统脚本。它的底层语言是groovy语言。gradle的编译系统它的版本是由wrapper来指定的。因为gradle更新的比较快,所以为了兼容以前的旧版本,它做了wrapper的包装类。 <2>.idea:它包含了Android Studio这个工具需要的文件,包括版权声明,词典介绍,一些配置文件和一些库的使用。 <3>module文件夹:我们编写的代码、布局文件都在这个module文件夹中。 <4>build文件夹:是指module或者project编译好之后所生成的一些文件,它就会生成在build文件夹里边。它会生成一些apk,还会有一些jar文件,还包括一些侧写的临时文件。 <5>gradle文件夹:里边有一个刚才说的wrapper文件夹,这是android对gradle进行了一层封装gradle-wrapper。这样做的原因就是因为gradle更新速度快,它比android studio更新速度快很多。所以说为了兼容性的角度,谷歌对出了一个gradle-wrapper.jar的jar文件,然后它会更新以前旧版本的gradle。 <6>.gitignore:在这个文件中可以配置在git上传代码时不用上传的文件。 <7>build.gradle:这个文件它里面其实做的是一些相关的配置。 <8>gradle.properties:这里面也是一些配置,但它是全局的,适用于所有module。 <9>gradlew:这是一个可执行文件,这是Linux下的gradle可执行文件。 <10>gradlew.bat:这是window下gradle的可执行文件。你从文件夹中找到点击它就可以执行gradle的操作。 <11>local.properties:本地属性的一些设置。这个文件不推荐使用git时上传到本地仓库。 <12>settings.gradle:这个是我们和设置相关的有些规定的脚本会在这里配置。 4.module下目录讲解(以app为例)<1>build文件夹:这个build文件夹中是我们编译后的文件存在位置。这些编译文件主要针对的是module app,也包括最终生成的apk和一些临时文件会在这里显示。 <2>libs:这里会包含一些第三方的jar文件和aar包。 <3>src:这里主要包括java代码、布局文件等等,我们基本上开发所做的操作都是在这里进行的。 <4>build.gradle:整个项目中与该模块有关的配置都会在这里,包括编译的sdk版本,app的版本,以及一些默认的配置(比如说最小的sdk版本,和目标编译的版本,现在的版本号,版本名称等)。同时这里还会开启一些优化的操作,比如开启混淆文件等。 <5>proguard_rules.pro:代码混淆配置的文件。关于混淆,在现在的开发过程也非常重要。它对APP的保护和APP体积的缩小,有很大关系。 5.Android的构建流程其实Android的构建流程我们可以用一句话来概括:我们先把java文件编译为.class字节码文件,然后再把字节码文件和我们所依赖的一些第三方jar文件打包成classes.dex的Android可执行文件。然后打包资源文件。接着合并classes.dex和一些资源包,形成未签名的包。最后签名形成正式包。 6.构建过程中相关的一些工具说明<1>aapt:Android的资源打包工具。它会将例如AndroidManifest.xml、layout中的布局文件等编译为二进制形式。此时文件夹中的资源会生成资源id,aapt会生成对应的R.java文件。当然,assets文件夹中的资源不会被编译,因为一些图片要保持原来的状态。 <2>aidl:第二步会将aidl接口转化为java的接口。 <3>Java Compiler:第三步我们会将所有R.java、java接口、源代码通过java编译器,转换成我们熟悉的.class文件。 <4>dex:通过Android当中的dex工具和上述产生成的字节码文件,打包编译成.dex文件。而.dex是Android虚拟机dalvik可以执行的格式。最终所有的.dex文件会被打包成apk文件。 <5>apkbuilder:在打包成dex文件之后,Android中的apkbuilder工具会将我们编译过的资源和那些未编译过的资源,包括一些图片等等,结合上面打包成的.dex文件,打包成我们最熟悉的apk文件。 <6>Jasigner:通过Jasigner这个工具对apk进行签名。签名方式有debug keystore和release keystore两种方式。debug就是开发调试模式,release就是日常发版的模式。 <7>zipalign:当apk进行签名之后,还要通过zipalign对apk进行对齐操作,这样做的目的就是为了减少我们apk所占内存中的开销。 7.zipalign简述zipalign在Android 1.6 时便被引入,它能够对打包的Android应用程序进行优化。它可以让Android操作系统和应用程序之间交互更有效率,让整个应用程序、整个系统运行更快。用zipalign处理过的应用程序执行时间达到最低限度。同时它也可以让我们运行的apk应用程序占最小的内存。所以我们一定要使用zipalign这个工具对apk进行优化。 8.git的工作区概念工作区其实就是在电脑中我们所看见的文件目录。比如project就是一个工作区。而在工作区中有一个隐藏目录.git,它里面是我们一些git版本库内容。 9.gitignore文件这里配置的是我们不想上传到版本控制的一些文件。 10.一些常用的git命令<1>git init 该命令用于创建git仓库。当调用该命令后,目录下多了一个.git的隐藏目录。这个目录中放的就是我们git的版本。 <2>git status 该命令可以查看当前仓库的一些状态。 <3>git diff 该命令后要加一个文件名。这时候我们就可以看到这次和上次到底修改了哪些内容。它会以标注的形式给我们展示出来。 <4>git add 该命令后加一个文件名。这会把我们所要添加的文件放到暂存区当中,而不是直接放到代码仓库当中。 <5>git commit git commit的作用就是把git add提到暂存区的内容提交到代码区当中。我们在创建git版本库的时候,git其实自动为我们创建了一个分支,叫master分支。所以我们这里如果不指定分支的话,git commit命令就是往master分支上提交代码。 <6>git clone 这个命令就是我们从一个远程仓库克隆一份代码到本地。git clone后面一般会加项目的git地址。 <7>git branch ?查看当前分支到底是什么。 <8>git checkout 这个命令可以让我们切换分支。比如默认是master分支,但日常开发的时候如果你独立拉出一个develop分支的话,就要通过git checkout develop拉取一个新的分支,在这个新的分支中开发。 11.git的两种工作流简述git的两种工作流包括clone和fork/clone两种。我们简单说明一下fork/clone的开发步骤 <1>从别人的git地址上fork一份代码到自己的远程地址上。此时计算机本地对这个仓库没有进行任何操作。 <2>clone自己的远程仓库,仓库会发送一份代码到自己的本地电脑上。 <3>此时可以更新某些文件。 <4>这时可以commit你的文件。此时的commit操作其实是提交到自己的本地仓库上。 <5>通过push,将提交到自己本地仓库的代码提交到远程仓库。 <6>从自己的远程仓库通过push request提交到项目的远程仓库上。 <7>项目管理会处理push request申请,如果代码没问题就可以进行合并了。 12.settings.gradle文件解析<1>settings.gradle文件只包含在一个项目当中。对一个新的项目,它只会包含它所有的module模块。 <2>settings文件在初始化阶段会被执行。 <3>如果很多人开发,每个人都在开发不同的模块,这时候你需要settings.gradle来编制一定的规划,让我们业务逻辑开发更有条理。 13.project级的build.gradle文件解析<1>这个文件它一般包含两个代码块,一个是buildscript,一个是allprojects。实际的构建它会在buildscript这个代码块里。 <2>buildscript模块中有两个模块:repositories和dependencies。 repositories其实就是代码的仓库。它意味着我们可以依赖的第三方SDK。 dependencies表示代码块在构建过程中所需要依赖的包。这也意味着你不能将你的应用或依赖项目所需要的依赖包包含在顶层的构建文件当中。因为默认情况下唯一定义的依赖包是Gradle的Android插件。每一个Android模块都需要有Gradle的Android插件,因为该插件可以使得Android执行它模块所在的相关任务。 <3>allprojects代码块可用来声明定义模块属性。你甚至可以在这里边也创建任务。默认allprojects中也有一个代码块管理。这里要注意的是,一旦你使用了allprojects属性,这个模块就被耦合到了你所在的项目当中。这就意味着很有可能在没有主项目构建的情况下,你这个模块是无法独立构建的。所以这在Android Studio刚开始时是个问题。如果你后面想把它单独分离到一个自己的项目当中,你就需要重新构建你的build文件了。 14.app级的build.gradle文件解析<1>这个文件是属于app模块自身的,而且它是可以覆盖我们刚才所说的顶层build.gradle这个文件的任何属性。 <2>这个构建文件大体是由两部分组成的。一个是android这个大标签,还有一个有dependencies,包含这个模块中依赖的一些包。 <3>该文件中第一行代码如下:
这是用到的android插件。plugin就是Android插件的意思?。我们这里用到的插件表示在顶层构建文件当中,这个插件被配置成了一些依赖。这是由谷歌的工具团队负责Android插件的编写和维护的,即这一块是官方提供的。它用于构建、测试、打包Android项目所使用 。 <4>android标签 这个android大标签是占比最大的一个代码块。这个代码块包含了全部的Android特有的配置。这些特有的配置之所以可以被使用,是因为第一行中插入了我们Android的插件。其中它有很多属性,但有两个属性是必备的,就是compileSdkVersion和buildToolsVersion。
defaultConfig中配置了整个代码配置的核心属性。这个里面配置的属性你可以去覆盖在Manifest配置文件的属性。 下面分析一下defaultConfig中的属性
<5>dependencies标签 依赖包是标准gradle配置的一部分。这就是把它放在Android代码块之外的一个原因。它是独立于android的一块标准的部分。这里定义了它依赖项目所有的依赖包。即所有依赖包都定义在dependencies这个模块里边。 15.Gradle总结在AndroidStudio创建一个新项目时,它默认会生成三个Gradle文件。其中两个文件在我们project目录下,还有一个gradle在app模块中。settings.gradle对多模块开发有用,它里面配置一些各个模块的属性。顶层project目录下的build.gradle,它里面配置了第三方代码库,如jCenter,还有依赖插件的dependencies。app模块中的build.gradle,主要分为两个子模块,一个是android,一个是dependencies。而这两个都依赖于谷歌官方提供的插件(第一行)。所有Android模块与dependencies模块都依赖于这个插件产生。这里边有一些属性,最必要的两个是compileSdkVersion和buildToolsVersion。这两个属性分别代表为编译应用的Android API版本和用来构建编译的版本号。其他配置属性也可在AndroidManifest中备份。dependencies中是引入的第三方开源库,如okhttp、ButterKnife。 16.proguard定义proguard工具是用于压缩,优化,混淆我们的代码,主要作用是可以移除代码中的无用类,字段,方法和属性同时可以混淆。最终会使我们打包后的apk体积更加小,也可以让我们的apk更加难以反编译。这对于安全性很高的app非常重要。 17.proguard技术的功能<1>压缩:打包时通过proguard来检查并移除我们代码中没有用到的类和字段,方法,属性。因为我们在业务迭代的时候,有时会用到别人开发过的业务模块。有时你把它代码删了,即没有引用它时,这段代码其实是没用的。你把它删掉又怕以后会用到它。这时用到proguard技术,可以在打包的时候把那些无用的类直接删掉,同时又不会影响日常开发。这时proguard第一个作用。 <2>优化:它可以对我们通过Javac编译好的字节码文件进行优化。它可以移除无用的.class文件中的指令。 <3>混淆:我们如果使用那些没有意义的比如说1,2,3或a,b,c这些名称命名的话,我们的类,字段,方法就有可能重名。这时候即使我们的代码被反编译了,对方也很难读懂。这就是proguard的作用,它混淆,会把开发中有意义的名词变成无意义的名词。这样恶意的竞争对手反编译了apk,也无法知道我们的代码是做什么用的。 <4>预检测作用:在java平台上,对那些处理后的代码再次进行检测。 18.proguard混淆时机在正式发布应用市场打包才会混淆。调试的debug一般不用混淆。 19.proguard工作原理proguard工作原理讲解我们要引入一个EntryPoint这个概念。EntryPoint你可以把它理解成一种标志,它是在proguard过程中不会被处理的类和方法。在proguard进行压缩过程的时候,它会从上述的EntryPoint类中,开始搜索出哪些类和它的成员在使用。被标记为EntryPoint的类和方法,有些在使用,而且这些是在我们配置混淆文件中,配置不希望被混淆的类和方法。但是也有些它是没有使用的。对于那些没有使用的类和成员,就会在压缩阶段被我们的proguard所丢弃。这样,在进一步的proguard优化步骤当中那些不是EntryPoint的类,我们就会把它设置为private,而不使用参数都会被移除。最后proguard会对非EntryPoint类进行重命名,以便我们的预检测,来保证代码的稳定性。 20.为什么进行混淆我们知道java是种跨平台的解释性语言,而java的源代码,它会被编译成字节码,存储在我们的.class文件当中。由于跨平台的需要,java的字节码当中包含了很多源代码的信息,包括变量名,方法名等等。而且通过这些名称来访问变量和方法。这些符号有很多语义信息,其实是无用的。但是它有特别容易被反编译成java源代码。为了防止这种现象,我们就需要通过proguard来对java的字节码进行混淆。混淆就是对发布出去的程序进行重新的组织和处理。proguard作用就是对那些即将要发布出去的程序,即release程序进行重新的组织和处理,使得处理后的代码与处理前的代码,有相同的功能,但代码完全是不一样的。同时这个代码不容易被反编译。而且即使你反编译成功了,也很难读懂这个代码真正想要做的是什么。那些被混淆过的程序代码,仍然遵循原来的格式去执行。执行结果是一样的。所以这就是proguard作用,它对外保证了程序的安全性,对内是透明的,程序执行结果也是一样的。 |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 7:41:00- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |