从这篇可以掌握到
- Android app开发环境的搭建
- 开发工具介绍及安装
- 创建你的“Hello, World”
- 工程结构的介绍
- 工程gradle配置
- 简单布局
- 代码sample
- 打包配置
- gradle基本命令介绍
1 搭建环境&安装工具
1.1 JDK
1.1.1 安装
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
先点击Accept License Agreement 同意,然后选择下载:
1.1.2 配置环境变量
Windows环境:
JAVA_HOME:D:\Java\jdk1.8.0_25 # java的安装路径
CLASSPATH:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
Path:;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin # add
Mac:
在系统环境配置文件里添加:
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_71.jdk/Contents/Home
export PATH=$PATH:JAVA_HOME/bin
1.2 Android Studio
1.2.1 安装
https://developer.android.google.cn/studio/
根据你的系统选择相应版本。
目前使用版本为3.2。
1.2.2 设置Project Structure
打开Studio界面
需要设置的是SDK和JDK路径:
1.2.3 安装Android SDK & tools
在sdk Manager中安装或更新需要的Android sdk。
当前使用工具版本:
- SDK Build-tools 28.0.3
- SDK Platform-tools 28.0.1 +
- SDK Tools: 26.1.1 +
- Support Library rev 23.2.1 +
大致说明下这几个工具:
-
Android SDK Tools
包含了android 开发和调试的工具- Location:
$ANDROID_HOME/tools
- Main tools:
ddms
(for debugging),emulator
, etc
- Location:
-
Android SDK Platform-tools
针对pc端和移动端进行交互的一些工具- Location:
$ANDROID_HOME/platform-tools
- Main tool:
adb
(to manage the state of an emulator or an Android device),sqlite3
,fastboot
, etc.
- Location:
-
Android SDK Build-tools
Android平台相关通用工具- Location:
$ANDROID_HOME/build-tools/$VERSION/
- Documentation
- Main tools:
aapt
(to generate R.java and unaligned, unsigned APKs),dx
(to convert Java bytecode to Dalvik bytecode), andzipalign
(to optimize your APKs)
- Location:
1.2.4 设置环境PATH
以Mac环境为例:
设置Android sdk的安装目录为:/Users/Izumi/Android/android-sdk-macosx,
在系统配置文件添加:
export PATH=$PATH:/Users/Izumi/Android/android-sdk-macosx/tools
export PATH=$PATH:/Users/Izumi/Android/android-sdk-macosx/build-tools/27.0.3
export PATH=$PATH:/Users/Izumi/Android/android-sdk-macosx/platform-tools
Windows环境,添加Android sdk路径到系统PATH里即可。
2. 新建工程
2.1 步骤
自定义Activity和layout name。
点击Finish后,就新建好工程了。
2.2 下载模拟器AVD
打开工程后,如果想下载模拟器,可以在工具栏里看到这个icon。
选择需要的API(即Android SDK),如果某版本API未下载,系统名边上会显示"Download",下载后也可以选择。
命名avd确认即可。
2.3 工程结构
2.3.1 主要说明
- java: 包含 Java 源代码文件,包括 JUnit 测试代码。
- res: 包含所有非代码资源,例如 XML 布局、UI 字符串和位图图像。
- AndroidManifest.xml: Android各组件的配置文件。
- app/build.gradle: app工程的gradle构建脚本。
- 根目录下build.gradle: 整个工程的gradle构建脚本。
- gradle目录:
gradle/wrapper/gralde-wrapper.properties 文件中声明了它指向的目录和版本,新建工程后会花一定时间下载指定的gradle版本。
2.3.2 详细说明
2.3.3 关于gralde-wrapper.properties
文件如下:
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
其中的distributionUrl 决定了这个项目使用的gradle版本。
第一次打开工程时会比较慢,是因为Studio首先会读取gradle-wrapper.properties,知道这个工程需要哪个版本的gradle,然后就会去保存gradle的文件夹GRADLE_USER_HOME,去找看存不存在这个版本的gradle,不存在则会去distributionUrl 去下载。
Gradle下载地址:https://services.gradle.org/distributions/
可以在系统的环境配置中添加上GRADLE_USER_HOME的路径:
Windows:
C:\users{user name}.gradle\wrapper\dists
Mac:
export GRADLE_USER_HOME=/User/{Username}/.gradle/wrapper/dists
2.3.4 整个项目gradle配置文件
buildscript {
repositories {
google()
jcenter()
}
dependencies {
// Gradle插件,此版本一般继承自Android Studio的版本。
classpath 'com.android.tools.build:gradle:3.2.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
}
3. 简单布局
3.1 常见UI控件
所有的控件都是View的子类。
- TextView
- EditText
- Button
- ImageView
- ProgressBar
3.2 设计布局
3.2.1 手动写布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical"
>
<TextView
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_marginBottom="64dp"
android:layout_marginTop="20dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_gravity="center"
android:text="Hello World!"
android:textSize="24dp"
android:textColor="@android:color/white"
android:background="@android:color/darker_gray"
android:gravity="center"
tools:layout_editor_absoluteX="42dp"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="350dp"
android:orientation="horizontal"
android:background="@android:color/holo_blue_bright"
>
<Button
android:id="@+id/btHello"
android:layout_width="72dp"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginLeft="10dp"
android:layout_gravity="top|center"
android:text="ok"
android:textSize="18dp"
android:background="@android:color/holo_purple"
android:gravity="center"
/>
<ImageView
android:id="@+id/ivLogo"
android:layout_width="300dp"
android:layout_height="280dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_gravity="center"
android:src="@drawable/cat"
android:scaleType="center"
android:background="@android:color/darker_gray"
/>
</LinearLayout>
</LinearLayout>
效果:
3.2.2 使用Palette
在布局界面,使用Palette,直接拖动添加UI控件:
在右侧的Attributes中,可以直接修改该控件的所有属性:
如图,把image的scaleType属性,从"center"改成"fitXY"。
4. 代码
4.1 代码格式化
想让一段代码格式变得整齐,可以:
选中这行代码
Code → Reformed Code
或者Windows: Ctrl+Alt+L
Mac:Alt+Cmd+L
4.2 代码style
如下,在Preferences / Editor / Code Style / Scheme,可以添加自己的code style
4.3 sample
- 在sample Activity的布局中,添加两个按钮
<Button
android:id="@+id/btStartSelf"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Start self"
android:onClick="startSelf"
/>
<Button
android:id="@+id/btJumpSecond"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Jump to Second"
android:onClick="startSecond"
/>
- sample Activity如下:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MAIN";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e("Task", "Main Task id:" + getTaskId());
}
public void startSelf(View view) {
startActivity(new Intent(this, MainActivity.class));
}
public void startSecond(View view) {
startActivity(new Intent(this, SecondActivity.class));
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
其中startSelf和startSecond方法,即对应了布局中两个button的click事件。
创建一个简单的SecondActivity,即可进行测试。
- Manifest配置
Android工程里每个Activity、Service、Broadcast等组件,都必须添加到Manifest.xml文件中。
<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.isa.myapplication"
xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".SecondActivity"
android:launchMode="standard"
android:configChanges="orientation|keyboardHidden|screenSize"
/>
</application>
</manifest>
5. 打包
测试的话,可以开个模拟器或者连手机,run起来就好了!
如果发签名包的话,参考以下配置。
5.1 配置签名信息
工程下添加local.properties文件,填写key信息:
sdk.dir=/Users/Izumi/Android/android-sdk-macosx
key.store=/Users/Izumi/xxx.keystore
key.alias=xxx.keystore
key.store.password=xxxxxx
key.alias.password=xxxxxx
在app/build.gradle,配置如下:
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
buildToolsVersion "28.0.3"
defaultConfig {
applicationId "com.isa.myapplication"
minSdkVersion 17
targetSdkVersion 26
versionCode 1000000
versionName "1.0.0"
}
signingConfigs {
release {
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
storeFile file(properties.getProperty('key.store'))
storePassword properties.getProperty('key.store.password')
keyAlias properties.getProperty('key.alias')
keyPassword properties.getProperty('key.alias.password')
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
debug {
minifyEnabled false
debuggable true
signingConfig signingConfigs.debug
}
// 如果想自定义生成的包名,添加'applicationVariants',根据需要修改文件名
applicationVariants.all { variant ->
variant.outputs.all {
if (variant.productFlavors.size() > 0) {
def path="myapp_${defaultConfig.versionName}_${variant.productFlavors[0].name}_${buildType.name}_${project.name}_${buildTime()}.apk"
outputFileName = path
}
}
}
}
def buildTime() {
return new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC"))
}
5.2 打包命令
./gradlew build // 检查依赖并编译打包,debug、release环境的包都会打出来
./gradlew assembleDebug // 编译并打Debug包
./gradlew assembleRelease // 编译并打Release的包
完成后,会在app/build/outputs/apk目录下找到对应的apk。
6 关于Gradle
gradlew,代表gradle wrapper,意思是gradle的一层包装。
基本命令:
- ./gradlew -v // 版本号
- ./gradlew clean // 清除app目录下的build文件夹
- ./gradlew installRelease // release模式打包并安装
- ./gradlew uninstallRelease // 卸载Release模式包
Ref: