1.Android的工程结构和准备
android的工程结构只是一种约定俗成的结构并没有严格的规范,特定的ide有特定的结构,从而符合ide的工具链,下面是一个典型的Android Studio工程结构
new-structure
├─ library-foobar
├─ app
│ ├─ libs
│ ├─ src
│ │ ├─ androidTest
│ │ │ └─ java
│ │ │ └─ com/futurice/project
│ │ └─ main
│ │ ├─ java
│ │ │ └─ com/futurice/project
│ │ ├─ res
│ │ └─ AndroidManifest.xml
│ ├─ build.gradle
│ └─ proguard-rules.pro
├─ build.gradle
└─ settings.gradle
在我的实践中,只会保留必不可少的结构,忽略掉那些脚本等等。
Android项目里面的必不可少的文件解构:
源码文件夹:这里的源码文件夹下面必须有符合android规范的包,这篇文章把这个文件夹称作src,下面的包定义为com/mycompany/package1
库文件夹:java代码所引用的库文件,这里定义为lib
资源文件夹:资源文件夹下面得文件结构必须符合android规范,要包含value等文件夹
AndroidManifest.xml:这个文件用来描述android app的特性,比如入口activity,sdk版本信息等等
其他的准备:
需要下载sdk,注意sdk里面应该包括platform,platform-tools,build-tools,在构建的时候,platform和build-tools的版本要一致
需要准备jdk,jdk需要和sdk的版本保持一致,jdk和sdk的版本关系如下:
总结一下准备工作:
开发环境mac,android sdk:android-24,jdk:jdk7
一些变量(下面得脚本都是用这些变量)
ANDROID_HOME : sdk的目录
JDK_HOME :jdk的目录
DEV_HOME : 工程根目录
项目结构:
DEV_HOME/src/com/mycompany/package1/HelloAndroid.java
res/layout
values
drawable
lib
obj //保存编译后的产物
AndroidManifest.xml
2.操作步骤
2.1创建相关文件文件夹,创建ANDROID_HOME等变量
2.2编写HelloAndroid.java代码,一份示例代码如下
package com.mycompany.package1;
import android.app.Activity;
import android.content.res.Resources;
import android.os.Bundle;
import android.widget.TextView;
public class HelloAndroid extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView textView = new TextView(this);
String text = getResources().getString(R.string.helloText);
textView.setText(text);
setContentView(textView);
}
}
2.3生成R文件
R文件保存了所有资源的索引(实际上是给每个资源文件一个id)
$ANDROID_HOME/build-tools/24.0.0/aapt package -v -f -m -S $DEV_HOME/res -J $DEV_HOME/src -M $DEV_HOME/AndroidManifest.xml -I $ANDROID_HOME/platforms/android-24/android.jar
可以看出这里用的是aapt这个工具
2.4编译java代码
$JDK_HOME/javac -verbose -d $DEV_HOME/obj -classpath $ANDROID_HOME/platforms/android-23/android.jar:$DEV_HOME/obj -sourcepath $DEV_HOME/src $DEV_HOME/src/com/mycompany/package1/*.java
2.5生成dex文件
$ANDROID_HOME/build-tools/24.0.0/dx --dex --verbose --output=$DEV_HOME/bin/classes.dex $DEV_HOME/obj $DEV_HOME/lib
2.6生成apk文件
$ANDROID_HOME/build-tools/24.0.0/aapt package -v -f -M $DEV_HOME/AndroidManifest.xml -S $DEV_HOME/res -I $ANDROID_HOME/platforms/android-24/android.jar -F $DEV_HOME/bin/work.unsigned.apk $DEV_HOME/bin
2.7给apk文件签名
这里要分为两步,先生成证书,然后用证书给apk文件签名
生成证书:JAVA_HOME/bin/keytool -genkeypair -validity 10000 -dname "CN=company name,OU=organisational unit,O=organisation, L=location,S=state,C=country code" -keystore DEV_HOME/work.keystore -storepass password -keypass password -alias work -keyalg RSA -v
签名:$JDK_HOME/jarsigner -verbose -keystore $DEV_HOME/work.keystore -storepass password -keypass password -signedjar $DEV_HOME/bin/work.signed.apk $DEV_HOME/bin/work.unsigned.apk work
2.8压缩apk文件
$ANDROID_HOME/build-tools/24.0.0/zipalign -v -f 4 $DEV_HOME/bin/work.signed.apk $DEV_HOME/bin/work.apk
2.9向模拟器上安装apk文件
这里使用adb工具向模拟器安装文件,模拟器可以是用android的工具生成的,也可以是android手机连到电脑上开启usb调试,这里推荐第二种,因为第一种很慢,容易出错
$ANDROID_HOME/platform-tools/adb -d install $DEV_HOME/bin/work.apk
执行上面那一行代码的时候务必保证电脑上有android设备连着
然后就能看到app运行了