写给Android初学者的基础总结(一)——Android的概述_android 继承于 linux,android 是基于 linux 的内核基础上运行的,提供的核-程序员宅基地

技术标签: 安卓  java  android  内核  Android一起来玩呀  程序人生  

Android简介

在这里插入图片描述
2003年10月,Andy Rubin等人一起创办了Android公司。2005年8月谷歌收购了这家仅仅成立了22个月的公司,并让Andy Rubin继续负责Android项目。在经过了数年的研发之后,谷歌终于在2008年推出了Android系统的第一个版本。但自那之后,Android的发展就一直受到重重阻挠。乔布斯自始至终认为Android是一个抄袭iPhone的产品,里面剽窃了诸多iPhone的创意,并声称一定要毁掉Android。而本身就是基于Linux开发的Android操作系统,在2010年被Linux团队从Linux内核主线中除名。又由于Android中的应用程序都是使用Java开发的,甲骨文则针对Android侵犯Java知识产权一事对谷歌提起了诉讼……

可是,似乎再多的困难也阻挡不了Android快速前进的步伐。由于谷歌的开放政策,任何手机厂商和个人都能免费获取到Android操作系统的源码,并且可以自由地使用和定制。三星、HTC、摩托罗拉、索爱等公司都推出了各自系列的Android手机,Android市场上百花齐放。仅仅推出两年后,Android就超过了已经霸占市场逾十年的诺基亚Symbian,成为了全球第一大智能手机操作系统,并且每天都还会有数百万台新的Android设备被激活。而近几年,国内的手机厂商也是大放异彩,小米、华为、魅族等新兴品牌都推出了相当不错的Android手机,并且也获得了市场的广泛认可,目前Android已经占据了全球智能手机操作系统70%以上的份额。

通信技术

在这里插入图片描述

Android起源

在这里插入图片描述
在这里插入图片描述

Android体系结构

在这里插入图片描述
为了让你能够更好地理解Android系统是怎么工作的,我们先来看一下它的系统架构。

Android大致可以分为四层架构:Linux内核层、系统运行库层、应用框架层和应用层。

  • 1.Linux内核层(Linux Kernel)
    Android系统是基于Linux内核的,这一层为Android设备的各种硬件提供了底层的驱动,如显示驱动、音频驱动、照相机驱动、蓝牙驱动、Wi-Fi驱动、电源管理等。
  • 2.核心类库层(Libraries)
    包含了系统库及Android运行环境
    这一层通过一些C/C++库来为Android系统提供了主要的特性支持。如SQLite库提供了数据库的支持,OpenGL|ES库提供了3D绘图的支持,Webkit库提供了浏览器内核的支持等。
    同样在这一层还有Android运行时库,它主要提供了一些核心库,能够允许开发者使用Java语言来编写Android应用。另外,Android运行时库中还包含了Dalvik虚拟机(5.0系统之后改为ART运行环境),它使得每一个Android应用都能运行在独立的进程当中,并且拥有一个自己的Dalvik虚拟机实例。相较于Java虚拟机,Dalvik是专门为移动设备定制的,它针对手机内存、CPU性能有限等情况做了优化处理。
  • 3.应用程序框架层(Application Framework)
    这一层主要提供了构建应用程序时可能用到的各种API, Android自带的一些核心应用就是使用这些API完成的,开发者也可以通过使用这些API来构建自己的应用程序。
  • 4.应用程序层(Applications)
    核心应用程序的集合
    所有安装在手机上的应用程序都是属于这一层的,比如系统自带的联系人、短信等程序,或者是你从Google Play上下载的小游戏,当然还包括你自己开发的程序。

Android已发布的版本

2008年9月,谷歌正式发布了Android 1.0系统,这也是Android系统最早的版本。随后的几年,谷歌以惊人的速度不断地更新Android系统,2.1、2.2、2.3系统的推出使Android占据了大量的市场。

2011年2月,谷歌发布了Android 3.0系统,这个系统版本是专门为平板电脑设计的,但也是Android为数不多的比较失败的版本,推出之后一直不见什么起色,市场份额也少得可怜。

