楼主: 熊猫儿

[转载] 【Android开发网上的一些重要知识点[经验分享]。。】

[复制链接]
论坛徽章:
1682
九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-27 15:37:10九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55玉石琵琶
日期:2014-06-26 16:52:29玉石琵琶
日期:2014-06-26 16:52:29
41#
 楼主| 发表于 2013-1-21 09:32 | 只看该作者
Android版本与Linux内核版本的关系



一.Android版本与Linux内核的关系
英文名

中文名

Android版本

Linux内核版本

No



1.1

Cupcake

纸杯蛋糕

1.5

2.6.27

Donut

甜甜圈

1.6

2.6.29

Eclair

松饼

2.0

2.6.29

Eclair

松饼

2.1

2.6.29

Froyo

冻酸奶

2.2

2.6.32

Gingerbread

姜饼

2.3

2.6.35

Honeycomb

蜂巢

3.0

?

二.下载源码分为2大部分
1.Android源码;

2.Android内核(Android  Linux Kernel);

三.如何下载Android内核
git clone git://android.git.kernel.org/kernel/common.git

四.如何查看Android内核的版本(代码级查看)
在内核代码目录:

运行命令:git branch –a

运行实例
[root@localhost common]# git branch -a  (查看版本)

* android-2.6.36

  remotes/origin/HEAD -> origin/android-2.6.36

  remotes/origin/android-2.6.35

  remotes/origin/android-2.6.36

  remotes/origin/archive/android-2.6.25

  remotes/origin/archive/android-2.6.27

  remotes/origin/archive/android-2.6.29

  remotes/origin/archive/android-2.6.32

  remotes/origin/archive/android-gldfish-2.6.29

  remotes/origin/archive/android-goldfish-2.6.27

五.如何获得指定版本的Linux内核
要想下载2.6.29内核,只要最后执行一下(进入下载后的目录):

git checkout remotes/origin/archive/android-2.6.29   (即上面列出的版本分支)

此时下载到的是2.6.29版本内核了

六.如何获得Android某个版本的源码
例如获得Android1.5的源码

repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake

repo sync



Android 1.5:Cupcake(杯子蛋糕)

Android 1.6:Donut(甜甜圈)

Android 2.0 / 2.1:Eclair(闪电泡芙)

Android 2.2:Froyo(冷冻忧格)

Android 3.0:Gingerbread(姜饼)

Android 3.5:Honeycomb(蜂巢)

Android 4.0:Ice Cream(冰淇淋)



本质上:

想取某个branch而不是主线上的代码,我们需要用-b参数制定branch名字



七.如何获取Android当前主干上最新版本的所有的sourcecode
repo init -u git://android.git.kernel.org/platform/manifest.git



八.如何获取需要某一个project的代码
比如kernel/common,就不需要repo了,直接用Git即可

git clone git://android.git.kernel.org/kernel/common.git

九.列出本地所有分支
git branch

十.如何获取某个branch的代码
如果需要某个branch的代码,用git checkout即可。



比如我们刚刚获取了kernel/common的代码,那就先进入到common目录,然后用下面的命令:

git checkout origin/android-goldfish-2.6.27 -b goldfish  

这样我们就在本地建立了一个名为goldfish的android-goldfish-2.6.27分支,代码则已经与android-goldgish-2.6.27同步。

使用道具 举报

回复
论坛徽章:
1682
九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-27 15:37:10九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55玉石琵琶
日期:2014-06-26 16:52:29玉石琵琶
日期:2014-06-26 16:52:29
42#
 楼主| 发表于 2013-1-21 09:32 | 只看该作者
如何运行Android模拟器



一.查看当前支持哪些版本
Android list targets

在列出的版本中,需要记住id值,这个值在第三步中使用

二.AVD是什么
AVD是Android Virtual Device的缩写,Android虚拟设备,AVD就相当于是一个模拟器的,可以利用AVD创建基于不同版本的模拟器,然后使用emulator-avd avdName命令启动不同的模拟器。

在android sdk 1.5 版本以后的开发中,必须至少创建一个AVD,每个AVD模拟一套虚拟设备来运行Android应用程序。

三.如何创建AVD
android create avd –n avdName –t 2

说明:

-n之后的avdName表示该虚拟设备的名称

n是name的缩写

-t之后的2表示创建1.5版本的avd

