当前位置:  编程技术>移动开发
本页文章导读:
    ▪WIFI容易的应用        WIFI简单的应用 1.什么是WIFI WIFI就是一种无线联网的技术,以前通过网线来连接电脑,而现在通过无线电波来连网,常见的就是一个无线路由器,那么在这个无线路由器的电波覆盖的有效范围.........
    ▪ Ubuntu10.0.4上CyanogenMod编译环境的搭建和可刷机文件的编译及打包(For HTC Dream)【转】        Ubuntu10.0.4下CyanogenMod编译环境的搭建和可刷机文件的编译及打包(For HTC Dream)【转】 http://www.linuxidc.com/Linux/2010-05/26287.htm   本文只是叙述Ubuntu下编译环境的搭建和ROM的编译过程,过程中可能.........
    ▪ 下上文周期应用       上下文周期应用 在android中context可以作很多操作,但是最主要的功能 是加载 和访问资源 。在android中有两种context,一种是 application context,一种是activity context,通常我们在各种类和方法间.........

[1]WIFI容易的应用
    来源: 互联网  发布时间: 2014-02-18
WIFI简单的应用

1.什么是WIFI

WIFI就是一种无线联网的技术,以前通过网线来连接电脑,而现在通过无线电波来连网,常见的就是一个无线路由器,那么在这个无线路由器的电波覆盖的有效范围内都可以采用WIFI连接方式进行联网

 

2.WIFI网卡的状态

WIFI网卡的状态是由一系列的整型常量来表示的

 

1.WIFI_STATE_DISABLED:网卡不可用

2.WIFI_STATE_DISABLING:WIFI正在关闭

3.WIFI_STATE_ENABLED:WIFI网卡可用

4.WIFI_STATE_ENABLING:WIFI网卡正在打开

5.WIFI_STATE_UNKNOWN:未知网卡状态

 

3.操作WIFI网卡所需要的权限

CHANGE NETWORK STATE

CHANGE WIFI STATE

ACCESS NETWORK STATE

ACCESS WIFI STATE

 

4.改变WIFI网卡的状态

对WIFI网卡的进行操作需要通过WifiManager对象来i进行,获取该对象的方法如下

WifiManager wifi=(WifiManager)Context.getSystemService(Service_WIFI_SERVICE);

打开wifi网卡

wifi.setWifiEnabled(true);

关闭WIFI网卡

wifi.setWifiEnabled(false);

获取网卡当前的状态

wifi.getWifiState();

 


    
[2] Ubuntu10.0.4上CyanogenMod编译环境的搭建和可刷机文件的编译及打包(For HTC Dream)【转】
    来源: 互联网  发布时间: 2014-02-18
Ubuntu10.0.4下CyanogenMod编译环境的搭建和可刷机文件的编译及打包(For HTC Dream)【转】

http://www.linuxidc.com/Linux/2010-05/26287.htm

 

本文只是叙述Ubuntu下编译环境的搭建和ROM的编译过程,过程中可能会需要一些Ubuntu的常规操作技巧,在本文里就不详细介绍了,Ubuntu的新手可以通过谷歌学习一下,笔者也是新手,刚用没多久,谷歌一下并不难,另外由于源码和编译后生成的文件都比较大,如果想要折腾起来的话,Ubuntu的分区最好能有30G,20G的话一会就用完了,笔者之前也是分了20G,但不一会就空间不足了,故最后格掉分区,重新分了100G给Ubuntu。

 

编译环境的搭建

JDK安装
a) JDK是Ubuntu下使用Android SDK,编译源代码等必备的软件包,首先我们现来装这个

b) 从sun官方网站下载最新版的JDK,一般是个.bin的文件,笔者下载的是jdk-6u20-linux-i586.bin(根据文件不同,命令的也会有所变化,大家在使用的时候要注意,主要是文件名和路径的变化)。

