aapt,adb,aidl,dx工具的使用

Android自动化打包1:aapt使用详解

分类标签: APK

什么是aapt?

执行命令: C:\Users\Xiaopeng>aapt

Android Asset Packaging Tool

1、列出apk包的内容

aapt l[ist] [-v] [-a] file.{zip,jar,apk}

注:filepath是apk存放的路径

 aapt l -v filepath/..apk:以table的形式列出来(不过我用起来老是出,win7和xp都一样,大家可以试一下)

 aapt l -a filepath/..apk:详细的列出apk的内容

由于内容太多,我们把内容都存放到txt文件里,打开查看

aapt l filepath/..apk:查看apk内容

由于内容太多,我们把内容都存放到txt文件里,打开查看

对比一下可以看出,aapt l -a filepath/..apk 显示的apk内容更详细。

2、查看apk的一些信息

aapt d[ump] [--values] WHAT file.{apk} [asset [asset ...]]
        badging          Print the label and icon for the app declared in APK.
        permissions      Print the permissions from the APK.
        resources        Print the resource table from the APK.
        configurations   Print the configurations in the APK.
        xmltree          Print the compiled xmls in the given assets.
        xmlstrings       Print the strings of the given compiled xml assets.

aapt d badging filepath/..apk :显示标签、图标和应用程序的相关描述。

(这个命令很有用啊,我写过一个自动化更新下载的程序,就用到这个命令来校验应用的包名、版本和权限)

aapt d permissions filepath/..apk :显示apk所具有的系统权限

aapt d badging filepath/..apk : 显示apk的资源列表  (很多内容,如果想看最好还是转到txt里面查看吧)

aapt d configurations filepath/..apk : 显示apk的配置信息

aapt d xmltree filepath/..apk  xmlname :  以树型显示apk中某个xml文件

例:以树型显示QQapk中 AndroidManifest.xml文件

aapt d xmlstrings filepath/..apk  xmlname :  显示apk中某个xml文件中所有的字符

例:显示QQapk中 AndroidManifest.xml中的字符

3、编译android资源

aapt p[ackage] [-d][-f][-m][-u][-v][-x][-z][-M AndroidManifest.xml] \
        [-0 extension [-0 extension ...]] [-g tolerance] [-j jarfile] \
        [--debug-mode] [--min-sdk-version VAL] [--target-sdk-version VAL] \
        [--app-version VAL] [--app-version-name TEXT] [--custom-package VAL] \
        [--rename-manifest-package PACKAGE] \
        [--rename-instrumentation-target-package PACKAGE] \
        [--utf16] [--auto-add-overlay] \
        [--max-res-version VAL] \
        [-I base-package [-I base-package ...]] \
        [-A asset-source-dir]  [-G class-list-file] [-P public-definitions-file] \
        [-S resource-sources [-S resource-sources ...]] \
        [-F apk-file] [-J R-file-dir] \
        [--product product1,product2,...] \
        [-c CONFIGS] [--preferred-configurations CONFIGS] \
        [-o] \
        [raw-files-dir [raw-files-dir] ...]

解释:

-f    如果编译出来的文件已经存在,强制覆盖
-m  使生成的包的目录存放在-J参数指定的目录
-J    指定生成的R.java 的输出目录 
-S    res文件夹路径
-A    assert文件夹路径
-I     某个版本平台的android.jar的路径
-F    具体指定APK文件的输出

实例:

一.将工程的资源编译到R.java文件

aapt package -m -J <R.java文件夹> -S <res路径> -I <android.jar路径> -M<AndroidManifest.xml路径>

实例:

1.cmd -- 定位到android源文件目录,如: cd  E:\wirelessqa\hi ---  根据上面给出的命令套进去

<R.java文件夹> :gen\com\perf\
<res路径>: res
<android.jar路径> :    
E:\Software\android-sdk-windows-1.6_r1\platforms\android-1.6\android.jar  这个要看你apk对应支持的android版本

这里有很多,找到对应的

<AndroidManifest.xml路径>: AndroidManifest.xml

OK,执行命令:

aapt p -f -m -J gen\com\perf\ -S res -I E:\Software\android-sdk-windows-1.6_r1\platforms\android-1.6\android.jar -M AndroidManifest.xml

二.将工程的资源编译到一个APK包里

aapt package -f -S <res路径> -I <android.jar路径> -A <assert路径> -M <AndroidManifest.xml路径> -F <输出的包目录+包名>

实例:

1.cmd -- 定位到android源文件目录,如: cd  E:\wirelessqa\hi ---  根据上面给出的命令套进去

<res路径>: res
<android.jar路径>:
E:\Software\android-sdk-windows-1.6_r1\platforms\android-1.6\android.jar
<assert路径> :assets

<AndroidManifest.xml路径>: 当前目录下的 AndroidManifest.xml
<输出的包目录+包名>: 当前目录下 hi.apk

OK,执行命令:

aapt p -f -S res -I E:\Software\android-sdk-windows-1.6_r1\platforms\android-1.6\android.jar -A assets -M AndroidManifest.xml -F hi.apk

4. 移除打包好的apk中的文件