不过很快,在同年的10月,谷歌又发布了Android 4.0系统,这个版本不再对手机和平板进行差异化区分,既可以应用在手机上,也可以应用在平板上。

2014年Google I/O大会上,谷歌推出了号称史上版本改动最大的Android 5.0系统,其中使用ART运行环境替代了Dalvik虚拟机,大大提升了应用的运行速度,还提出了Material Design的概念来优化应用的界面设计。除此之外,还推出了Android Wear、Android Auto、Android TV系统,从而进军可穿戴设备、汽车、电视等全新领域。之后Android的更新速度更加迅速,2015年Google I/O大会上推出了Android 6.0系统,加入运行时权限功能,2016年Google I/O大会上推出了Android 7.0系统,加入多窗口模式功能

下表列出了目前主要的Android系统版本及其详细信息。你看到这张表格时,数据可能已经发生了变化,查看最新的数据可以访问

http://developer.android.google.cn/about/dashboards/

在这里插入图片描述
从上表中可以看出,目前4.0以上的系统已经占据了超过98%的Android市场份额,因此我们开发的程序也只面向4.0以上的系统,2.x的系统就不再去兼容了。

Android应用开发特色

1.四大组件

Android系统四大组件分别是活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)和内容提供器(Content Provider)。

其中活动是所有Android应用程序的门面,凡是在应用中你看得到的东西,都是放在活动中的。

而服务就比较低调了,你无法看到它,但它会一直在后台默默地运行,即使用户退出了应用,服务仍然是可以继续运行的。

广播接收器允许你的应用接收来自各处的广播消息,比如电话、短信等,当然你的应用同样也可以向外发出广播消息。

内容提供器则为应用程序之间共享数据提供了可能,比如你想要读取系统电话簿中的联系人,就需要通过内容提供器来实现。

2.丰富的系统控件

Android系统为开发者提供了丰富的系统控件,使得我们可以很轻松地编写出漂亮的界面。当然如果你品位比较高,不满足于系统自带的控件效果,也完全可以定制属于自己的控件。

3.SQLite数据库

Android系统还自带了这种轻量级、运算速度极快的嵌入式关系型数据库。它不仅支持标准的SQL语法,还可以通过Android封装好的API进行操作,让存储和读取数据变得非常方便。

4.强大的多媒体

Android系统还提供了丰富的多媒体服务,如音乐、视频、录音、拍照、闹铃,等等,这一切你都可以在程序中通过代码进行控制,让你的应用变得更加丰富多彩。

5.地理位置定位

移动设备和PC相比起来,地理位置定位功能应该可以算是很大的一个亮点。现在的Android手机都内置有GPS,走到哪儿都可以定位到自己的位置,发挥你的想象就可以做出创意十足的应用,如果再结合功能强大的地图功能,LBS这一领域潜力无限。

Dalvik虚拟机

在这里插入图片描述
每一个Dalvik虚拟机实例都是一个独立的进程空间,每个进程之间可以通信

Android调试桥(ADB)

在这里插入图片描述

Android程序打包过程

Android程序开发完成后,如果要发布到互联网上供别人使用,就需要将自己的程序打包成正式的Android安装包文件(Android Package简称APK),其后缀名“.apk”。

使用run as也能生成一个apk安装包,但是使用run as生成的是测试的安装包,只供开发者自己测试使用。

搭建开发环境

开发Android程序需要准备哪些工具

  • JDK
    JDK是Java语言的软件开发工具包,它包含了Java的运行环境、工具集合、基础类库等内容。需要注意的是,Android程序必须要使用JDK 8或以上版本
  • Android SDK
    Android SDK是谷歌提供的Android开发工具包,在开发Android程序时,我们需要通过引入该工具包,来使用Android相关的API。
  • Android Studio
    在很早之前,Android项目都是用Eclipse来开发的,相信所有Java开发者都一定会对这个工具非常熟悉,它是Java开发神器,安装ADT插件后就可以用来开发Android程序了。
    而在2013年的时候,谷歌推出了一款官方的IDE工具Android Studio,由于不再是以插件的形式存在,Android Studio在开发Android程序方面要远比Eclipse强大和方便得多。不过由于Android Studio早期的测试版本并不是非常稳定,所以本书的第1版仍然选用Eclipse来作为开发工具。而如今,Android Studio已经推出了2.2版本,稳定性完全不再是问题,普及程度方面也远超Eclipse,没有比现在更适合的时机来换用Android Studio了,因此接下来所有的代码都将在AndroidStudio上进行开发。