c) 由于JDK运行时会在当前目录下安装,所以在安装前,先把它移动到你想要安装的目录,比如笔者将其安装在/usr/lib/jvm/java目录下,如果你也想安装在相同目录,可以照着我下面的命令来做

代码:

sudo –i

cd /usr/lib

mkdir jvm

cd jvm

mkdir java

cd java

cp “jdk-6u20-linux-i586.bin所在目录“/jdk-6u20-linux-i586.bin /usr/lib/jvm/java

chmod u+x jdk-6u20-linux-i586.bin

jdk-6u20-linux-i586.bin

此时会出现JDK的安装提示说明,按着回车不放,提示说明会持续滚动,www.linuxidc.com直到屏幕提示需要输入Yes/NO,输入YES后,即开始安装,安装完成后提示按回车继续,按完回车后,安装即告成功

d) 与Windows不同,Ubuntu是没有注册表的,故安装完成后,我们需要把我们安装JDK的目录告诉系统,故在刚才的终端里执行如下命令(如果是新开的终端,没有执行过“sudo -i”,则需要在命令前+“sudo”获得权限)

代码:

gedit /etc/environment

此时在会弹出一个文本编辑器,里面显示

代码:

PATH=”……”

其中省略号部分是其默认的路径,这里我们不要动它,我们需要对这个进行一些修改,将我们的JDK安装路径写进去,告诉系统我们的JDK装在哪里,去哪里调用,故做如下修改:

i. 在原有的 PATH=”……” 的省略号里面添加:

代码:

PATH=”……:/usr/lib/jvm/java/jdk1.6.0_20/bin”

ii. 添加两行,输入如下内容:

代码:

CLASSPATH=.:/usr/lib/jvm/java/jdk1.6.0_20/lib

JAVA_HOME=/usr/lib/jvm/java/jdk1.6.0_20

最后生成如下形式:

代码:

PATH=”……:/usr/lib/jvm/java/jdk1.6.0_20/bin”

CLASSPATH=.:/usr/lib/jvm/java/jdk1.6.0_20/lib

JAVA_HOME=/usr/lib/jvm/java/jdk1.6.0_20

其中,省略号部分是文件原有内容,我们在后面新加了一部分内容和两个新行。修改完成后保存退出。

e) Ubuntu有可能会自带JDK或者安装多个JDK,此时需要将我们安装的这个设置为默认

i. 首先,将我们的JDK安装目录加入到JDK的选择菜单,执行如下代码:

代码:

update-alternatives –install /usr/bin/java java /usr/lib/jvm/java/jdk1.6.0_12/bin/java 300

update-alternatives –install /usr/bin/javac javac /usr/lib/jvm/java/jdk1.6.0_12/bin/javac 300

ii. 其次,通过命令来选择默认的JDK,执行如下代码:

代码:

update-alternatives –config java

iii. 最后,再来检查一下系统当前的JDK版本,输入以下代码查看:

代码:

java -version

f) 至此,JDK即告安装成功。

Android SDK安装
a) 既然是做rom,那肯定需要调试和测试的工具,Android的官方SDK同样提供官方版本,我们直接下载安装即可。

b) 去谷歌的官网下载最新的SDK版本,前几天刚跟新了支持2.2的r6,不过SDK的官方网站在墙后,我们只能FQ过去下载,这点比较无奈。官方提供Windows,Mac OS X,Linux三个版本,毫无疑问,我们需要下载Linux的版本。

c) SDK不需要安装,直接解压就可以使用。建议放在主目录下,方便调用。

d) 为了方便adb命令的使用,我们同样需要将adb命令所在的目录添加到系统环境变量中去,这样,在任何目录下都能直接调用adb,不需要现cd到SDK目录,这样会比较方便,实现方法如下:

代码:

sudo gedit ~/.bashrc

用文本编辑器打开.bashrc文件,然后在最后添加一行:

代码:

export PATH=${PATH}:<你sdk的目录>/tools