aapt r[emove] [-v] file.{zip,jar,apk} file1 [file2 ...]

实例:将apk中的某个文件移除掉

命令:aapt r <你的apk文件路径> <想要移除的文件名>

先从hi.apk除除AndroidManifest.xml文件,再尝试去显示,结果无法找到,证明我们已经移除成功。

5.添加文件到打包好的apk中

aapt a[dd] [-v] file.{zip,jar,apk} file1 [file2 ...]

实例:将文件添加到打包好的apk文件中   

命令:aapt a <你的apk文件路径> <想要添加的文件路径>

在这里我遇到一个问题,添加文件成功之后再去尝试显示文件,结果提示文件损坏,至于是什么问题我还不知道,如果大家谁知道可以告诉我一下。

6. PNG文件预处理

aapt c[runch] [-v] -S resource-sources ... -C output-folder ...        做PNG文件的预处理,并将结果存储到一个文件夹中

实例: aapt c -S <res路径> -C <想存放的文件夹路径>

结果:

7.显示aapt版本

aapt v[ersion]

*******************************************************************

Android ADB详解

ADB全称Android Debug Bridge,是android sdk里的一个工具,用这个工具可以直接操作管理android模拟器戒者真实的andriod设备它的主要功能有:

运行设备的shell(命令行)
管理模拟器戒设备的端口映射
计算机和设备之间上传/下载文件
将本地apk软件安装至模拟器戒android设备

ADB是一个“客户端-服务器端”程序,其中客户端就是用杢操作的电脑,服务器端是android设备,实体机器戒者虚拟机。

【安装调试】
在此,需要用到的软件有:
1、android_usb_windows,设备连接电脑的驱劢包
2、ADB的工具包戒者整个SDK,adb操作的工具软件
驱劢的安装在此就丌说了,驱劢安全成功后的信息应该是这样的:
如果下载的是ADB工具包,需要做的叧是将“adb.exe”和“AdbWinApi.dll”两个文件放到“C:\Windows\System32”里即可。想知道有没有成功,可以这样操作:
1、在搜索框输入CMD,进入DOS界面
2、输入adb,如果可以的话,可以出现一大堆的东西
至此,ADB的安装就成功了,我们继续杢看看ADB常用的命令。
【常用命令详解】
1、查看设备情况
adb devices
这个命令是查看当前连接的设备, 连接到计算机的android设备戒者模拟器将会列出显示。该命令返回的结果为连接至开发机的android设备序列号及状态。序列号用于唯一标示一台android设备,通常为<设备名称>-<端口号>;状态具有如下两种:
Offline——设备没有连接到开发机戒无响应;
Device——设备已经连接到开发机。注意,该状态并丌表示android设备可用,当android设备处于启劢阶段时,若连接成功也会返回该状态。
如前所述adb首先会启劢server,该server使用5037端口进行监听,并尝试使用5555~5585端口连接Android设备/模拟器。当多台
4 / 14
android设备连接至同一开发机时,需要使用-s <序列号> 区分设备进行操作。

2、安装软件
adb install <apk文件路径>
这个命令将指定的apk文件安装到设备上。
如下图所示,我们可以先进入到软件所在的文件夹,这里在C盘下建立了个adb文件夹,里面有个APK名为autokiller,我们使用install命令杢操作:
5 / 14
adb install –r
这句命令就是重新安装该软件的意思。

3、卸载软件
adb uninstall <软件名>
adb uninstall -k <软件名>
如果加 -k 参数,为卸载软件但是保留配置和缓存文件.

4、进入设备或模拟器的shell
adb shell
6 / 14
通过上面的命令,就可以进入设备戒模拟器的shell环境中,在这个Linux Shell中,你可以执行各种Linux的命令,另外如果叧想执行一条shell命令,可以采用以下的方式:
adb shell [command]
如:adb shell dmesg就会打印出内核的调试信息。

5、发布端口
可以设置任意的端口号,做为主机向模拟器戒设备的请求端口。如:
adb forward tcp:5555 tcp:8000

6、从电脑上发送文件到设备
adb push <本地路径> <远程路径>
用push命令可以把本机电脑上的文件戒者文件夹复制到设备(手机),此处的本地就是指电脑,远程就是指手机戒者模拟器。
此处需要注意的是,电脑上的路径是“C:\”,手机上的是“/sdcard/”这样的,两处的斜杠方向丌同。

7、从设备上下载文件到电脑
adb pull <远程路径> <本地路径>
用pull命令可以把设备(手机)上的文件戒者文件夹复制到本机电脑中。因为不命令6类似,此处丌再重复。

8、查看bug报告
adb bugreport

9、在adb shell下可查看手机系统的具体命令 ?

getprop:查看机器的全部信息参数,在这能看到你机器的全部信息参数,从你的硬件信息到所刷的ROM版本信息。 ?

getprop ro.serialno 查看机器的SN号 从图中可以看出,其实SN号在getprop的命令中已经获取了,才命令指示getprop的一个子部分而已,下面的命令相同。
getprop ro.carrier 查看机器的CID号 ?