AS下载地址

模拟器创建

在这里插入图片描述
在这里插入图片描述
随便选一种机型(如果你是为了针对某个具体的机型测试,那就选择目标机型的类型就行,我这里只是演示一下),然后Next
在这里插入图片描述
根据实际情况选一个系统镜像
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
接下来我们可以看到刚才创立好的模拟器,还有之前提到的移动通信技术LTE、GSM等
在这里插入图片描述
模拟器的名字可以自己随便改,也可以不改,我这里命名为Richard
在这里插入图片描述
可以看到,现在模拟器列表中已经存在一个创建好的模拟器设备了,点击Actions栏目中最左边的三角形按钮即可启动模拟器。模拟器会像手机一样,有一个开机过程

现在我们运行玩一玩
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

小整蛊

在这里插入图片描述在这里插入图片描述
由于我室友总是不一次性把上课作业告我,所以我用110吓唬她,说我向110举报她
在这里插入图片描述
虽然有些小幼稚,但是能玩起来Android还是蛮有意思的

一波骚操作如下:
在这里插入图片描述

下载SDK版本

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

下载Tools工具

打开这个界面的方式同上
在这里插入图片描述
在这里插入图片描述

争做与众不同的初学者的第一个Android程序

在这里插入图片描述
在这里插入图片描述
填一下基本信息

Package name表示项目的包名,Android系统就是通过包名来区分不同应用程序的,因此包名一定要具有唯一性。
在这里插入图片描述
在这里插入图片描述
图1
图1
看厌了市面上方方正正Hello World,这一款我不信你不服!(点赞收藏三连别忘啦~)

分析你的第一个Android程序

任何一个新建的项目都会默认使用Android模式的项目结构,但这并不是项目真实的目录结构,而是被Android Studio转换过的。这种项目结构简洁明了,适合进行快速开发,但是对于新手来说可能并不易于理解。我们可以切换项目结构模式
在这里插入图片描述
这里我们将项目结构模式切换成Project,这就是项目真实的目录结构了
在这里插入图片描述

Android的程序结构

  • 1..gradle和.idea
    这两个目录下放置的都是Android Studio自动生成的一些文件,我们无须关心,也不要去手动编辑。

  • 2.app
    项目中的代码、资源等内容几乎都是放置在这个目录下的,我们后面的开发工作也基本都是在这个目录下进行的

  • 3.build
    这个目录你也不需要过多关心,它主要包含了一些在编译时自动生成的文件。

  • 4.gradle
    这个目录下包含了gradle wrapper的配置文件,使用gradle wrapper的方式不需要提前将gradle下载好,而是会自动根据本地的缓存情况决定是否需要联网下载gradle。Android Studio默认没有启用gradle wrapper的方式,如果需要打开,可以点击Android Studio导航栏→File→Settings→Build, Execution,Deployment→Gradle,进行配置更改。

  • 5..gitignore
    这个文件是用来将指定的目录或文件排除在版本控制之外的

  • 6.build.gradle
    这是项目全局的gradle构建脚本,通常这个文件中的内容是不需要修改的。

  • 7.gradle.properties
    这个文件是全局的gradle配置文件,在这里配置的属性将会影响到项目中所有的gradle编译脚本。

  • 8.gradlew和gradlew.bat
    这两个文件是用来在命令行界面中执行gradle命令的,其中gradlew是在Linux或Mac系统中使用的,gradlew.bat是在Windows系统中使用的

  • 9.HelloWorld.iml
    iml文件是所有IntelliJ IDEA项目都会自动生成的一个文件(Android Studio是基于IntelliJ IDEA开发的),用于标识这是一个IntelliJ IDEA项目,我们不需要修改这个文件中的任何内容。

  • 10.local.properties
    这个文件用于指定本机中的Android SDK路径,通常内容都是自动生成的,我们并不需要修改。除非你本机中的Android SDK位置发生了变化,那么就将这个文件中的路径改成新的位置即可。

  • 11.settings.gradle
    这个文件用于指定项目中所有引入的模块。由于HelloWorld项目中就只有一个app模块,因此该文件中也就只引入了app这一个模块。通常情况下模块的引入都是自动完成的,需要我们手动去修改这个文件的场景可能比较少。

