安卓开发 开发前你需要了解的一些资料(一)

前言

  在安卓开发 初步了解安卓和配置安卓环境中,我们简单的介绍了安卓和配置安卓环境。我们使用了Android Studio作为我们开发安卓的主要工具。所以,在本次中依旧使用Android Stuido。

了解 JDK、SDK、NDK

JDK

  JDK是JAVA语言的编译器,全称为Java Development Kit,即Java开发工具包。因为Android应用层采用Java开发,其运行在Java虚拟机(Dalvik虚拟机,与JVM虚拟机不同)上。关于JDK如何安装请看了解记录三 JAVA环境安装(1.8示例)
  JDK建议安装1.8及其以上版本,因为不同的Android版本对JDK有相应的要求,例如Android 5.0默认使用JDK1.7编译,Android 7.0默认使用JDK1.8编译。
  如果JDK为1.6或者1.78,而SDK为最新版本,就可能会导致一下问题。
  (1)创建项目后,浏览布局文件设计图时会报错Android N requires the IDE to be running with Java 1.8 or later.
  (2)编译项目失败,提示错误 com/android/dx/command/dexer/Main: Unsupported major.minor version 52.0.
  (3)运行App失败,提示错误complieSdkVersion 'android-24' requires JDK 1.8 or later to compile.

SDK

  SDK是Android应用的编译器,全称为 Software Development Kit,即软件开发工具包。SDK提供了App开发的常用工具合集。


SDK目录

其中主要包括:

  • add-ones 目录: 存放Google提供的服务扩展包。(Eclipse存在,Android Studio已经移动到其它地方去了。)
  • build-tools 目录: 存放各版本Android的各种编译工具。
  • docs 目录: 存放开发说明文档。
  • extras目录: 存放Android附加支持文件。主要有Android 的 support 支持包,Google 的几个工具和驱动、Intel 的 IntelHaxm。
  • platforms 目录: 存放各个版本的Android资源文件。包括字体、res 资源、模板等。
  • platform-tools和tools 目录,存放常用的开发辅助工具。十分重要。
  • samples 目录:存放各版本Android常用功能的demo 源码。
  • sources 目录: 存放各版本Android的API开发接口源码。
  • system-images 目录:存放模拟器各版本的系统镜像与管理工具。
  • emulator 目录: 存放模拟器软件。
  • patcher:存放补丁文件夹。(我也不知道是啥,翻译过来就是补丁)
  • cmake:存放跨平台的编译工具,用来编译C/C++代码。
  • ndk : 存放NDK开发工具。
  • fonts:存放字体。
  • licenses:存放SDK的验证,文件中存放着SKD的校验码。
  • lldb:存放c/c++调试器,用于NDK的调试。
  • skins:皮肤文件夹,存放一些虚拟机的效果图片。
    (注:图片中仅仅是刚安装上的SDK。后面下载会会新添一些文件。例如安装了NDK的话就会存在ndk文件夹。)

NDK

  NDK是C\C++代码的编译器,全称Native Development Kit。即原生开发工具包。该工具主要提供JNI接口使用,先将C\C++代码编译成so库,然后由Java代码通过JNI接口调用so库。
  因为Java字节码极其容易反编译查看到源代码,所以利用C\C++编译出来的so库可以存放一些核心代码,so库与Java字节码更难破解。且C\C++运行速度比Java快,可以编写一些处理量比较大、耗时的数据。(例如,音频,视频的处理运算。)

简单了解Gradle

  Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置。其主要用于描述Android开发所需要的环境,管理第三方jar包,第三方扩展库,jar依赖关系等。

了解开发App的工程结构

  Android Studio的工程创建分成了两个层次。
第一层次是Project(项目),指定了当前项目的工作空间。其相当于Eclipse的workspace。
第二层次是Module(模块),指定了当前项目中的模块,其中一个模块指一个单独的App工程。但也可以通过模块化编程合为一个App。其相当于Eclipse的project。

Project结构图

  从结构图中可以看到,该项目下有4个文件夹,其中.gradle用来保存gradle的依赖信息,.idea用来保存开发工具的设置信息。而app是我们主要开发的文件夹,gradle是存放gradle的文件。我们只要关心app文件夹即可。
  不过呢,还是要需要了解一些其根目录下的一些文件。

  • .gitignore 文件:指明git忽略文件清单,其指定的文件夹不会上传到仓库中。

  • Account.iml 文件:是项目用于保存开发工具信息的文件。其文件名是项目名。

  • build.gradle 文件:项目级编译规则文件,用于描述整个项目工程的编译规则。

  • proguard-rules.pro 文件:用于描述Java文件的代码混淆规则。

  • gradle.properties 文件:用于配置编译工程的命令行参数,一般无需改动。

  • gradlew 文件: Gradle Wrapper,用于是Gradle本身的安装、部署。其为Linux 下可执行脚本。

  • gradlew.bat 文件: Gradle Wrapper,用于是Gradle本身的安装、部署。其为Windows下可执行脚本。

  • local.properties 文件: 用于描述开发者本机的环境配置。SDK、NDK等指定路径就该文件中。

  • settings.gradle 文件:配置哪些模块一起编译。初始内容为include ':app',表示只编译App模块。

  其实app文件夹就是一个Module。当我们在创建一个新的Project时,就创建了一个默认的Module。其就是app文件夹。