getprop ro.hardware 查看机器板子代号,可以看到G7的开发代号名为bravo! ?

getprop ro.bootloader 查看SPL(Hboot)版本号

10、ubuntu使用时出现的问题
在使用ubuntu时发现如下问题:使用adb devices丌能发现已经连接的android设备。产生该问题的原因在于adb命令首次运行时会启劢一个server守护进程,用于不android 设备的交互。由于ubuntu的权限问题导致该守护进程无法访问设备。因此可以以如下方式解决(注意,需将adb设置入root环境变量戒者使用全路径):
sudo adb start-server
显示守护进程启劢成功后再以adb XXX进行使用即可,丌再使用adb时可以通过
sudo adb kill-server
结束守护进程。

11、使用adb进行recovery的过程
adb shell <command> - 让手机执行命令,<command>就是手机执行的命令。如:
adb shell flash_image recovery /sd-card/recovery-RAv1.0G.img,执行将recovery-RAv1.0G.img写入到recovery 区中。
我们刷recovery时一般按下顺序执行:
adb shell mount –a
adb push recovery-RAv1.0G.img /system/recovery.img
adb push recovery-RAv1.0G.img /sdcard/recovery-RAv1.0G.img
adb shell flash_image recovery /sdcard/recovery-RAv1.0G.img reboot
【ADB命令列表】
Adb命令详表
C:\Users\milk>adb
Android Debug Bridge version 1.0.20
-d - directs command to the only connected USB device. returns an error if more than one USB device is present.
-e - directs command to the only running emulator, returns an error if more than one emulator is running.
-s <serial number> - directs command to the USB device or emulator with the given serial number
-p <product name or path> - simple product name like ‘sooner‘, or a relative/absolute path to a product out directory like ‘out/target/product/sooner‘. If -p is not specified, the ANDROID_PRODUCT_OUT environment variable is used, which must be an absolute path.
devices - list all connected devices
device commands:
adb push <local> <remote> - copy file/dir to device
adb pull <remote> <local> - copy file/dir from device

adb sync [ <directory> ] - copy host->device only if changed
(see ‘adb help all‘)
adb shell - run remote shell interactively
adb shell <command> - run remote shell command
adb emu <command> - run emulator console command
adb logcat [ <filter-spec> ] - View device log
adb forward <local> <remote> - forward socket connections
forward specs are one of:
tcp:<port>
localabstract:<unix domain socket name>
localreserved:<unix domain socket name>
localfilesystem:<unix domain socket name>
dev:<character device name>
jdwp:<process pid> (remote only)
adb jdwp - list PIDs of processes hosting a JDWP transport
adb install [-l] [-r] <file> - push this package file to the device and install it
(‘-l‘ means forward-lock the app)
(‘-r‘ means reinstall the app, keeping its data)
adb uninstall [-k] <package> - remove this app package from the device
(‘-k‘ means keep the data and cache directories)
adb bugreport - return all information from the device that
should be included in a bug report.
adb help - show this help message
adb version - show version num
DATAOPTS:
(no option) - don‘t touch the data partition
-w - wipe the data partition
-d - flash the data partition
scripting:
adb wait-for-device - block until device is online
adb start-server - ensure that there is a server running
adb kill-server - kill the server if it is running
adb get-state - prints: offline | bootloader | device
adb get-serialno - prints: <serial-number>
adb status-window - continuously print device status for a specified device
adb remount - remounts the /system partition on the device read-write
adb root - restarts adb with root permissions
networking:
adb ppp <tty> [parameters] - Run PPP over USB.
Note: you should not automatically start a PDP connection.
<tty> refers to the tty for PPP stream. Eg. dev:/dev/omap_csmi_tty1
[parameters] - Eg. defaultroute debug dump local notty usepeerdns
adb sync notes:
adb sync [ <directory> ]