现在整个项目的外层目录结构已经介绍完了。你会发现,除了app目录之外,大多数的文件和目录都是自动生成的,我们并不需要进行修改。想必你已经猜到了,app目录下的内容才是我们以后的工作重点
在这里插入图片描述
那么下面我们就来对app目录下的内容进行更为详细的分析。

  • 1.build
    这个目录和外层的build目录类似,主要也是包含了一些在编译时自动生成的文件,不过它里面的内容会更加更杂,我们不需要过多关心。
  • 2.libs
    如果你的项目中使用到了第三方jar包,就需要把这些jar包都放在libs目录下,放在这个目录下的jar包都会被自动添加到构建路径里去。
  • 3.androidTest
    此处是用来编写Android Test测试用例的,可以对项目进行一些自动化测试。
  • 4.java
    毫无疑问,java目录是放置我们所有Java代码的地方,展开该目录,你将看到我们刚才创建的MainActivity文件就在里面。
  • 5.res
    这个目录下的内容就有点多了。简单点说,就是用于存放程序的资源文件,你在项目中使用到的所有图片、布局、字符串等资源都要存放在这个目录下。当然这个目录下还有很多子目录,图片放在drawable目录下,布局放在layout目录下,字符串放在values目录下,所以你不用担心会把整个res目录弄得乱糟糟的。
    在这里插入图片描述
  • 6.AndroidManifest.xml
    这是你整个Android项目的配置文件,你在程序中定义的所有四大组件都需要在这个文件里注册,另外还可以在这个文件中给应用程序添加权限声明。由于这个文件以后会经常用到,我们用到的时候再做详细说明。
    在这里插入图片描述
  • 7.test
    此处是用来编写Unit Test测试用例的,是对项目进行自动化测试的另一种方式。
  • 8..gitignore
    这个文件用于将app模块内的指定的目录或文件排除在版本控制之外,作用和外层的.gitignore文件类似。
  • 9.app.iml
    IntelliJ IDEA项目自动生成的文件,我们不需要关心或修改这个文件中的内容。
  • 10.build.gradle
    这是app模块的gradle构建脚本,这个文件中会指定很多项目构建相关的配置
  • 11.proguard-rules.pro
    这个文件用于指定项目代码的混淆规则,当代码开发完成后打成安装包文件,如果不希望代码被别人破解,通常会将代码进行混淆,从而让破解者难以阅读。

接下来我们一起分析一下HelloAndroid项目究竟是怎么运行起来的吧。首先打开Android-Manifest.xml文件,从中可以找到如下代码:
在这里插入图片描述
这段代码表示对MainActivity这个活动进行注册,没有在AndroidManifest.xml里注册的活动是不能使用的。其中intent-filter里的两行代码非常重要,
< action android:name=“android.intent.action.MAIN” / >

< category android:name=“android.intent.category. LAUNCHER” / >
表示MainActivity是这个项目的主活动,在手机上点击应用图标,首先启动的就是这个活动。

那MainActivity具体又有什么作用呢?我在介绍Android四大组件的时候说过,活动是Android应用程序的门面,凡是在应用中你看得到的东西,都是放在活动中的。因此你在图1中看到的界面,其实就是MainActivity这个活动。那我们快去看一下它的代码吧,打开MainActivity,代码如下所示:
在这里插入图片描述
截取其中的主要部分分析