t是target的缩写

这里t代表target目标平台的API Level,我们可以使用android list targets来查看这里t的可选参数

命令格式:android create avd -n [avd名称] -t [api level]

android create avd –name adk_1_5_version --target 2

在创建avd文件得第二步,控制台提示“是否自定义自己得设备”,默认选项是"no",如果输入 "y",接下来可以一步步根据提示,定制自己得模拟器性能参数。

四.如何查看创建AVD是否成功
android list avd

五.如何启动模拟器
emulator -avd avdName

六.如何选择启动的皮肤
emulator -avd avdName -skin HVGA-L

七.模拟器如何横纵摆放
按Ctrl+F11,可以直接改变模拟器的横纵摆放

八.创建SDCard镜像文件
mksdcard -l sdcard 512M  e:\sdcard.img

这样就创建了一个512M的SD卡镜像文件:查看E盘,E盘下会有一个sdcard.img 文件

九.运行AVD时加载sdcard
emulator -avd MyAVD -sdcard sdcard.img

如果不想每次都加-sdcard $sdcard_path,有两个办法

解决办法一:可以把sdcard.img 复制到C:\Documents and Settings\Administrator\.android\avd\下对应的AVD目录下

解决办法二:修改配置文件,C:\Documents and Settings\Administrator\.android\avd\AVD_NAME.avd\,打开config.ini,加入以下行:sdcard.path=你的SD卡路径

十.AVD路径设置
不管用Eclipse还是从命令行创建Android Emulator时,相应的文件是被放置到 “C:\Documents and Settings\Administrator\.android“ 下面。如果想改变AVD的路径设置,也有2个办法
解决办法一:
   新添加一个环境变量,名字为 "ANDROID_SDK_HOME”,然后把变量值改为你想将".android”文件夹(AVD信息)所放置的位置
解决办法二:
   修改配置文件中的路径,比如我的AVD名称是MyAVD, 打开
      C:\Documents and Settings\Administrator\.android\avd目录中的文件MyAVD.ini文件,找到
       target=android-5
      path =C:\Documents and  Settings\Administrator\.android\avd\MyAVD.avd
     修改其路径即可

若遇到ERROR: unknown virtual device name 这样的问题一般是由于AVD文件路径引用错误造成的。

使用道具 举报

回复
论坛徽章:
1682
九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-27 15:37:10九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55玉石琵琶
日期:2014-06-26 16:52:29玉石琵琶
日期:2014-06-26 16:52:29
43#
 楼主| 发表于 2013-1-21 09:32 | 只看该作者
adb root错误信息adbd cannot run as root in production builds问题解决
一.问题描述

1.输入指令

>adb root
adbd cannot run as root in production builds

错误信息:
adbd cannot run as root in production builds

2.输入指令:
cd data
$ ls –l
ls –l
opendir failed, Permission denied

$ exit
错误信息:

opendir failed, Permission denied
二.解决办法:


1.首先在手机端安装Superuser Permissions软件;

2.然后执行执行如下命令

adb shell
su
手机上点允许
变#号就成功

使用道具 举报

回复
论坛徽章:
1682
九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-27 15:37:10九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55玉石琵琶
日期:2014-06-26 16:52:29玉石琵琶
日期:2014-06-26 16:52:29
44#
 楼主| 发表于 2013-1-21 09:32 | 只看该作者
APK反编译工具学习笔记
一.dex2jar工具的用途是什么?

用于将dex文件转换为jar文件
二.dex2jar工具在哪儿下载?

http://code.google.com/p/dex2jar/
三.如何使用dex2jar工具?

在cmd下进入dex2jar.bat所在路径,然后输入“dex2jar.bat XXX”,XXX指的是你要反编译的apk中的classes.dex文件所在路径及名称,比如:我的dex2jar.bat在
F:/ Android/Crack/dex2jar-0.0.7.7-SNAPSHOT路径下,
classes.dex在F:/Android/Learn/Test下,所以: 你进入dex2jar.bat路径下后,输入dex2jar.bat D:/Android/Learn/Test/classes.dex,这样会生成一个jar文件。
四.jd-gui工具的作用是什么?

将jar文件反向工程为java代码
五.jd-gui工具在哪儿下载?

http://java.decompiler.free.fr/?q=jdgui
六.如何使用jd-gui工具

使用道具 举报