这里的需要将你sdk的安装目录添写进去,保存后即可。

e) 把手机连上usb,然后在终端中输入:

代码:

adb devices

会列出所有连接在电脑上的Android设备,如果看到一串数字和字母的序列号的显示的话,即表示SDK安装成功。

 

 

软件安装
a) 配置源,更新源之类的问题就不再说了,直接说我们需要的软件,从同步源码到编译rom我们总计需要用到以下几个软件,有部分软件在我们更新过程中可能已经自动安装了,但这不影响我们工作,我把所有需要用到的程序列了出来:

? git-core

? gnupg

? flex

? bison

 

? gperf

 

? libsdl-dev

? libesd0-dev

? libwxgtk2.6-dev

? build-essential

? zip

? curl

? libncurses5-dev

? zlib1g-dev

? valgrind

? libreadline5-dev

b) 以上这些程序均通过apt-get命令来安装,比如要安装git-core软件,我们通过输入如下命令来实现:

代码:

sudo apt-get install git-core

c) 其它软件的安装过程类似,替换掉最后的软件名称即可。

d) 安装完所有软件后,编译CyanogenMod所需要的所有环境均搭建完成了。

 

源码同步
repo的安装
a) CyanogenMod的源码地址是http://github.com/cyanogen/android,你可以通过网址右上角的Download Source来下载源码。不过我们并不推荐这种方式下载,因为源码的变化较为频繁,每次一旦源码有变化,我们就需要重新下载完整的源码包,既费时又费力,效率也很低,故推荐通过repo同步的方式来做,在同步过程中,仅会同步源码的变化部分,效率较高。

b) Repo的安装

i. repo的安装比较方便,之需要下载一个文件,并设置成可执行权限,并添加到系统环境中去即可,具体命令如下:

代码:

cd ~

mkdir bin

在你的home根目录下创建名为bin的文件夹。

代码:

sudo gedit ~./bashrc

打开你的环境变量配置文件,在最后加一行:

代码:

export PATH=$PATH:~/bin

修改后保存文件退出,关闭终端,重新打开一个终端,输入如下命令验证路径是否成功添加到环境变量中去了:

代码:

echo $PATH

确认完后,开始安装repo,执行如下命令:

代码:

curl http://Android.git.kernel.org/repo > ~/bin/repo
chmod a+x ~/bin/repo

通过curl命令将repo下载到bin中,并将其权限修改为可执行文件,至此repo的安装结束。

Repo的配置和同步
i. 在主目录下新建一个文件夹,作为源码的存放目录

代码:

cd ~

mkdir cyanogenmod

cd cyanogenmod

ii. 在cyanogenmod目录执行repo命令,设定需要同步的源码内容:

代码:

repo init -u git://github.com/cyanogen/Android.git -b eclair

网址即为cyanogenmod的地址,-b表示我们选择需要同步的分支,cyanogenmod有不少分支,比如dount,eclair,以后还会有froyo,我们目前需要编译的是2.1,即eclair,则通过-b eclair来选择2.1的分支。

iii. 在配置过程中,会让你选择名字和邮箱,这个会显示在你最后编译出来的rom的基础信息里,可以选择你喜欢的来写

iv. 配置完成后,就可以开始同步源码了:

代码:

repo sync

同步的过程会比较长,建议在晚上睡觉前开始同步,一般早上起来就能好了。

编译环境的设置
编译环境的建立
a) 同步玩源码后,首先需要建立编译环境,CM的源码把这些命令都写成了脚本,我们只需运行相应的脚本即可,首先,先cd到源码的根目录,然后执行如下命令:

代码:

./build/envsetup.sh

执行后,屏幕上会显示:

代码:

including vendor/cyanogen/vendorsetup.sh

此时,编译环境设置成功。

 

 

 