Module结构图

其中主要包括:

  • build 目录:存放编译构建后的文件。
  • libs 目录:存放第三方jar包。
  • src 目录:源文件。
  • build.gradle 文件:当前Module的配置文件。

其中src目录和build.gradle文件比较重要。下面会仔细讲解。
  src文件夹包含了androidTest文件夹、main文件夹(重要!)、test文件夹。

  • androidTest 目录:安卓单元测试。其主要涉及Android仪器的单元测试。
  • main 目录:开发目录。
  • test 目录:单元测试。其不包含安卓的框架测试。

其中androidTest和test主要包含了java目录,其中包含着相对应的测试。而main是我们主要的开发目录。主要包括如下:

  • java 目录:主要存放java文件。其目录下是包名。

  • res 目录: 安卓资源文件夹。主要存放布局资源,图片资源等等。

  • res\drawable 目录: 存放图形描述文件与用户图片。其中后面跟随着的hdpi、mdpi、xhdpi、xxhdpi等等都是指图片的分辨率,相对应的图片应该放入相对应的文件夹中。

  • res\mipmap 目录:app的图标文件夹。存放app的图标。其同drawable文件夹一样,都有着相对应的分辨率文件夹。

  • res\layout 目录:存放app页面的布局文件。

  • res\values 目录:存放的是一些常量定义文件。例如字符串常量定义string.xml,像素常量dimens.xml、颜色常量colors.xml,样式风格styles.xml等。

  • AndroidManifest.xml 文件:安卓清单文件。(重要!指定其内部的运行配置!)

AndroidManifest.xml部分说明:
  AndroidManifest.xml 用于指定App内部的运行配置,其是一个XML描述文件,根节点为manifest,根节点的package 指定了该App的包名。manifest下面又有若干个子节点,分别说明如下。
(一份当前我制作app的AndroidManifest.xml文件内容)

<?xml version="1.0" encoding="utf-8"?><!--说明xml文件的版本和编码格式-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:dist="http://schemas.android.com/apk/distribution"
    package="com.palz.account"><!--根节点,指定app的包名-->

    <dist:module dist:instant="true" /><!--模块化结点,指定Goolge Play免安装-->
    
    <!--应用根结点-->
    <application 

        <!--允许备份-->
        android:allowBackup="true"

        <!--指定app的启动图标-->
        android:icon="@mipmap/ic_launcher"

        <!--指定app的名称-->
        android:label="@string/app_name"

        <!--指定app的圆形图标-->
        android:roundIcon="@mipmap/ic_launcher_round"

        <!--是否愿意支持从右到左(RTL是right-to-left 的缩写)的布局-->
        android:supportsRtl="true"

        <!--指定app的主题-->
        android:theme="@style/AppTheme">

        <!--活动根结点-->
        <activity android:name=".MainActivity">
            <!--Intent过滤器根结点:只有符合相对应的要求才能通过Intent启动活动-->
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest>

其中, AndroidManifest.xml 能够包含的节点有:

<?xml version="1.0" encoding="utf-8"?>

<manifest>

    <dist:module>
        <dist:delivery>
          <dist:install-time>
            <dist:conditions>
              <!-- Requires that the device support AR to download the module at
              app install-time.  -->
              <dist:device-feature />
            </dist:conditions>
          </dist:install-time>
        </dist:delivery>
      </dist:module>

    <uses-permission />
    <permission />
    <permission-tree />
    <permission-group />
    <instrumentation />
    <uses-sdk />
    <uses-configuration /> 
    <uses-feature /> 
    <supports-screens /> 
    <compatible-screens /> 
    <supports-gl-texture /> 

    <application>

        <activity>
            <intent-filter>
                <action />
                <category />
                <data />
            </intent-filter>
            <meta-data />
        </activity>

        <activity-alias>
            <intent-filter>. . .</intent-filter>
            <meta-data />
        </activity-alias>

        <service>
            <intent-filter>. . .</intent-filter>
            <meta-data/>
        </service>

        <receiver>
            <intent-filter>. . .</intent-filter>
            <meta-data />
        </receiver>

        <provider>
            <grant-uri-permission />
            <meta-data />
            <path-permission />
        </provider>

        <uses-library />

    </application>

</manifest>