回复
论坛徽章:
1682
九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-27 15:37:10九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55玉石琵琶
日期:2014-06-26 16:52:29玉石琵琶
日期:2014-06-26 16:52:29
45#
 楼主| 发表于 2013-1-21 09:33 | 只看该作者
upup。。。。

使用道具 举报

回复
论坛徽章:
1682
九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-27 15:37:10九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55玉石琵琶
日期:2014-06-26 16:52:29玉石琵琶
日期:2014-06-26 16:52:29
46#
 楼主| 发表于 2013-1-22 10:30 | 只看该作者
2011年Android Binder机制学习笔记之一
一.Bn是什么缩写?

Binder Native
二.Bp是什么缩写?

Binder Proxy
三.Binder两个方面?

从应用程序的角度看Binder一共有两个方面:
■Native 本地:例如BnABC,这是一个需要被继承和实现的类。
■Proxy 代理:例如BpABC,这是一个在接口框架中被实现,但是在接口中没有体现的类。
客户端:例如客户端得到一个接口ABC,在调用的时候实际上被调用的是BpABC
四.Binder的驱动程序在哪个目录?

kernel/include/linux/binder.h
kernel/drivers/android/binder.c
五.Binder驱动是一个什么设备?

是一个miscdevice,主设备号为10;
六.Binder设备节点,或者说文件路径是什么?

/dev/binder
七.Binder驱动程序在proc文件系统建立的信息,包含什么信息?

proc目录:调用Binder各个进程的内容
state文件:使用函数binder_read_proc_state
stats文件:使用函数binder_read_proc_stats
transactions文件:使用函数binder_read_proc_transactions
transaction_log文件:使用函数binder_read_proc_transaction_log,其参数为binder_transaction_log (类型为struct binder_transaction_log)
failed_transaction_log文件:使用函数binder_read_proc_transaction_log 其参数为
binder_transaction_log_failed (类型为struct binder_transaction_log)
八.Binder在proc文件夹位置:

/proc/binder
九.BR与BC的含义

BR_XXX等宏为BinderDriverReturnProtocol,表示Binder驱动返回协议。
BC_XXX等宏为BinderDriverCommandProtocol,表示Binder驱动命令协议。
十.binder_thread数据结构是怎么样的?

struct binder_thread {
      struct binder_proc *proc;
     struct rb_node rb_node;
     int pid;
     int looper;
     struct binder_transaction *transaction_stack;
     struct list_head todo;
     uint32_t return_error;
     uint32_t return_error2;
     wait_queue_head_t wait;
     struct binder_stats stats;
};

使用道具 举报

回复
论坛徽章:
1682
九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-27 15:37:10九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55玉石琵琶
日期:2014-06-26 16:52:29玉石琵琶
日期:2014-06-26 16:52:29
47#
 楼主| 发表于 2013-1-22 10:30 | 只看该作者
十一.binder_write_read是怎么样的?

struct binder_write_read {
     signed long write_size;
     signed long write_consumed;
     unsigned long write_buffer;
     signed long read_size;
     signed long read_consumed;
     unsigned long read_buffer;
};
十二.binder_thread 的各个成员信息是从哪里获得的?

rb_node
十三.Servicemanager的作用

servicemanager是一个守护进程,用该进程和/dev/binder进行通讯。
十四.servicemanager可执行程序的路径:

/system/bin/servicemanager
十五.BnInterface和BpInterface是两个重要的模版,在哪个文件中定义的?

IInterface.h文件中
十六.BnInterface和BpInterface是如何定义的?

BnInterface模版的定义如下所示:
template class BnInterface : public INTERFACE, public BBinder
{
public:
    virtual sp  queryLocalInterface(const String16& _descriptor);
    virtual String16        getInterfaceDescriptor() const;
protected:
    virtual IBinder*        onAsBinder();
};

BpInterface模版的定义如下所示:
template class BpInterface : public INTERFACE, public BpRefBase
{
public:
                            BpInterface(const sp& remote);
protected:
    virtual IBinder*    onAsBinder();
};
十七.IsericeManager相关的两个文件是什么?

ISericeManager.h
ISericeManager.cpp
十八.ISericeManager是系统最先被启动的服务

十九.IserviceManager知识要点:
1.ISericeManager本地功能并没有使现,
2.它实际上由ServiceManager守护进程执行,
3.用户程序通过调用BpServiceManager来获得其他的服务
二十.如何得到默认的或者缺省的ISericeManager

