HelloWorld程序的讲解

 

Eclipse-> File -> New Android Project

1、Create newproject in workspace

2、Createproject from existing source 

相当于import一个项目

3、Createproject from existing sample 

打开的是Android SDK中samples目录中的例子,根据不同SDK版本例子不同

 

真机屏幕通过电脑展示的工具Android Screen Monitor,安装和使用方法:

1、下载网址:http://code.google.com/p/android-screen-monitor/

2、解压,得到asm.jar

3、在asm.jar所在的目录下执行命令:java -jar asm.jar即可

4、选择连接的设备

运行效果如下所示:

 

 

选择程序运行的设备:在运行按钮 ->  Runconfiguration -> target

 

运行完成后,安装到手机的哪里去了?

运行 adb shell,进入手机的控制台(手机是linux系统)

data/app文件夹下就是安装的第三方的程序目录(存放的安装包),但是由于手机没有root所以看不到

data/data文件夹下存放的是程序的类库和相关的地址(assert资源、SQL数据库等)

system/app文件夹下是系统级的应用程序,如Mms.apk,Email.apk等

 

Java       :   JVM     ->       class                                   ->       jar

Android  :  dalvik  ->        dex (二进制执行文件)      ->       apk

 

程序的安装过程:

编译 -> 通过ADB上传到手机 -> 安装apk(其实就是解压的过程)

 

手机上的/system/app/目录下的文件有一对,为apk文件和odex文件

将手机上的文件复制到电脑上:

adb pull/system/Mms.apk Mms.apk

adb pull/system/Mms.odex Mms.odex

就把Mms.apk和Mms.odex文件下载到了当前文件夹下

解压缩Mms.apk文件,发现与普通apk文件不同的是没有dex二进制执行文件

odex是基于apk中dex文件生成的,通过了压缩、加密和混淆,又绑定了签名

是为了商业安全的考虑,降低破解和盗版的难度

 

dpi:分辨率,是1英寸有多少个像素点

ldpi代表的是120dpi

mdpi代表的是160dpi

hdpi代表的是240dpi

 

assets与raw的区别

assets是根目录下的文件夹,与res目录平级,使用里面的资源需要通过路径和文件名调用,并且方便建立子文件夹

raw是res目录下的文件夹,可以通过R.raw.id调用

 使用assets目录文件的方法:

AssetManager assetManager = getAssets();
    	try{
    		editText.setText(readStream(assetManager.open("text.txt")));
    	} catch(IOException e){
    		e.printStackTrace();
    	}



使用raw目录文件的方法:

InputStream inputStream = getResources().openRawResource(R.raw.text);
    	editText.setText(readStream(inputStream));



readStream方法:

private String readStream(InputStream is){
    	try{
    		ByteArrayOutputStream bo = new ByteArrayOutputStream();
    		int i = is.read();
    		while(i != -1){
    			bo.write(i);
    			i = is.read();
    		}
    		return bo.toString();
    	} catch(IOException e){
    		return "";
    	}
}




对比生成apk的图例

android samba开发 android samba client_jar

classes.dex是二进制的执行文件

resources,arsc是所有资源文件的索引(资源表)

aapt是android sdk工具中platform-tools中的打包编译工具

DX工具也是platform-tools下的工具,是windows下的批处理文件,可以打开查看


临摹是最好的学习方法之一——反编译dex

dexdump是sdk platform-tools下负责反编译dex文件的工具

命令格式:dex -d dex文件所在路径 > 写到的txt文档

反编译出的文件可以读取一定的信息,但不是想要的那种形式(是由dex转到Smali)


除了raw和assets目录下的文件,其他的如AndroidManifest.xml和其他xml格式经过编译和加密已经无法读取

所以反编译针对的内容有两类:

1、dex

2、xml


不用rar解压,使用apktool解压apk文件

下载apktool.jar和apktool.bat文件,放在一个目录下,批处理文件其实就是使用java -jar apktool运行apktool的jar包

使用apktool d Demo.apk demo (d是参数,第一个apk是源文件,第二个demo是目的文件夹)

加压后就发现xml文件可读了,也没有生成dex文件,而是直接生成了smali文件


文件对比工具:Beyond Compare 3

专门用来做目录和文本文件的对比,看源代码时的效果比较好


编译过程:Java -> class -> dex

反编译过程:dex -> jar -> class -> java(class步骤可选)

从dex到jar包的工具为dex2jar

class到java工具为xjar,这步其实是java的范畴,统称为JD(Java Decompiler),核心为JD-Core


dex2jar命令:dex2jar classes.dex demo.jar

然后使用XJad就能直接打开生成的demo.jar文件了


分析HelloWorld,没有main函数

一个守护进程zgnote,会生成一个虚拟机VM,加载并管理每个App


Log工具:

1、LogCat

2、DDMS

LogCat已经被集成到DDMS界面中

LogCat中如果pid为0则表明是由root发起的


何时会看日志:

1、程序出错了,看bug

2、调试程序的时候,看自己打的log


看日志什么内容:

1、按优先级别看,程序出错看红色

2、如果自己打的log,就追踪自己的tag


一般有下面几种情况会产生log文件

1、程序异常退出,uncaused exception

2、程序强制关闭,Force cloase(FC)—— 在Log文件中标记为FATAL

3、程序无响应,Application No Response(ANR)—— 在Log文件中直接搜索ANR即可


何时会产生ANR:

1、界面操作等待响应时间超过5秒

2、HandleMessage回调函数中执行超过10秒


Log文件生成的位置:

/data/log


手机有两种出厂模式

1、development(开发模式)

2、user(可能不支持Log文件或者某些开发功能)


Log文件组成:

1、系统基本信息,包括内存、CPU、进程队列、虚拟内存、垃圾回收等信息

2、事件信息,主要分析的信息(与DDMS里的log的内容相似)

3、虚拟机信息,包括进程的、线程的跟踪信息,这是用来跟踪进程和线程具体点的好地方


开了一个程序,然后点击Home按钮,程序进入background状态

此时程序不消耗CPU资源,但消耗内存资源

其实不用通过某些手段kill掉这些后台进程,因为如果内存不足时android的机制会根据优先级自动管理后台程序