专属文件的提取
a) 虽然Android系统是开源的,但有部分Dream的专属文件是不开源的,所以并不包含在源码树中。但如果希望rom能在Dream真机上运行,又需要这些文件,所以需要将这些文件提取出来,在CM中,这个操作比较简单,Steve已经给我们做好脚本了。

b) 首先你要确保安装成功了上述所有软件,然后,将Dream通过usb连接到电脑上。

c) cd到源码的/vendor/htc/dream_sapphire目录,然后执行脚本:

 

 

代码:

./extract-files.sh

d) 这个操作会调用adb命令,从你的手机里pull所需要的专属文件到vendor目录。

编译文件的修改
a) 默认的编译过程包含了所有的语言和程序,但其实我们并不需要这些,可以通过编译文件的修改来定义需要输出的语言和软件

b) 打开/vendor/cyanogen/products 目录下的cyanogen.mk文件,里面定义了要输出的软件和语言,对于不需要的软件,可以直接删除。但不建议在这里修改,可以从最后的输出目录里删除不需要的,直接在这里改容易出错

c) 在文件的最后,有一行”PRODUCT_LOCALES”,这里就包含了rom支持的语言类型,默认有几十种,编译出来后,软件会比较大,一般我们只需要保留其中的常用语言即可,笔者选择保留了en_US,zh_CN和zh_TW这三种语言,编译出来的软件就小了很多。

Kernel编译
1. kernel是Android的核心,也是最重要的部分,虽然CM源码中自带了编译完成的kernel,但既然是自主编译,那你肯定想改改kernel的信息吧,比如kernel的名字,比如打上BFS补丁、超频补丁等等,那你就需要自己来编译kernel了。

2. 编译kernel也非常简单,首先你需要一个kernel的配置文件,CM提供了现成的,直接去/kernel-msm/arch/arm/configs 目录里找,有个配置文件叫cyanogen_msm_defconfig,这个就是我们需要的配额之文件了(如果是给Nexus编译kernel的话,需要选择cyanogen_mahimahi_defconfig)。将它复制到/kernel-msm 的根目录,然后重命名为 .config

3. 用文本编辑器打开.config,其中有一条参数为CONFIG_LOCALVERSION=”-cyanogenmod”,这里即为kernel编译完成后显示的名字,可以把cyanogenmod改成任意你喜欢的名字。

4. 设置完成后,就可以开始编译了。先cd到/kernel-msm目录,然后执行如下命令

代码:

export ARCH=arm

export CROSS_COMPILE=arm-eabi-

export PATH=$PATH:~/cyanogenmod/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin

这些命令定义了编译kernel时所需要用到的环境和设置。注意第三条命令在输入的时候,路径要和自己实际安放源码的路径一致,另外,每次编译kernel前,都需要重新输入这三个命令。

5. 命令输入完后,就可以开始make了:

代码:

make -j3

make就是开始编译的命令,后面的参数-j3表示用于编译的cpu核心数量,一般是cpu核心数量+1,比如双核cpu,就用-j3这个参数。

6. 编译过程根据配置不同而有所不同,笔者笔记本用的T6400是双核2G的,一般编译kernel的时间在10分钟内。编译后的kernel生成在/kernel-msm/arch/arm/boot/目录下,名字叫zImage

CyanogenMod编译
1. 编译完kernel后,就可以开始编译主菜CM了。编译前需要先生成一个buildspec.mk文件,来定义需要编译的rom的基本信息。先cd到源码的根目录,新建一个空文件,名字叫buildspec.mk,并用记事本打开,输入如下信息:

代码:

TARGET_PRODUCT:=cyanogen_dream_sapphire

TARGET_BUILD_VARIANT:=eng

TARGET_BUILD_TYPE:=release

TARGET_PREBUILT_KERNEL:=kernel/arch/arm/boot/zImage

a) 第一条命令表示需要编译的rom的选择,我们现在编译的是G1的rom,故选择cyanogen_dream_sapphire;

b) 第二条命令表示编译的rom的种类,有eng和userdebug两个类型可选,我们当然选在eng;