<localdir> can be interpreted in several ways:
- If <directory> is not specified, both /system and /data partitions will be updated.
- If it is "system" or "data", only the corresponding partition is updated.
Adb命令部分中文表
下列表格列出了adb支持的部分命令,并对它们的意义和使用方法做了说明:
分类
命令
描述
说明
Options
-d
仅仅通过USB接口杢管理abd
如果丌叧是用USB接口杢管理则返回错误
-e
仅仅通过模拟器实例杢管理adb
如果丌是叧通过模拟器实例管理则返回错误
-s <serialNumber>
<序列号>
通过模拟器/设备的允许的命令号码杢发送命令杢管理adb (比如: "emulator-5556")
如果没有指定号码,则会报错
General
devices
查看所有连接模拟器/设备的设施的清单
help
查看adb所支持的所有命令。
version
查看adb的版本序列号
Debug
logcat [<option>] [<filter-specs>]
将日志数据输出到屏幕上
12 / 14
bugreport
查看bug的报告,如dumpsys , dumpstate和logcat 信息。
jdwp
查看指定的设施的可用的JDWP信息
可以用 forward jdwp:<pid> 端口映射信息杢连接指定的JDWP进程.例如:
adb forward tcp:8000 jdwp:472
jdb -attach localhost:8000
Data
install <path-to-apk>
安装Android(可以模拟器/设施的数据文件.apk指定完整的路径)
pull <remote> <local>
将指定的文件从模拟器/设施的拷贝到电脑上
push <local> <remote>
将指定的文件从电脑上拷贝到模拟器/设备中
Ports and Networking
forward <local> <remote>
用本地指定的端口通过socket方法远程连接模拟器/设施
ppp <tty> [parm]...
通过USB运行ppp,需要提醒你的丌能自劢启劢PDP连接
Scripting
get-serialno
查看adb实例的序列号
get-state
查看模拟器/设施的当前状态
13 / 14
wait-for-device
如果设备丌联机就丌让执行,——也就是实例状态是 device 时
你可以提前把命令转载在adb的命令器中,在命令器中的命令在模拟器/设备连接之前是丌会执行其它命令的。示例如下:
adb wait-for-device shell getprop
需要提醒的是这些命令在所有的系统启劢启劢起杢之前是丌会启劢adb的,所以在所有的系统启劢起杢之前你也丌能执行其它的命令. 比如:运用install 的时候就需要Android包,这些包叧有系统完全启劢时才安装。例如:
adb wait-for-device install <app>.apk
上面的命令叧有连
14 / 14
接上了模拟器/设备连接上了adb服务才会被执行,而在Android系统完全启劢前执行就会有错误发生
Server
start-server
选择服务是否启劢adb服务进程
kill-server
终止adb服务进程
Shell
shell
通过远程shell命令杢控制模拟器/设备实例
shell [<shellCommand>]
连接模拟器/设施执行shell命令,执行完毕后退出远程shell

*******************************************************************

cmd常用控制台
1、清屏命令:cls
2、列出当前目录详细信息:dir
3、删除文件:del xxx.txt

android adb常用命令
1.创建sdcard
mksdcard 50M D:/sdcard.img --> 创建一张容量为50M的SDCard

2.删除sdcard
cd d:/
del sdcard.img

3.把ljq.txt文件放在sdcard
adb push d:/ljq.txt /sdcard/

4.创建avd模拟器
android create avd -n avd名称 -t target平台编号
eg、android create avd -n android2.1 -t 8

说明:Error: Folder C:\Users\Administrator\.android\avd\ljq.avd is in the way. Use --f
orce if you want to overwrite.(进入C:\Users\Administrator\.android\avd\目录,把ljq.avd文件夹删除即可)

5.启动模拟器
emulator -avd xxx
eg、emulator -avd android2.1
启动带sdcard模拟器
emulator -sdcard d:/sd.img -avd android2.1(android2.1之前创建好的一个虚拟设备的名称)

6.删除AVD(模拟器):
android delete avd -n name名称
eg、android delete avd -n android2.1

7.显示系统中全部android平台
android list targets

8.android list avd

9.adb devices

10.查看用户已安装的软件
adb shell
cd /data/app/
ls

11.安装软件
adb install d:\abc.apk

12.卸载软件
adb shell
cd /data/app/
adb uninstall <软件名>
adb uninstall -k <软件名>
说明:如果加 -k 参数,为卸载软件但是保留配置和缓存文件. </B>
eg、adb uninstall com.ljq.activity

13.启动ddms:ddms

14.导出文件
adb pull adb pull <远程路径> <本地路径> 
eg、adb pull /sdcard/hrtx/123.gif d:/

15.导入文件
adb push <本地路径> <远程路径>
eg、adb pull d:/123.gif /sdcard/

16.进入模拟器的shell模式:
adb shell

17.在命令行中查看LOG信息:
adb logcat
adb logcat -s 标签名
eg、adb logcat -s MainActivity

18.删除系统应用:
adb remount(重新挂载系统分区,使系统分区重新可写)
adb shell
cd /system/app
rm *.apk

19.获取管理员权限:
adb root

20.启动Activity
adb shell am start -n 包名/包名+类名(-n 类名,-a action,-d date,-m MIME-TYPE,-c category,-e 扩展数据,等)
eg、adb shell am start -n com.hrtx.activity/com.hrtx.activity.MainActivity

21.发布端口:
设置任意的端口号,做为主机向模拟器或设备的请求端口。
eg、adb forward tcp:5555 tcp:8000

22.查看bug报告:
adb bugreport

23.记录无线通讯日志:
一般来说,无线通讯的日志非常多,在运行时没必要去记录,但我们还是可以通过命令设置记录:
adb shell
logcat -b radio

24.获取设备的ID和序列号:
adb get-product
adb get-serialno

25.访问数据库SQLite3
adb shell
sqlite3

*******************************************************************

Android AIDL详解

Android_AIDL

1.     AIDL (Android Interface DefinitionLanguage )接口描述语言

2.     AIDL 适用于 进程间通信,并且与Service端多个线程并发的情况,如果只是单个线程 可以使用 Messenger ,如果不需要IPC 可以使用Binder

3.     AIDL语法:基础数据类型都可以适用,List Map等有限适用。static field 不适用。

要使用AIDL我们需要两个应用程序,一个作为Service端,一个作为Client端。详细步骤如下:

基本使用步骤:

第一步:在Service端建立.aidl文件。实际实现的接口是在 gen中自动生成的对应的抽象内部类 Stub。注意:

1、导入包名,不能在src目录下创建,否则在实现的时候找到Stub类。

2、如果有使用Object对象,需要该对象 implement Parcelable 接口,并且需要导入该接口包名+类名,如果是primitivetype 不需要这步。

3、定义方法名称。

4、所有的.aidl文件以及需要传递的对象接口需要在Service 与Client中各一份,并且包名要和服务器端的一样(建议从服务器端拷贝)。

示例代码:

package com.example.android_aidl_host.aidl;

interface IRemoteService{

int getId();

void setId(int id);

}

第二步:在Service中实现.aidl 接口(通常在service中实现)。

public class MyHostService extends Service{

privateint id;

@Override

publicIBinder onBind(Intent intent) {

//TODO Auto-generated method stub

returnbind;

}

privatefinal IRemoteService.Stub bind = new IRemoteService.Stub() {

@Override

publicint getId() throws RemoteException {

//TODO Auto-generated method stub

returnid;

}

@Override

publicvoid setId(int id) throws RemoteException {

//TODO Auto-generated method stub

MyHostService.this.id= id;

}

};

}

注意:在服务器端建立好service要在manifest文件中进行注册,并且为其加上action属性。我的配置如下:

<serviceandroid:name="com.example.android_aidl_host.MyHostService">

<intent-filter>

//其它程序通过此入口获得数据,就好比ContentProvider

<actionandroid:name="com.xz.apk"/>

</intent-filter>

</service>

经过以上两步服务器的代码就已经完成了,就等其它进程来获取数据了。下面来写Client端的代码。

第一步:在Activity中通过Intent意图绑定service。

Intent service = new Intent("com.xz.apk");//必须与服务器端一致

bindService(service, new MyConn(),BIND_AUTO_CREATE);

第二步:获取服务返回的stub对象。

iService = IRemoteService.Stub.asInterface(service);

完整的Activity代码如下:

public class MainActivity extends Activity {

//aidl文件生成的java文件名

IRemoteService iService;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//绑定service

Intent service = new Intent("com.xz.apk");

bindService(service, new MyConn(),BIND_AUTO_CREATE);

}