下面介绍几个常用的标签节点

  1. manifest 标签:
      manifest标签是AndroidManifest.xml 的根节点标签。其常用于设置与项目相关的一些属性。例如比如用于唯一标识应用程序的 package 属性,用于记录应用程序版本的 Android:versionName 属性等等。
      其中xmls:android属性必须为http://schemas.android.com/apk/res/android,
      xmlns:dist属性必须为http://schemas.android.com/apk/distribution
    其用于表示命名空间。
  2. application 标签:
       manifest 标签中有且只有一个 application 标签。其用于指定应用程序的各种元数据(包括标题、图标和主题)。同时也可以作为活动(Activity),服务(Service),内容提供器(Provider)和广播接收器(Broadcast Receiver)标签的容器,用于指示应用程序组件。
  3. uses-permission 标签:
      uses-permission标签用于指明程序会使用到的权限。而这些权限是应用正常运行所必须的。。
  4. permission 标签:
      permission 标签用于指明其它程序访问你的组件时所需要的权限,当你提供了其它功能给其它软件时,其它软件需要在清单文件(AndroidManifest.xml)中指明其permission才可以访问到你的组件功能或者数据。
    5.instrumentation 标签:
      instrumentation 标签其指明了instrumentation 类的测试类。instrumentation 类提供一个框架,用来在应用程序运行时在活动或者服务上运行测试,可以通过它来监控应用程序及其与系统资源的交互。每当应用程序新添一个测试类时,需要为其新添一个节点。

app中所包含的目录介绍到这里。下面介绍一下啊app根目录下的几个文件:

  • build.gradle 文件:该文件用于App工程的编译规则。

  • .gitignore 文件: 该文件用于指明git忽略清单,其包含的文件不会上传到仓库中。

  • gradle.properties 文件:该文件用于配置编译工程的命令行参数,一般无需改动。

  • app.iml 文件:用来保存开发工具信息。该文件名是当前模块名。

其中最为重要的是build.gradle。下面简单的介绍一下build.gradle文件:
  build.gradle分为项目级别和模块级别,项目级别的我们一般无需改动,我们只需要关注模块级别的build.gradle即可。
(一份当前我在制作app的build.gradle的文件(app模块))

apply plugin: 'com.android.application'//指明module的类型,com.android.application为程序,com.android.library为安卓库

android {
    compileSdkVersion 29//编译的SDK版本
    buildToolsVersion "29.0.3"//编译的Tools版本
    defaultConfig {
        applicationId "com.palz.account"//应用程序的包名
        minSdkVersion 15 //最低支持的目标版本
        targetSdkVersion 29//当前最高支持的目标版本
        versionCode 1 //版本号
        versionName "1.0"//版本名
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"//安卓测试库
    }
    buildTypes {//build类型
        release {//发布
            minifyEnabled false //是否开启混淆代码功能
            //指定代码混淆规则文件的文件名
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {//指定App的编译信息
    implementation fileTree(dir: 'libs', include: ['*.jar'])//指定引用jar包的路径
    implementation 'androidx.appcompat:appcompat:1.1.0'//引用appcompat库
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'//引用constrainlayout库
    testImplementation 'junit:junit:4.12'//指定单元测试编译用的版本号
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'//指定安卓测试编译用的版本号
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'//使用Espresso的进行测试的版本号
}

还有许多配置没有写出来。这里只是简单的了解一下,有需要的可以参考以下博客或者自行百度搜索。

build.gradle文件的注释

App的工程结构了解到此结束。

Android Studio的部分使用方法

  Android Studio是基于IDEA开发的,其大部分使用其实是和IDEA是差不多的。下面大致介绍一下Android Studio的框图。


Android Studio主框图

还有一些常用的快捷键:

  • Ctrl+S : 保存文件
  • Ctrl+Z :撤销上次操作
  • Ctrl+Shift+Z : 重做上一次编辑。
  • Ctrl+Y:删除当前行
  • Ctrl+C:复制
  • Ctrl+X:剪切
  • Ctrl+V:粘贴
  • Ctrl+A:全选
  • Delete:删除
  • Ctrl+F:查询
  • Ctrl+R:替换
  • Ctrl+/:注释选中的代码(采用//注释)
  • Ctrl+Shift+/:注释选中的代码(采用/**/注释)
  • Shift+F6:重命名
  • Alt+Enter:给光标所在位置的类导入相应的包(推荐设置自动导入包)
  • Shift+F10:运行当前模块
  • Ctrl+F5:清理并重新运行当前模块

以及一些常用的插件:

  1. Android Code Generator:根据布局文件快速生成对应的Activity,Fragment,Adapter,Menu类。

  2. CodeGlance:右边快速预览代码,实现快速定位。

  3. ECTranslation:翻译软件。

还有更多以及更常用的插件可以查看博客:Android Studio实用插件集合。在此不再列出。(=-=主要是自己只使用了这三个。)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容