c) 第三个命令表示编译的rom的类型,我们选择release

d) 第四个命令表示基于哪个kernel来编译rom,如果不设这个命令,则会基于自带的kernel来编译,既然我们自己编译了kernel,那当然用我们自己的,故设置了已经编译好的kernel的目录,供make过程调用。

2. buildspec.mk文件建立好后,就可以开始编译rom了,cd到源码根目录,然后使用命令:

代码:

make -j3

开始编译源码,源码的编译过程会比较长,试配置不同,需要的时间也不一样,笔者的T6400编译完整的CM差不多需要2个小时。

3. 编译完成后,我们的成品就在/out/target/product目录中,里面包含了system.img,recovery.img,boot.img和system文件夹等,到这里,有点制作rom经验的朋友就不需要我再多说了吧。可以在fastboot里直接刷system.img,和boot.img;也可以将system文件夹和boot.img打包成zip包,添加更新脚本并签名,通过recovery刷到机器里,至此,我们自己编译的CyanogenMod for HTC Dream就大功告成了。

1 楼 w11h22j33 2011-03-26  
Android带给我们的不仅仅是优秀的触控,漂亮的界面,快速的事件处理,让我们爱不释手!最重要的,它是开源的,任何android的爱好者都可以在它许可的权限范围内对android的源码做修改,移植,定制,以满足自己的需求。由此,目前非官方的第三方ROM受到了众多手机玩家以及android开发者的热爱,他们或者厌倦了原有的桌面程序,想换换口味,或者是为了优化手机处理能力,去掉一些厂家自带的应用程序。而本文,将引领大家尝试亲自手动编译android的源代码,并且将它移植到自己心爱的手机上。

      本文以CyanogenMod团队优化过的基于android2.1的源代码讲述如何将它移植到htc legend(g6)手机上。

   个人认为CyanogenMod团队是目前非官方ROM开发中非常优秀的,它们制作的android源代码不仅仅可以移植到htc dream,margic,legend,hero,还可以移植到moto xt701,xt702等手机上,实属不容易。

   成功将android2.1移植到手机上,需经过以下几个步骤:

   一,准备好android2.1源码编译环境以及手机USB调试环境。

   二,将手机上硬件驱动程序以及相关的配置文件通过ADB命令保存好。

   三,针对不同的手机机型,制作相应的vendor配置文件。

   四,编译源码。

   五,通过手机提供的bootloader刷机或者直接以recovery的方式更新ROM。

   在以上五个步骤中,其中最难处理的便是第2个步骤,这个步骤需要熟悉每个手机机型的硬件参数,并且能够在手机上找到相关的驱动程序以及了解他们如何配置。而CyanogenMod团队公布的源码当中,己经将相关的工作做好了,编译源码之前仅仅需要执行相应的shell命令,便可顺利的下载相应的手机驱动程序以及配置文件。

下面是移植步骤,供参考:

   一,首先需要下载CyanogenMod 5.0.8的源码:

   $ mkdir android-cm5

   $ cd android-cm5

   $ repo init -u git://github.com/CyanogenMod/android.git -b eclair

   $ repo sync

  二,下载CyanogenMod需要的一些共同文件,如果想最终版本中不需要这些APK,也可以通过配置/vendor/cyanogen/cyanogen.mk文件将这些需要的APK COPY命令注释掉。

  $ cd vendor/cyanogen/

  $ ./get-rommanager   #下载一个RomManager.apk包,主要是刷ROM用的。我没用过。

  $ ./get-google-files #其它的一些google开发的android apk包,我也没有用过!

  三,下载针对htc legend(g6)的vendor.

  $ cd ../../vendor/htc

  $ git clone git://github.com/aleho/android_vendor_htc_legend.git #下载针对htc legend(g6)手机的vendor,里面包括相关的配置参数,以及从手机上下载驱动程序的SHELL命令。

  $ mv android_vendor_htc_legend/ legend

  $ cd legend

  $ ./extract-files.sh  #确保这个命令执行将你的手机连接好电脑并且开了手机USB调试,adb命令可以连接手机。这个过程主要是下载htc legend(g6)驱动程序以及配置文件。

  四,针对CyanogenMod 5.0.8源码打上htc legend(g6)的补丁包,这个补丁包主要是wifi和触摸屏的,如果不做,触摸屏将无法触摸以及wifi功能无法启动。可参数地址:

   http://forum.xda-developers.com/archive/index.php/t-702776.html