在ISericeManager.h中定义了一个接口,用于得到默认的ISericeManager:
sp_defaultServiceManager();此时得到的ISericeManager实际上是一个全局的ISericeManager。

使用道具 举报

回复
论坛徽章:
1682
九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-27 15:37:10九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55玉石琵琶
日期:2014-06-26 16:52:29玉石琵琶
日期:2014-06-26 16:52:29
48#
 楼主| 发表于 2013-1-22 10:30 | 只看该作者
如何利用Handler更新android的UI
提出问题

新手刚开始接触android线程编程的时候,会想到如下使用如下代码:
new Thread( new Runnable() {  
    public void run() {  
         myView.invalidate();
     }         
}).start();

但是:该实现方法是不可行的。
分析问题:

因为:Android UI操作并不是线程安全的,这些操作必须在UI线程中执行。
1.myView.invalidate()是UI操作;
2.new Thread创建了一个新的线程,是一个子线程,而不是UI线程,在这个新的线程里面对view进行刷新,这样是不安全的。
解决问题:

那么如何解决这个问题呢?
答案:使用Handler来实现UI线程的更新的。
实现步骤:

1.在view类里面定义一个Handler变量,这并没有开启一个新的线程,因此在handler里面更新本view是安全的;
2.然后我们创建一个线程,通过这个线程来给activity的handler变量发送消息,同时通过这个线程进行延时。

意即:

1.Handler接收消息和处理消息;
2.创建一个线程,来给Handler发送消息;

消息处理三部曲:

1.发送消息;
2.接收消息;
3.处理消息;

使用道具 举报

回复
论坛徽章:
1682
九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-27 15:37:10九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55玉石琵琶
日期:2014-06-26 16:52:29玉石琵琶
日期:2014-06-26 16:52:29
49#
 楼主| 发表于 2013-1-22 10:31 | 只看该作者
代码参考

首先创建简单的View,代码如下:
package com.ray.handler;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.view.View;

public class BounceView extends View {

    float x = 40;
    public BounceView(Context context) {
         super(context);
    }

    @Override
    protected void onDraw(Canvas canvas) {
         x+=10;
         Paint mPaint = new Paint();
         mPaint.setAntiAlias(true);
         mPaint.setColor(Color.GREEN);
         canvas.drawCircle(x, 40, 40, mPaint);
    }
}

创建Activity类,代码如下:
package com.ray.handler;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.Window;

public class TestHandler extends Activity {
     protected static final int GUIUPDATEIDENTIFIER = 0x101;

     Thread myRefreshThread = null;
     BounceView myBounceView = null;

     Handler myHandler = new Handler() {//在主线程中创建Handler对象
          public void handleMessage(Message msg) {//处理消息
               switch (msg.what) {
                    case TestHandler.GUIUPDATEIDENTIFIER://
                         myBounceView.invalidate();//UI界面更新
                         break;
               }
               super.handleMessage(msg);
          }
     };


     public void onCreate(Bundle savedInstanceState) {

          super.onCreate(savedInstanceState);
          this.requestWindowFeature(Window.FEATURE_NO_TITLE);
          this.myBounceView = new BounceView(this);
          this.setContentView(this.myBounceView);

          new Thread(new myThread()).start();//创建一个子线程

     }

//线程类,这个线程只是发送消息,然后延时而已。

     class myThread implements Runnable {

          public void run() {

               while (!Thread.currentThread().isInterrupted()) {

                    

                    Message message = new Message();

                    message.what = TestHandler.GUIUPDATEIDENTIFIER;

                    

                    TestHandler.this.myHandler.sendMessage(message); //发送一次消息,自动调用上面handler类的handleMessage函数,从而更新view类。

                    try {

                         Thread.sleep(100); //延时

                    } catch (InterruptedException e) {

                         Thread.currentThread().interrupt();

                    }

               }

          }

     }

}

使用道具 举报

回复
论坛徽章:
1682
九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-27 15:37:10九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55九尾狐狸
日期:2012-09-19 11:12:55玉石琵琶
日期:2014-06-26 16:52:29玉石琵琶
日期:2014-06-26 16:52:29
50#
 楼主| 发表于 2013-1-22 10:31 | 只看该作者

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表