public void changId(View view) {

switch (view.getId()) {

case R.id.set://客户端的set按钮

try {

//调用服务器端的setId()方法

iService.setId(200);

catch (RemoteException e) {

e.printStackTrace();

}

break;

case R.id.get: //客户端的get按钮

try {

//调用服务器端的getId()方法

iService.getId();

Log.e("DDDDD",iService.getId() + "");

catch (RemoteException e) {

e.printStackTrace();

}

break;

default:

break;

}

}

private class MyConn implements ServiceConnection {

@Override

public void onServiceConnected(ComponentName name, IBinder service){

//通过自动生成的Stub内部类,调用asInterface()方法实例化IRemoteService对象

    iService =IRemoteService.Stub.asInterface(service);

}

@Override

public void onServiceDisconnected(ComponentName name) {

// TODO Auto-generatedmethod stub

}

}

}

Demo2:通过AIDL传递对象(Person),此实例既传递了普通数据又传递了对象。

1、定义该对象Person,并实现Parcelable。

2、添加Person.aidl文件,并采用如下方式编写导入Person

注意Person文件和Person.aidl文件必须放在同一个包中并且两者要同时存在,否则报错。

3、需要在引用到Person的.aidl文件中import+Person所在包名

4、需要在服务端和客户端都添加 Person.aidl与 Person.java文件并且需要一致。

Person类代码:

package com.example.android_aidl_mydemo_server.aidls;

import android.os.Parcel;

import android.os.Parcelable;

public class Person implements Parcelable {

String name;

int age;

//省略了相应的get和set方法

/**

* 在想要进行序列号传递的实体类内部一定要声明该常量。常量名只能是CREATOR,类型也必须是

* Parcelable.Creator<T>

*/

public static final Parcelable.Creator<Person>CREATOR = newParcelable.Creator<Person>() {

/***

* 根据序列号的Parcel对象,反序列号为原本的实体对象

* 读出顺序要和writeToParcel的写入顺序相同

*/

public Person createFromParcel(Parcel in) {

//            String name =source.readString();

//              int age =source.readInt();

//              String sex =source.readString();

//              Beauty beauty =new Beauty();

//             beauty.setName(name);

//              beauty.setAge(age);

//             beauty.setSex(sex);

//

//              returnbeauty;

return new Person(in);

}

/**

* 创建一个要序列号的实体类的数组,数组中存储的都设置为null

*/

public Person[] newArray(int size) {

return new Person[size];

}

};

public Person() {   }

private Person(Parcel in) {

readFromParcel(in);

}

public int describeContents() {

return 0;

}

public void readFromParcel(Parcel in) {

age = in.readInt();

name = in.readString();

}

/**

* 将对象序列号dest 就是对象即将写入的目的对象 flags有关对象序列号的方式的标识

* 这里要注意,写入的顺序要和在createFromParcel方法中读出的顺序完全相同。例如这里先

* 写入的为name,

* 那么在createFromParcel就要先读name

*/

public void writeToParcel(Parcel dest, int flags) {

dest.writeInt(age);

dest.writeString(name);

}

}

Person.aidl文件:

packagecom.example.android_aidl_mydemo_server.aidls;

parcelable Person;

InData.aidl文件:

packagecom.example.android_aidl_mydemo_server.aidls;

import com.example.android_aidl_mydemo_server.aidls.Person;

interface InData{

String getName();

void setName(String name);

Person getPerson();

}

服务器端的service文件:

package com.example.android_aidl_mydemo_server;

import com.example.android_aidl_mydemo_server.aidls.InData;

import com.example.android_aidl_mydemo_server.aidls.Person;

import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

import android.os.RemoteException;

public class MyServer extends Service {

String name = "JACK";

@Override

public IBinder onBind(Intent arg0) {

// TODO Auto-generatedmethod stub

returnbinder;

}

private final InData.Stub binder = new InData.Stub() {

@Override

public String getName()throws RemoteException {

// TODO Auto-generatedmethod stub

returnname;

}

@Override

public void setName(String name) throws RemoteException {

// TODO Auto-generatedmethod stub

MyServer.this.name = name;

}

@Override

publicPersongetPerson() throws RemoteException {

// TODO Auto-generatedmethod stub

Person person = new Person();

return person;

}

};

}

一说到service我又想起了一定不要忘记在manifest注册并加上action属性!

客户端MainActivity的代码:

package com.example.android_aidl_mydemo_client;

import android.app.Activity;

import android.content.ComponentName;

import android.content.Intent;

import android.content.ServiceConnection;

import android.os.Bundle;

import android.os.IBinder;

import android.os.RemoteException;

import android.util.Log;

import android.view.Menu;

import com.example.android_aidl_mydemo_server.aidls.InData;

import com.example.android_aidl_mydemo_server.aidls.Person;

public class MainActivity extends Activity {

InData inData;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Intentservice=newIntent("com.ssss.xz.apk");

bindService(service, new MyConnection(),BIND_AUTO_CREATE);

}

private class MyConnection implements ServiceConnection{

@Override

public void onServiceConnected(ComponentName name, IBinder service){

// TODO Auto-generatedmethod stub

inData=InData.Stub.asInterface(service);

try {

Log.e("SSSSSS",inData.getName());

inData.setName("Hello AIDL");

Log.e("SSSSSS",inData.getName());

Person user=inData.getPerson();

Log.e("HHHHHHHH",user.getName());

Log.e("HHHHHHHH",user.getAge()+"");

catch (RemoteException e) {

// TODO Auto-generatedcatch block

e.printStackTrace();

}

}

@Override

public void onServiceDisconnected(ComponentName name) {

// TODO Auto-generatedmethod stub

inData=null;

}

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; thisadds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

}

*******************************************************************

android dx批处理

dx是将java的classes文件编译为字节码dex文件

dx --dex --output=<要生成的classes.dex路径> <要处理的类文件的路径>

dx --dex --output=D:/HelloWorld/bin/classes.dex D:/HelloWorld/bin

*******************************************************************

dexdump反编译Android程序

反编译Android程序目前没有什么好的方法,但是在Android Emulator中可以找到一个名为dexdump(在Android SDK的Tools目标下)的程序,

通过dexdump可以查看出apk文件中的dex执行情况,ophone8.com粗略分析出原始java代码是什么样的和Dot Net中的Reflector很像。

android编译器生成的java class相关内容都放到了dex(.dex 是字节码文件,Dalvik VM上就运行的是.dex)文件中,为什么要反编译apk文件呢?

就目前来看Android开放度还很低,很多东西只有反编译官方的app才可以了解一些底层的东西。

对于软件开发人员来说,保护代码安全也是比较重要的因素之一,不过目前来说Google Android平台选择了Java Dalvik VM的方式使其程序很容易破解和被修改,

首先APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式可以看到内部的文件结构,类似Sun JavaMe的Jar压缩格式一样,不过比较去别的是Android上的二进制代码被编译成为Dex的字节码,

所有的Java文件最终会编译进该文件中去,作为托管代码既然虚拟机可以识别,那么我们就可以很轻松的反编译。所有的类调用、涉及到的方法都在里面体现到,至于逻辑的执行可以通过实时调试的方法来查看,

当然这需要借助一些我们自己编写的跟踪程序。模拟器自带了一个dexdump,有兴趣的网友可以先了解下,同时以及有关APK文件的汉化,我们将在下一次做详细的分析,因为这里主要是修改的不是dex而是资源文件,

使用类似UltraEdit这样的工具以字节对齐的方式逐个替换即可,最终再签名下即可使用,这样的行为可以算作是非法修改,不过目前这样的方法在国内很流行,Google最然在Android Market上设置了权限保护app-

private文件夹的安全,但是最终我们使用修改定值的系统仍然可以获取到需要的文件。

首先要把apk的class.dex dump出来:

具体步骤:

1.用winrar或者winzip打开apk,直接拖出来。
2.用android sdk1.1版本以上的一个dexdump工具把class.dex文件dump成文本:
把刚才的class.dex文件放在和dexdump工具同目录 用命令窗口执行 :
dexdump.exe -d classes.dex > spk.txt 
意思是将classes.dex  dump出来形成一个 txt 文件。
下一步就要读懂这个txt文件了,先从header中可以看清楚这个应用的总体信息,有几个类,包括内部类 ,header只是了解概况。

要详细去分析下面的每一个class才能真正理解这个软件的设计过程。最好的方法是一边研究里面的opcode一边打开api来查看里面调用到的类和方法,减少误解的机率。
opcode就是介于高级编程语言和二进制代码之间的一层中间码,operation 
code 叫操作码。读懂opcode主要是熟悉里面的逻辑跳转以及一些个别助记符的含义。。
通过opcode你就可以清晰的知道里面每个方法资源的调用过程和逻辑跳转过程。做过的例子都有点复杂,就不举例了。当然,要破解整个apk最好是翻译opcode和应HexWorkShop查看资源文件相结合比较合理和轻松,

尤其是ManiFest.xml这个文件,一定要看清楚里面的activity和service receiver,permissions 这几个部分的信息,这可能会成为整个破译流程的关键部分 能够说的经验暂时就只有这么多,正着手写一个工具专门用来翻译

opcode成java代码。。这是一个复杂的过程,普通的资源调用只需要匹配相关的文本就能翻译过来,但是一些复杂的跳转和个别特殊表达式需要费时费力去想想。

**********************************************************************

fastboot 详解

1.Fastboot简介

Fastboot是Android快速升级的一种方法,Fastboot的协议fastboot_protocol.txt在源码目录./bootable/bootloader/legacy下可以找到。

Fastboot客户端是作为Android系统编译的一部分,编译后位于./out/host/linux-x86/bin/fastboot目录下。

Fastboot命令实例:sudo fastboot flash kernel path-to-kernel/uImage

烧写rootfs类似:sudo fastboot flash system path-to-system/system.img

2.命令

2.1 升级系统

sudo fastboot flash bootloader u-boot.bin
sudo fastboot flash kernel uImage
sudo fastboot flash system system.img
sudo fastboot flash userdata userdata.img
sudo fastboot flash ramdisk ramdisk-uboot.img
sudo fastboot erase cache

fastboot flash {partition} {*.img}   例:fastboot flash boot boot.img或fastboot flash system system.img等。

fastboot flashall   注意:此命令会在当前目录中查找所有img文件,将这些img文件烧写到所有对应的分区中,并重新启动手机。

一次烧写boot,system,recovery分区:

(1)创建包含boot.img,system.img,recovery.img文件的zip包。

(2)执行:fastboot update {*.zip}

烧写开机画面:

fastboot flash splash1 开机画面

2.2 重启系统

sudo fastboot reboot

2.3 不烧写flash情况下调试

sudo fastboot boot uImage 或者u-boot.bin

2.4 查看版本号

sudo fastboot getver:version

2.5 复位到bootloader

sudo fastboot reboot-bootloader

2.6 命令格式

主机端发送字符串的命令,字符串小于等于64个字节,客户端首先返回四个字节的内容,是OKAY、FAIL、DATA、INFO之一,随后跟着是信息或数数据。

2.7 清空分区

fastboot erase {partition}   例:fastboot erase boot或fastboot erase system等。

fastboot erase boot

fastboot erase system

fastboot erase data

fastboot erase cache

上面的命令也可以简化成一条命令

fastboot erase system -w

2.8 获取客户端(手机端)变量信息

fastboot getvar version:version-bootloader:version-baseband:product:serialno:secure

version 客户端支持的fastboot协议版本

version-bootloader  Bootloader的版本号

version-baseband    基带版本

product             产品名称

serialno             产品序列号

secure              返回yes 表示在刷机时需要获取签名

3.支持的参数

偏移和地址在u-boot中定义,要想使用好fastboot,就必须要知道参数名称与文件的对应关系。

name offset size
xloader 0x00000000 0x00080000
bootloader 0x00080000 0x00180000
environment 0x001C0000 0x00040000
kernel 0x00200000 0x01D00000
system 0x02000000 0x0A000000
userdata 0x0C000000 0x02000000
cache 0x0E000000 0x02000000
name type of file usual file
xloader xloader binary MLO
bootloader uboot binary u-boot.bin
environment text file list of variables to set
kernel kernel or kernel + ramdisk uImage, uMulti
system yaffs2 system.img
userdata yaffs2 userdata.img
cache yaffs2 ?

4.其他功能

4.1环境变量

fastboot支持环境变量文件,通常在fastboot烧写nand flash时,会将偏移量和大小写入环境变量中,命名格式为:

<partition name>_nand_offset
<partition name>_nand_size

例如,内核烧写完成后printenv可以看到:

kernel_nand_offset=0x140000
kernel_nand_size=0x1f70000

4.2查看USB设备

查看连接到OTG的USB设备情况,lsusb:

Bus 008 Device 030: ID 0451:cafe Texas Instruments, Inc. <----- fastboot

更多细节查看cat /proc/bus/usb/devices

4.3 静态模块地址

fastboot重用内核的nand地址分配方式,并且大部分是可以变化的,但是下面列出来的这些地址是不变的。

name                 offset                 size

xloader          0x00000000      0x00080000

bootloader     0x00080000      0x00180000

environment  0x001C0000      0x00040000

4.4 文件大小限制

最大下载文件大小为240M。

5 参考文献

1. Android Fastboot: http://www.omappedia.org/wiki/Android_Fastboot#Updating_system_image_on_NAND

2. fastboot_protocol.txt

时间: 2024-10-05 07:23:26

aapt,adb,aidl,dx工具的使用的相关文章

dx工具(android将jar包转成dex格式二进制jar包工具)

博客分类: android 时钟 dx工具二进制jar包 好吧,不得不承认这个工具真心难找,也不知道自己sdk里以前怎么就有了,还好给了师傅一份,现在重装系统从网上找这个工具都找不到. 将platform-tools.zip解压,将其内部资源拷贝到android sdk platform-tools目录下即可使用(window环境). 编译命令,cmd进入到android sdk platform-tools目录 dx --dex --output=target.jar origin.jar 上

mac平台使用adb、tcpdump工具抓取android手机网络包

在开发手机app的时候我们想看下自己app发出的网络请求,这个时候我们需要tcpdump工具进行抓包.要实现tcpdump抓包,需要以下几步: 这里以android 手机华为 P6为例子 1. 手机ROOT 要使用tcpdump工具,必需先获得手机的root权限,试过好几种root工具,最后发现360的一键ROOT工具可对P6这台机器root 下载PC版的360一键root工具,下载地址 , 然后用usb线将手机链接到电脑,同时打开USB调试(设置->开发人员选项->USB调试) 然后按照他的

Android 工具:adb

Android 工具:adb 引言 Android 开发中, adb 是开发者经常使用的工具,是 Android 开发者必须掌握的. Android Debug Bridge,Android 调试桥接器,简称 adb ,该工具位于 <sdk>/platform-tools/ 目录下,其源码位于 <path-to-sourcecode>/system/core/adb 目录下,是用于管理模拟器或真机状态的万能工具. adb 采用了客户端-服务器模型,包括三个部分: 客户端部分,运行在

Android aapt 工具介绍(转)

目录(?)[-] AAPT 工具介绍 AAPT 的帮助信息 查看AAPT的版本 使用AAPT列出资源包apk文件列表 使用AAPT打包资源文件 使用AAPT解压资源包apk 来自:http://mmmyddd.freeshell.net/blog.cgi/Computer/Android/aapt-decompress-apk AAPT 工具介绍 下面是取自"http://www.androidcn.net/wiki/index.php/Reference/aapt"的介绍 aapt

Android SDK目录结构和工具介绍

Android SDK目录结构和工具介绍是本文要介绍的内容,主要是来了解并学习Android SDK的内容,具体关于Android SDK内容的详解来看本文. AD: Android SDK目录结构和工具介绍是本文要介绍的内容,主要是来了解并学习Android SDK的内容,具体关于Android SDK内容的详解来看本文. Android SDK目录下有很多文件夹,主要都是干什么的呢? 1.add-ons这里面保存着附加库,比如GoogleMaps,当然你如果安装了OphoneSDK,这里也会

Android 提供的一系列辅助系统开发工具

除了软件本身的代码之外,Android 还提供了一系列工具来辅助系统开发,这些主要的工具包括: aapt(AndroidAssetPackagingTool):用于建立zip兼容的包(zip.jar.apk),也可用于将资源编译到二进 制的 assets. adb(Android Debug Bridge,Android 调试桥):使用 adb 工具可以在模拟器或设备上安装应用程序的.apk 文件,并从命令行访问模拟器或设备.也可以用它把 Android 模拟器或设备上的应用程序代码和一个标准

android常用开发工具的用法

1.在命令行创建.删除和浏览AVD 管理AVD需要Android SDK目录下的tools子目录下的android命令,android+下面的命令 list:列出机器上所有已经安装的android版本和AVD设备. list avd:列出机器上所有已经安装的android版本. list target:列出机器上所有已经安装的android版本. create avd:创建一个avd设备. move avd:移动或者重命名一个avd设备 delete avd:删除一个avd设备 update a

AS问题解决系列1—Unable to execute DX错误

http://my.oschina.net/1pei/blog/478968 摘要 在将一个开源Android代码import到Android Studio 1.2.2中时,解决了编译期间出现的“Unable to execute DX(Multiple dex files define)”问题,并学习了DX工具在应用程序编译期间所起的作用. 今天在将一个开源Android代码import到Android Studio 1.2.2中,在编译期间出现一个“Unable to execute DX”

android工具

1.tools android:SDK Manager. ddms:Delvik Debug Monitor Service,基于adb的图形化工具,参考下面的adb. emulator:Android模拟器,要使用emulator就要先创建一个AVD(Android Virtual Devices),可以使用AVD创建不同版本的emulator. 2.platform-tools adb:主要调度工具,CS结构,由三个部分组成 (1)client端 运行在PC上,可以由ADT,DDMS,She