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的图例
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的机制会根据优先级自动管理后台程序