五,好了,根据自己的爱好,定制自己的一些vendor参数。然后make otapackage便可编译recovery方式的htc legend(g6)包。
2 楼 w11h22j33 2011-03-26  
$ repo sync -j 10
多线程同步下载
3 楼 w11h22j33 2011-03-26  
1.  查看Android源码的各个版本分支,首先下载 android.git.kernel.org/platform/manifest.git ,得到清单文件后执行git branch -a 即可,该命令执行后会查看清单中的packed-refs。

    
[3] 下上文周期应用
    来源: 互联网  发布时间: 2014-02-18
上下文周期应用

在android中context可以作很多操作,但是最主要的功能 是加载 和访问资源 。在android中有两种context,一种是 application context,一种是activity context,通常我们在各种类和方法间传递的是activity context。
比如一个activity的onCreate:
protected void onCreate(Bundle state) {
        super.onCreate(state);

        TextView label = new TextView(this); //传递context给view control
        label.setText("Leaks are bad");

        setContentView(label);
}
把activity context传递给view,意味着view拥有一个指向activity的引用,进而引用activity占有的资源:view hierachy, resource等。
这样如果context发生内存 泄露的话,就会泄露很多内存。
这里泄露的意思是gc没有办法回收activity的内存。

Leaking an entire activity是很容易的一件事。

当屏幕 旋转的时候,系统 会销毁当前的activity,保存状态 信息,再创建一个新的。

比如我们写了一个应用 程序 ,它需要加载一个很大的图片,我们不希望每次旋转屏幕的时候都销毁这个图片,重新加载。实现这个要求的简单想法就是定义 一个静态的Drawable,这样Activity 类创建销毁它始终保存在内存中。
实现类似:
public class myactivity extends Activity {
        private static Drawable sBackground;
        protected void onCreate(Bundle state) {
                super.onCreate(state);

                TextView label = new TextView(this);
                label.setText("Leaks are bad");

                if (sBackground == null) {
                        sBackground = getDrawable(R.drawable.large_bitmap);
                }
        label.setBackgroundDrawable(sBackground);//drawable attached to a view

        setContentView(label);
        }
}
这段程序看起来很简单,但是却问题很大。当屏幕旋转的时候会有leak(即gc没法销毁activity)。
我们刚才说过,屏幕旋转的时候系统会销毁当前的activity。但是当drawable和view关联后,drawable保存了view的 reference,即sBackground保存了label的引用,而label保存了activity的引用。既然drawable不能销毁,它所引用和间接引用的都不能销毁,这样系统就没有办法销毁当前的activity,于是造成了内存泄露。gc对这种类型的内存泄露是无能为力的。

避免这种内存泄露的方法是避免activity中的任何对象 的生命周期长过activity,避免由于对象对 activity的引用导致activity不能正常被销毁。我们可以使用application context。application context伴随application的一生,与activity的生命周期无关。application context可以通过Context.getApplicationContext或者Activity.getApplication方法获取 。

避免context相关的内存泄露,记住以下几点:
1. 不要让生命周期长的对象引用activity context,即保证引用activity的对象要与activity本身生命周期是一样的
2. 对于生命周期长的对象,可以使用application context
3. 避免非静态的内部类,尽量使用静态类,避免生命周期问题,注意内部类对外部对象引用导致的生命周期变化


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

unix/linux知识 iis7站长之家