public class MainActivity extends AppCompatActivity {
    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

首先我们可以看到,MainActivity是继承自AppCompatActivity的,这是一种向下兼容的Activity,可以将Activity在各个系统版本中增加的特性和功能最低兼容到Android 2.1系统。

Activity是Android系统提供的一个活动基类,我们项目中所有的活动都必须继承它或者它的子类才能拥有活动的特性(AppCompatActivity是Activity的子类)。

然后可以看到HelloWorldActivity中有一个onCreate()方法,这个方法是一个活动被创建时必定要执行的方法,其中只有两行代码,并且没有Hello Android!的字样。那么图1中显示的Hello Android!是在哪里定义的呢?

其实Android程序的设计讲究逻辑和视图分离,因此是不推荐在活动中直接编写界面的,更加通用的一种做法是,在布局文件中编写界面,然后在活动中引入进来。可以看到,在onCreate()方法的第二行调用了setContentView()方法,就是这个方法给当前的活动引入了一个activity_main布局,那Hello Android!一定就是在这里定义的了!我们快打开这个文件看一看。

布局文件都是定义在res/layout目录下的,当你展开layout目录,你会看到activity_main.xml这个文件。
在这里插入图片描述
打开该文件并切换到Code视图,代码如下所示:
在这里插入图片描述
现在还看不懂?没关系,后面我会对布局进行详细讲解的,你现在只需要看到上面代码中有一个Code,这是Android系统提供的一个控件,用于在布局中显示文字的。然后你终于在TextView中看到了Hello Android!的字样!哈哈!终于找到了,原来就是通过android:text="Hello Android!"这句代码定义的。

详解项目中的资源

在这里插入图片描述
看到这么多的文件夹也不用害怕,其实归纳一下,res目录就变得非常简单了。

所有以drawable开头的文件夹都是用来放图片的,所有以mipmap开头的文件夹都是用来放应用图标的,所有以values开头的文件夹都是用来放字符串、样式、颜色等配置的,layout文件夹是用来放布局文件的。

怎么样,是不是突然感觉清晰了很多?

之所以有这么多mipmap开头的文件夹,其实主要是为了让程序能够更好地兼容各种设备。drawable文件夹也是相同的道理,虽然Android Studio没有帮我们自动生成,但是我们应该自己创建drawable-hdpi、drawable-xhdpi、drawable-xxhdpi等文件夹。

在制作程序的时候最好能够给同一张图片提供几个不同分辨率的版本,分别放在这些文件夹下,然后当程序运行的时候,会自动根据当前运行设备分辨率的高低选择加载哪个文件夹下的图片。当然这只是理想情况,更多的时候美工只会提供给我们一份图片,这时你就把所有图片都放在drawable-xxhdpi文件夹下就好了。

知道了res目录下每个文件夹的含义,我们再来看一下如何去使用这些资源吧。打开res/values/strings.xml文件,内容如下所示:

<resources>
    <string name="app_name">HelloAndroid</string>
</resources>

可以看到,这里定义了一个应用程序名的字符串,我们有以下两种方式来引用它。

❑ 在代码中通过R.string.app_name可以获得该字符串的引用。

❑ 在XML中通过@string/app_name可以获得该字符串的引用。

基本的语法就是上面这两种方式,其中string部分是可以替换的,如果是引用的图片资源就可以替换成drawable,如果是引用的应用图标就可以替换成mipmap,如果是引用的布局文件就可以替换成layout,以此类推。

下面举一个简单的例子来帮助你理解,打开AndroidManifest.xml文件,找到如下代码:
在这里插入图片描述
其中,HelloWorld项目的应用图标就是通过android:icon属性来指定的,应用的名称则是通过android:label属性指定的。可以看到,这里对资源引用的方式正是在XML中引用资源的语法。

详解build.gradle文件

不同于Eclipse, Android Studio是采用Gradle来构建项目的。Gradle是一个非常先进的项目构建工具,它使用了一种基于Groovy的领域特定语言(DSL)来声明项目设置,摒弃了传统基于XML(如Ant和Maven)的各种烦琐配置。

HelloAndroid项目中有两个build.gradle文件,一个是在最外层目录下的,一个是在app目录下的。
在这里插入图片描述
这两个文件对构建Android Studio项目都起到了至关重要的作用,下面我们就来对这两个文件中的内容进行详细的分析。

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    
    repositories {
    
        google()
        jcenter()
    }
    dependencies {
    
        classpath "com.android.tools.build:gradle:4.1.0"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    
    repositories {
    
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    
    delete rootProject.buildDir
}

这些代码都是自动生成的,虽然语法结构看上去可能有点难以理解,但是如果我们忽略语法结构,只看最关键的部分,其实还是很好懂的。

首先,两处repositories的闭包中都声明了jcenter()这行配置,那么这个jcenter是什么意思呢?其实它是一个代码托管仓库,很多Android开源项目都会选择将代码托管到jcenter上,声明了这行配置之后,我们就可以在项目中轻松引用任何jcenter上的开源项目了。

接下来,dependencies闭包中使用classpath声明了一个Gradle插件。为什么要声明这个插件呢?因为Gradle并不是专门为构建Android项目而开发的,Java、C++等很多种项目都可以使用Gradle来构建。因此如果我们要想使用它来构建Android项目,则需要声明com.android.tools.build:gradle:4.1.0这个插件。其中,最后面的部分是插件的版本号,即4.1.0

这样我们就将最外层目录下的build.gradle文件分析完了,通常情况下你并不需要修改这个文件中的内容,除非你想添加一些全局的项目构建配置。

下面我们再来看一下app目录下的build.gradle文件,
在这里插入图片描述
代码如下所示:

plugins {
    
    id 'com.android.application'
}

android {
    
    compileSdkVersion 30
    buildToolsVersion "30.0.2"

    defaultConfig {
    
        applicationId "lntu.sc"
        minSdkVersion 16
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    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.2.0'
    implementation 'com.google.android.material:material:1.2.1'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}

这个文件中的内容就要相对复杂一些了,下面我们一行行地进行分析。首先第一行应用了一个插件,一般有两种值可选:com.android.application表示这是一个应用程序模块,com.android.library表示这是一个库模块。应用程序模块和库模块的最大区别在于,一个是可以直接运行的,一个只能作为代码库依附于别的应用程序模块来运行。

接下来是一个大的android闭包,在这个闭包中我们可以配置项目构建的各种属性。其中,compileSdkVersion用于指定项目的编译版本,这里指定成30表示使用Android 11.0系统的SDK编译。buildToolsVersion用于指定项目构建工具的版本,目前最新的版本就是30.0.2,如果有更新的版本时,Android Studio会进行提示。

然后我们看到,这里在android闭包中又嵌套了一个defaultConfig闭包,defaultConfig闭包中可以对项目的更多细节进行配置。

其中,applicationId用于指定项目的包名,前面我们在创建项目的时候其实已经指定过包名了,如果你想在后面对其进行修改,那么就是在这里修改的。

minSdkVersion用于指定项目最低兼容的Android系统版本,这里指定成16表示最低兼容到Android 4.1系统。

targetSdkVersion指定的值表示你在该目标版本上已经做过了充分的测试,系统将会为你的应用程序启用一些最新的功能和特性。比如说Android 6.0系统中引入了运行时权限这个功能,如果你将targetSdkVersion指定成23或者更高,那么系统就会为你的程序启用运行时权限功能,而如果你将targetSdkVersion指定成22,那么就说明你的程序最高只在Android 5.1系统上做过充分的测试,Android 6.0系统中引入的新功能自然就不会启用了。

剩下的两个属性都比较简单,versionCode用于指定项目的版本号,versionName用于指定项目的版本名,这两个属性在生成安装文件的时候非常重要,我们在后面都会学到。

分析完了defaultConfig闭包,接下来我们看一下buildTypes闭包。

buildTypes闭包中用于指定生成安装文件的相关配置,通常只会有两个子闭包,一个是debug,一个是release。

debug闭包用于指定生成测试版安装文件的配置,release闭包用于指定生成正式版安装文件的配置。另外,debug闭包是可以忽略不写的,因此我们看到上面的代码中就只有一个release闭包。

下面来看一下release闭包中的具体内容吧,minifyEnabled用于指定是否对项目的代码进行混淆,true表示混淆,false表示不混淆。

proguardFiles用于指定混淆时使用的规则文件,这里指定了两个文件,第一个proguard-android-optimize.txt是在Android SDK目录下的,里面是所有项目通用的混淆规则,第二个proguard-rules.pro是在当前项目的根目录下的,里面可以编写当前项目特有的混淆规则。需要注意的是,通过Android Studio直接运行项目生成的都是测试版安装文件

这样整个android闭包中的内容就都分析完了,接下来还剩一个dependencies闭包。

这个闭包的功能非常强大,它可以指定当前项目所有的依赖关系。通常Android Studio项目一共有3种依赖方式:本地依赖、库依赖和远程依赖。

本地依赖可以对本地的Jar包或目录添加依赖关系,库依赖可以对项目中的库模块添加依赖关系,远程依赖则可以对jcenter库上的开源项目添加依赖关系。

Android版本对应的API表

在这里插入图片描述

图片资源

在这里插入图片描述
在这里插入图片描述

布局资源(重点是java代码调用方式)

在这里插入图片描述

字符串资源

在这里插入图片描述
在这里插入图片描述

LogCat的使用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
详情请看我的这篇博客
关于Android初学者需要知道的基础知识日志过滤器LogCat以及Android Studio相关快捷键与提高效率的设置Setting(二)

本文部分参考了国内外重要著作,这里就不一一列举了,主要是太多太杂了

之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!(▔▽▔)感谢支持!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_44631615/article/details/115281463

智能推荐

编译 Hadoop Eclipse Plugin-程序员宅基地

文章浏览阅读921次。1.首先从 git 下载源码 下载地址: https://github.com/winghc/hadoop2x-eclipse-plugin百度网盘下载: 链接:http://pan.baidu.com/s/1o6DMY4U 密码:y95i下载 ant-1.9.6 下载地址:http://mirrors.noc.im/apache//ant/binaries/apache-ant-1

Github删除仓库_这个仓库好像已经被从文件系统中删除,或者被移动到了其他地方。 你要删除这个标签-程序员宅基地

文章浏览阅读642次。既然写到了github这一块的知识点,那么,简单的说一下怎么删除一个仓库(项目)1:创建一个仓库2:填写仓库的名称3:创建完成4:如果要删除这个仓库的话,进入settings拉到最底下的Danger Zone5:输入仓库名称,Repository name,我的仓库名称是protest,删除即可原文作者:祈澈姑娘 技术博..._这个仓库好像已经被从文件系统中删除,或者被移动到了其他地方。 你要删除这个标签

引用 android string.xml文件中的整型和string型代替_android string.xml中引用其他值-程序员宅基地

文章浏览阅读4k次。在android的开发中,经常会遇见一句话,比如“我今年23岁了”;这个23需要在程序中生成,但是遇到一个问题,这完整的一句话是一个TextView中的,而不是三个textView拼接成的,而且是引用的string.xml文件中写好的;使用字符串拼接也可以实现,但是特别麻烦;今天遇到一个好方法,在string.xml中,不仅可以设置文字的格式换行等,还可以设置类似于变量的文本格式;_android string.xml中引用其他值

Hook 入门_hook入门-程序员宅基地

文章浏览阅读415次。Hook 简介为什么使用hook类组件和函数组件的区别没有破坏性改动Hook 使用规则useStateuseEffect自定义 HookuseRefuseContext为什么使用hookHook 是 React 16.8 的新增特性,是一些可以让你在函数组件里“钩入” React state 及生命周期等特性的函数。类组件和函数组件的区别详细参考 How Are Function Components Different from Classes?, 感兴趣的同学可以直接看原文。区别类组_hook入门

cruiscontroller的理解和学习_cruisbr-x-程序员宅基地

文章浏览阅读492次。CruiseControl:简称CC,持续集成工具,主要提供了基于版本管理工具(如CVS)感知变化或每天定时的持续集成,并提供持续集成报告、Email、Jabber等等方式通知相关负责人,其要求是需要进行日构建的项目已编写好全自动的项目编译脚本(可基于Maven或Ant)。在这里以一个项目来简要的说说cc的使用,通常项目对于日构建的类型的需求分为两种:1、每天的定时自动集成。2、感知版_cruisbr-x

《图形编程技术学习》(八)Windows配置freeglut、MAC配置freeglut以及配置glut_windows freeglut-程序员宅基地

文章浏览阅读834次。一.Windows配置freeglutWindows:1.下载Freeglut源码:http://freeglut.sourceforge.net/,2.VS2015中编译该源码工程,生成.lib和.dll文件(.h文件就在源码中)。(你也可以下载最新的,但相应操作可能会有所不同)3.将三类文件拷贝到相应目录下就完成了安装。具体 而言:如果是32位版本,则:1.\inc..._windows freeglut

随便推点

3.2.2 Python之pandas详解1-Series_from pandas import series什么意思-程序员宅基地

文章浏览阅读432次。Pandas是基于NumPy的一个常用库。之所以如此,是因为不论是读取还是处理数据,用它都非常简单。1,pandas基本数据结构Pandas有两种自己独有的基本数据结构。pandas虽然有两种数据结构,因为他是Python的一个库,所以Python的数据类型在这里依然适用,同样还可以使用类自己定义数据类型。Pandas里面又定义了两种数据类型:Series和DataFrame基本的导入方式:fro..._from pandas import series什么意思

【UE4 shader】扰动水流Shader_ue扰动-程序员宅基地

文章浏览阅读1.1w次,点赞11次,收藏81次。关键词:Fresnel(Lerp)、噪波(Panner Rotate TexCoord Time)、半透明、反射(屏幕空间反射SSR)、折射(Lerp IOR)、边缘波浪(世界位置偏移)、水波法线 、颜色变化-------------------------------------------------------------------------------Fresnel:用Lerp_ue扰动

利用tensorflow训练自己的图片数据集——数据准备_tensorflow训练自己的图库-程序员宅基地

文章浏览阅读2.3w次,点赞15次,收藏172次。昨天实现了一个简单的CNN网络。用了MNIST数据集,虽然看来对这个数据集用的很多,但是真正这个数据集是怎么在训练的时候被调用的,以及怎么把它换成自己的数据集都是一脸懵。直接附上链接:MNIST数据集解析作者给的代码是python2.x版本的,我用的python3.5,改了一些错误。import numpy as npimport structimport osimport m..._tensorflow训练自己的图库

day15_常用API-程序员宅基地

文章浏览阅读51次。day15_常用APIStringString是 java.lang.String , 使用不需要导包String是字符串类,是引用类型,底层是char数组,所以String的特性几乎和数组一致1 字符串一旦创建,该字符串对象不能更改2 为了提高字符串的访问效率,java虚拟机使用了一种缓存技术,可以对字符串操作更加简单方便,更加高效(字符串常量池)3 字符串会被保存在静态区中的常量池中,可以复用性增强当我们用到一个重复的字符串的时候,会去常量池中进行检索,如果有该字符串,则直接指向,如果

日常运维管理技巧十(linux下抓包 tcpdump)_tcpdump -nni-程序员宅基地

文章浏览阅读1.4k次。十、linux下抓包tcpdump命令是一款抓包工具,它可以打印所有经过网络接口的数据包的头信息,也可以使用-w选项将数据包保存到文件中,方便以后分析。1、tcpdump工具需要自行安装:# yum install -y tcpdump格式:tcpdump 选项可用选项,常见的我用红色标出:-a:尝试将网络和广播地址转换成名称;-c&lt;数据包数量&gt;:收到指定的..._tcpdump -nni

win7免费升级到win10专业版(正,亲测有用)_win7离线升级win10安装包-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏10次。工具: MediaCreationTool20H2.exe_win7离线升级win10安装包

推荐文章

热门文章

相关标签