zoukankan      html  css  js  c++  java
  • 2.AS入门教程

    AndroidStudio

    本文是关于androidStudio的一些基础知识

    介绍

    Google官方的Android集成开发环境(IDE = Integrated Development Environment),Eclipse + Adt插件的代替者

    学习的必要性

    趋势:

    更好用,对比eclipse如下:

    安装

    下载:http://developer.android.com/sdk/index.html

    具体安装参考网上文献

    界面

    • 整体 
    • 菜单 -File 
    • 菜单 - Build

    • 快捷工具 


    • Project视窗 

    -Structure视窗 

    • 代码编辑区域 


    • 代码编辑- 布局文件的多屏预览 


    • Android 监控 


    • Message 


    建立HelloWorld项目

    • 重要概念

    As中强调应该把相关的工程放在同一个工作空间中

    Gradle相关

    概念

    Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML。当前其支持的语言限于Java、Groovy和Scala,计划未来将支持更多的语言。

    https://zh.wikipedia.org/zh/Gradle

    编译过程

    http://developer.android.com/tools/building/index.html

    Gradle相关文件

    • 重要

    project 中的 settings.gradle 说明

     project 中的build.gradle说明

    // 构建脚本
    buildscript {
        // 仓库
        repositories {
            // 中央仓库  https://bintray.com/bintray/jcenter
            // 通过jar包的字符串包名,就可以下载到jar包了
            // 成熟的公司可能会有自己的仓库服务器,需要在此配置
             jcenter()
        }
        dependencies {
            // android gradle构建工具,用于处理module下的build.gradle文件,此版本与Gradle版本有配套关系,目前gradle已经到2.8了,但主要使用的是2.4
            classpath 'com.android.tools.build:gradle:1.3.0'
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
    }
    // 所有项目都依赖于jcenter
    allprojects {
        repositories {
            jcenter()
        }
    }
    // gradle在执行构建任务时的清理配置
    task clean(type: Delete) {
        delete rootProject.buildDir
    }

    module中的build.gradle详细说明

    // 表示这个项目编译完成后,是一个anrdoid应用程序
    apply plugin: 'com.android.application'
    // 表示这个项目编译完成后,是一个anrdoid的库
    //apply plugin: 'com.android.library'
    android {
        // 编译的sdk版本,见sdkplatforms
        compileSdkVersion 23
        // 构建工具的版本,见sdkuild-tools
        buildToolsVersion "23.0.1"
        defaultConfig {
            // 包名:用于在市场上区分应用的唯一性的标示
            applicationId "cn.itcast.as.helloworld"
            // 最小sdk版本、目标sdk版,原先是放在清单文件中的
            minSdkVersion 15
            targetSdkVersion 23
            // 应用程序的版本号,和版本码,原先是放在清单文件中的
            versionCode 1
            versionName "1.0"
        }
        // 构建类型
        buildTypes {
            // debug版默认有配置,没有写在这里
            // 发行版
            release {
                // 是否混淆
                minifyEnabled false
                // 混淆配置文件
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
    // 关键:项目的依赖
    dependencies {
        // 在项目中的libs中的所有的.jar结尾的文件,都是依赖
        compile fileTree(dir: 'libs', include: ['*.jar'])
        // 依赖于junit测试
        testCompile 'junit:junit:4.12'
        // 还依赖于appcompat-v7,23.1.0版本
        compile 'com.android.support:appcompat-v7:23.1.0'
    }
    • 其他

    文件和文件夹说明

    • Project根目录

    • module目录

    设置

     文件编码 

    • 程序外观 

    • 编辑区域外观 
       
    • logcat外观 
       

    快捷键

    视窗快捷键

    代码补全

    快捷键方案修改 && 编辑快捷键

    活动模板

    后缀补全

    常用快捷键

    调试

    进入调试的两种方式

    • 以调试模式运行

    • 运行后调试

     需要注意 运行的程序的代码应该与所看到的是同一份,不然点击提示会错位

    如何打断点

    • 代码左侧单击

    • 代码左侧单击时按着shift键断点类型

    断点类型

    导入module

    导入Eclipse项目

    File –> New –> Import Module

    导入AndroidStudio项目

    File –> New –> Import Module

    导入AAR

    File –> New –>New Module –> Import .jar/.aar package

    删除导入的Module

    当文件夹上显示了手机或柱状图 图标,说明此文件夹是受保护的,无法被删除

    1. 取消保护

    打开Project Struecture。 选中要删除的module,点上面的减号。 然后点确定

    1. 删除文件

    在原来是module的文件夹上点击鼠标右键,选中delete,在弹出的对话框上点确定。


    导入依赖

    导入Library

     

    导入文件jar包

    导入Module依赖

    对应关系


    插件管理

    安装插件的两种方式

    • 本地安装
    • 网络安装

    ButterKnife Zelezny的使用

    打包APK

    混淆

    作用及意义

    • 减小apk大小,删除无用的类和方法
    • 避免被反编译后重要的程序逻辑暴露

    配置

    app/build.gradle

    buildTypes {
        release {
        // false ,关闭混淆
        // true , 开启混淆
            minifyEnabled false
           // proguard-android.txt 是通用的混淆配置文件,放在sdk中  (sdk	oolsproguard)
            // proguard-rules.pro 是项目都有的混淆配置文件 ,在项目的根目录中
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    通用混淆文件说明

    # 以#开头的都是注释,下同
    # This is a configuration file for ProGuard.
    # http://proguard.sourceforge.net/index.html#manual/usage.html
    # 不使用大小写混合的类名
    # 比如说 a.java 和 A.java。因为在windows下文件名是不区分大小写的,会导致文件的覆盖
    -dontusemixedcaseclassnames
    # 混淆第三方jar
    -dontskipnonpubliclibraryclasses
    # 打印更多日志
    -verbose
    # Optimization is turned off by default. Dex does not like code run
    # through the ProGuard optimize and preverify steps (and performs some
    # of these optimizations on its own).
    # 不做做优化(有时会弄巧成拙)
    -dontoptimize
    # 不做预校验
    -dontpreverify
    # Note that if you want to enable optimization, you cannot just
    # include optimization flags in your own project configuration file;
    # instead you will need to point to the
    # "proguard-android-optimize.txt" file instead of this one from your
    # project.properties file.
    # 保留注解上的属性
    -keepattributes *Annotation*
    # 保留此类(com.google.vending.licensing.ILicensingService)不被混淆,google需要用到
    -keep public class com.google.vending.licensing.ILicensingService
    # 保留此类( com.android.vending.licensing.ILicensingService)不被混淆,google需要用到
    -keep public class com.android.vending.licensing.ILicensingService
    # For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
    # 保持 native 方法不被混淆,混淆后不能正确调用底层方法了
    -keepclasseswithmembernames class * {
        native <methods>;
    }
    # keep setters in Views so that animations can still work.
    # see http://proguard.sourceforge.net/manual/examples.html#beans
    # 保留任何直接或间接继承与View的类的set和get开头的方法,不被混淆
    -keepclassmembers public class * extends android.view.View {
       void set*(***);
       *** get*();
    }
    # We want to keep methods in Activity that could be used in the XML attribute onClick
    # 保留直接或间接继承于Activity的类的 点击事件方法不被混淆,因为混淆后布局文件写的点击事件方法就会找不到
    -keepclassmembers class * extends android.app.Activity {
       public void *(android.view.View);
    }
    # For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
    # 保留枚举类的如下 values 和valueOf方法
    -keepclassmembers enum * {
        public static **[] values();
        public static ** valueOf(java.lang.String);
    }
    # 保留实现了Parcelable 接口的类的静态CREATOR常量
    -keepclassmembers class * implements android.os.Parcelable {
      public static final android.os.Parcelable$Creator CREATOR;
    }
    # 保留R.java中的及内部类的的所有静态字段
    -keepclassmembers class **.R$* {
        public static <fields>;
    }
    # The support library contains references to newer platform versions.
    # Don't warn about those in case this app is linking against an older
    # platform version.  We know about them, and they are safe.
    # 告诉ProGuard不要警告找不到android.support开头的包名.
    -dontwarn android.support.**

    项目特有的常用的混淆语法

      • 特定的类不被混淆 
        -keep class package.name.Klass {*;}
      • 某个包下的类不被混淆 
        -keep class package.name.** {*;}
      • 继承与某类的类不被混淆 
        -keep class * extends java.lang.annotation.Annotation { *; }

    使用第三方jar包在混淆后出错

    一般,都可以在网站上找到相应的混淆配置

    比如

    多APK打包

    意义

    • 国内现状: 多个电子市场可提供apk的下载,用于统计市场的作用
    • 同一个应用程序,给不同的客户,需要连接不同的服务器

    步骤

     1 在清单文件中添加metadata

    <application
       ...... >
        <!-- market 表示键  ${MARKET}表示值 ,用${}表示会变......-->
        <meta-data android:name="market" android:value="${MARKET}"/>
        <!-- ......-->
    </application>

    2 在程序中获得metadata并使用

    //TODO 从sp中获取是否是第一运行
    boolean isFirstRun= true;
    if(isFirstRun){
        // 通过PackageManager拿到在清单文件中记录的metadata信息
        PackageManager packageManager = getPackageManager();
        String packageName = getPackageName();
        int flag = PackageManager.GET_META_DATA;
        // 表示我们获取当前应用程序的application下的metadata数据
        ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName, flag);
        // 传入键名,拿到键值
         String market = applicationInfo.metaData.getString("market");
        //TODO 获取imei
        String imei = "123456";
        // TODO 自己实现代码
        sentToServer(market, imei);
        //TODO 写入sp,下次启动程序就不发送了
    }

    3 添加flavor动态修改metadata

    android{
      //......
     productFlavors {
            _360 {
                manifestPlaceholders = [MARKET: "_360"]
            }
            wandoujia {
                manifestPlaceholders = [MARKET: "wandoujia"]
            }
            anzhi {
                manifestPlaceholders = [MARKET: "anzhi"]
            }
        }
    }

    版本控制

    SVN环境

    安装TortoiseSVN

    !!! 注意勾选 command line client tools

    在as中,设置svn的命令行工具:

    settings –> Version Control –> Subversion –>General –> use command line client 
    选中TortoiseSVN的安装目录中的bin文件夹中的svn.exe

    上传本地代码

      • 设置同步 
        settings –> Version Control 
        把project后面加上版本控制的类型

      • 设置忽略文件 
        settings –> Version Control –> Ignored Files 
        3种方式:特定文件、指定目录下的文件、特定规则文件

    提交目录

     project 右键 –> Subversion –> share directory 
    这一步只提交了目录,文件并没有上传到服务器

     

    上传文件

     project 右键 –> Subversion –> submit directory

     

    下载服务器的代码

     

     

    提交代码,编辑冲突

     project 右键 –> Subversion –> submit directory

    好习惯:先update,再submit

      • 冲突的解决 
        3种 接受服务器的,接受自己的,合并

    !!! 注意,在合并后,还需要submit

    断开连接

      • 断开连接
        1. 先删除配置 
          在settings –> version control -掉同步文件夹

    2. 再删除文件 删除.svn文件夹

     

    • 忘记记录的用户名和密码

    settings –> version control –> subversion –>clear auth cache

  • 相关阅读:
    Linux中常用命令
    Shell基本介绍和使用
    linux基本介绍和使用
    Servlet基本介绍和使用
    linux系统下挂载windows共享目录
    linux下关于gz和bz2压缩格式的常用操作技巧
    linux下修改history命令保存条数
    关于在linux下清屏的几种技巧
    vim中如何引用自定义模板文件
    Linux下ps -ef和ps aux的区别及格式详解
  • 原文地址:https://www.cnblogs.com/caimuqing/p/8436698.html
Copyright © 2011-2022 走看看