How to Install apk to Android Devices from Mac OS X

在Mac OS X中我们可以使用Android SDK直接将下载到电脑中的apk文件安装到Android设备中。

1. 下载Android SDK,可以从Android Developers网站直接下载,也可以通过MacPorts安装。我采取后一种方式。

$ sudo port install android
Password:
--->  Fetching archive for android
--->  Attempting to fetch android-16_0.darwin_11.x86_64.tbz2 from http://packages.macports.org/android
--->  Fetching android
--->  Attempting to fetch android-sdk_r16-macosx.zip from http://dl.google.com/android
--->  Attempting to fetch android-appbundles-r89422.tar.gz from http://distfiles.macports.org/android
--->  Verifying checksum(s) for android
--->  Extracting android
--->  Configuring android
--->  Building android
--->  Staging android into destroot
--->  Installing android @16_0
--->  Activating android @16_0
--->  Cleaning android

然后通过port contents命令可以获知Android SDK的安装路径。在我的机器上是/opt/local/share/java/android-sdk-mac_x86。

$ port contents android
Port android contains:
  /Applications/MacPorts/Developer/.localized
  ......
  /opt/local/share/java/android-sdk-mac_x86/tools/adb_has_moved.txt
  /opt/local/share/java/android-sdk-mac_x86/tools/android
  ......

默认安装的Android SDK是没有adb命令(该命令用于安装apk程序)的,需要运行Android SDK and AVD Manager来进行额外的下载安装。

2. 安装SDK Platform-tools

cd /opt/local/share/java/android-sdk-mac_x86/tools
sudo ./android

会显示以下界面,在第一次运行的时候,Android SDK Platform-tools的状态是未安装的,因此我们需要选中该组件,然后点击右下方的“Install packages”按钮。而此处的截图是安装完毕以后的情况。

3. 安装apk软件,当然,这里先要用数据线将Android设备连接到Mac电脑上。

##adb命令是安装到platform-tools目录中,而非上一步android命令所在的tools目录。
cd /opt/local/share/java/android-sdk-mac_x86/platform-tools
##先探测是否可以正确识别设备,有设备号和device字样表示正确识别。 ./adb devices
List of devices attached 
01839c14	device
##安装apk软件,本例中安装的是高德移动导航
$ ./adb install /tmp/Autonavi_v1.2.apk
3225 KB/s (4027409 bytes in 1.219s)
	pkg: /data/local/tmp/Autonavi_v1.2.apk
Success

How to Use Port in Mac OS X to Install New Utilities

假设我们想要在Mac OS X中安装:
MySQL,这是一个开源的免费的数据库,当然备Oracle收购之后有一些变化。
postgreSQL,这又是另外一个开源的免费的数据库。
perl,这是一种流行的编程语言。
lua,这又是另外一种流行的编程语言。
watch,这是一个实用程序,可以默认每隔2秒重复执行某条命令,比如你想监控一个目录下的文件生成情况,这条命令就很有用。
tree,这是一个实用程序,可以提供类似于ls -R的功能,但是输出是更加直观的树状结构。

当然,我们可以在网络中一个一个地找这些程序,然后一个一个地安装,用不同的安装方法,但是,你也可以选择非常简单的方法,这就是本文要介绍的MacPorts。

在Linux中如果我们要安装一些软件,要解决各个软件之间的包依赖性关系,我们会使用到apt-get(Ubuntu)或者yum(Redhat,CentOS)或者zypper(openSUSE),如果你熟悉一些Linux的话,对于这些软件包管理程序应该有所耳闻。而MacPorts正是在Mac OS X上的软件包管理程序。

安装MacPorts最简单的方法是直接下载dmg文件,双击安装 - Lion版安装文件 | Snow Leopard版安装文件

MacPorts安装完以后,我们就可以通过命令行的方式来安装其它软件了,可以参看具体命令文档。以下列出常用的命令:

1. 更新本地软件库列表,该命令可以不定时多次执行(sudo以后需要输入密码,输入你自己用户的密码即可)。

sudo port selfupdate

2. 列出软件库中有哪些软件,注意,该命令会输出大量软件名称,因此建议添加more来查看,或者使用后面的search命令。

port list | more

3. 检索需要安装的软件。

port search 

当然,还有更精确地搜索,比如如果直接port search tree会出现上百个结果,但是如果执行以下命令,就只会出现一个结果。

$ port search --name --exact tree
tree @1.6.0 (sysutils)
    display tree-view of directories with optional color/HTML output

4. 列出已经通过port安装的软件。

port installed

5. 安装软件,一些具有依赖性的软件会连带自动安装,比如安装LUA,会安装ncurses和readline。

sudo port install 

6. 卸载软件。

sudo port uninstall 

7. 清理未成功安装的软件,比如一些软件由于编译问题或者其它原因没有安装成功。

sudo port clean --all 

8. 查看安装的软件都安装了哪些内容。

port contents 

比如查看tree都安装了哪些内容。

$ port contents tree
Port tree contains:
  /opt/local/bin/tree
  /opt/local/share/doc/tree/CHANGES
  /opt/local/share/doc/tree/LICENSE
  /opt/local/share/doc/tree/README
  /opt/local/share/man/man1/tree.1.gz

9. 升级当前安装过的软件。

sudo port upgrade 

升级全部有新版本的软件。升级以后将会保留以前的旧版本,只是将旧版本设置为Inactive。

sudo port upgrade outdated

当确认新版本软件工作正常以后,可以通过以下命令删除所有旧版本软件。

sudo port uninstall inactive

或者通过以下命令,删除指定的旧版本软件。

sudo port uninstall makedepend @1.0.2_0

如果想在升级的时候就直接删除旧版本软件,可以在upgrade时使用-u参数。

sudo port -u upgrade 

10. Troubleshooting
由于MacPorts与Xcode联系紧密,因此如果在升级完操作系统(比如从10.8升级到10.9),可能之前运行正常的MacPorts就无法使用了,比如出现以下报错。

localhost:~ Kamussudo port selfupdate

WARNING: Improper use of the sudo command could lead to data loss
or the deletion of important system files. Please double-check your
typing when using sudo. Type "man sudo" for more information.

To proceed, enter your password, or type Ctrl-C to abort.

Password:
--->  Updating MacPorts base sources using rsync
MacPorts base version 2.1.2 installed,
MacPorts base version 2.2.1 downloaded.
--->  Updating the ports tree
--->  MacPorts base is outdated, installing new version 2.2.1
Installing new MacPorts release in /opt/local as root:admin; permissions 0755; Tcl-Package in /Library/Tcl

Error: /opt/local/bin/port: port selfupdate failed: Error installing new MacPorts base: command execution failed
localhost:~ Kamus sudo port selfupdate
--->  Updating MacPorts base sources using rsync
MacPorts base version 2.1.2 installed,
MacPorts base version 2.2.1 downloaded.
--->  Updating the ports tree
--->  MacPorts base is outdated, installing new version 2.2.1
Installing new MacPorts release in /opt/local as root:admin; permissions 0755; Tcl-Package in /Library/Tcl

Error: /opt/local/bin/port: port selfupdate failed: Error installing new MacPorts base: command execution failed

解决方法是将Xcode的Command Line Tools再安装一遍,通过以下方法。

$ sudo xcode-select --install

然后再运行port命令就功能正常了。

localhost:~ Kamus$ sudo port selfupdate
--->  Updating MacPorts base sources using rsync
MacPorts base version 2.1.2 installed,
MacPorts base version 2.2.1 downloaded.
--->  Updating the ports tree
--->  MacPorts base is outdated, installing new version 2.2.1
Installing new MacPorts release in /opt/local as root:admin; permissions 0755; Tcl-Package in /Library/Tcl


The ports tree has been updated. To upgrade your installed ports, you should run
  port upgrade outdated

Install GI and DB PSU 11.2.0.2.5 Failed in VirtualBox

Oracle的Apply Patchset的方法一直是为人诟病的,其实步骤复杂倒也罢了,怕的是Oracle总在不停地修改Apply Patch的方法,Oracle的原意是让Apply Patch的语法越来越简单,但是各种各样的Patch,各种不同的命令,特别是很大的Bundle Patch,如果不仔细阅读Readme,千万不要轻易出手。

这次尝试在自己的VirtualBox虚拟机OEL6中给之前安装的GI(Oracle Restart)+ ASM + Oracle Database安装最新的11.2.0.2.5 PSU,遇到各种问题。

1. Patch解压的目录必须是grid用户和oracle用户拥有写权限的,如果没有写权限,会报错:

Opatch version check failed for oracle home  /u01/app/oracle/product/11.2.0/dbhome_1
Opatch version  check failed
update the opatch version for the failed homes and retry

安装需求是使用root用户来安装(这是我第一次看到在安装PSU的时候要求使用root用户),而我的虚拟机中由于没有足够的磁盘空间,所以将Mac中的下载目录作为Shared Folder映射到虚拟机中,因此改目录的属主是root,用户组是vboxsf,而且并不允许使用chmod直接修改。因此出现了权限问题。我的解决方法是将grid用户和oracle用户都加入vboxsf组中。

建议:在真实环境中,Patch解压目录应该属于dba用户组。

2. 我的Patch是解压在/media/sf_PSU目录下,解压以后生成了p13343447_112020_Linux-x86-64目录,其下有两个目录分别是13343424(这是DB PSU)和13343447(这是GI PSU),整个目录结构如下所示:

 |-media
 |--sf_PSU
 |---p13343447_112020_Linux-x86-64
 |-----13343424
 |-----13343447

按照Readme文档中描述的,opatch的命令应该写为:

opatch auto 

此处的UNZIPPED_PATCH_LOCATION按照文档描述应该就是/media/sf_PSU目录,因为这是解压目录,但是实际上这份文档是有问题的(注:这是我个人造成的问题,我在操作系统中双击解压zip包,自动生成了p13343447_112020_Linux-x86-64目录,而如果命令行下用unzip解压,则不会出现此目录,因此Oracle文档中的描述并没有问题,但是这里主要吐槽下面的报错信息),如果opatch命令写为:

opatch auto /media/sf_PSU -ocmrf /home/grid/ocm.rsp

其中的-ocmrf是另外一个问题,这个OCM的配置文件,根据Readme文档中描述的方法创建即可。

运行以上命令会报错:

Opatch version check failed for oracle home  /u01/app/oracle/product/11.2.0/dbhome_1
Opatch version  check failed
update the opatch version for the failed homes and retry

是的,你没有看错,我也没有贴错,确实报了一模一样的错误(虽然这两个错误都完全不是opatch版本的问题),所以,opatch的报错信息是不可信的,我们必须要去提示的log文件中仔细查看最后的错误信息。

 ZOP-49: Not able to execute the prereq. OPatch cannot inform if the patch satisfies minimum version requirement.
 PatchObject constructor: Input file "/media/sf_PSU/p13343447_112020_Linux-x86-64/etc/config/actions" or "/media/sf_PSU/p13343447_112020_Linux-x86-64/etc/config/inventory" does not exist.

因此,正确的opatch命令应该是:

opatch auto /media/sf_PSU/p13343447_112020_Linux-x86-64 -ocmrf /home/grid/ocm.rsp

3. Oracle软件所在的文件系统剩余空间必须要大于3G,如果不足,会报错:

patch /media/sf_PSU/p13343447_112020_Linux-x86-64/13343447  apply  failed  for home  /u01/app/grid/product/11.2.0/grid
ACFS-9459: ADVM/ACFS is not supported on this OS version: 'error: file /etc/SuSE-release: No such file or directory

可以看到,又是一次很无稽的报错信息,/etc/SuSE-release?拜托,这里只有/etc/redhat-release。

那么,仔细检查log文件,会发现如下的报错:

 Prerequisite check "CheckSystemSpace" failed.
 The details are:
 Required amount of space(3154696080) is not available.
 UtilSession failed: Prerequisite check "CheckSystemSpace" failed.
 Log file location: /u01/app/grid/product/11.2.0/grid/cfgtoollogs/opatch/opatch2012-01-27_18-23-48PM.log

 OPatch failed with error code 73

到此为止,我放弃了在虚拟机中安装PSU 11.2.0.2.5(如果要增加虚拟机中的文件系统剩余空间是非常麻烦的事情),但是我认为解决了磁盘空间问题之后,后面应该不会再有太多问题了。另外,如果在真实环境中这些问题可能都不存在,因为真实环境中文件系统的剩余空间应该远远不止3G,也应该不会有Shared Folder权限的问题,不过目录位置的问题应该还是会遇到,希望这里遇到的问题对将要在产品环境中Apply 11.2.0.2.5 PSU的朋友有帮助。

如果你成功Apply了该版本的Patch,那么也可以留言告诉我你遇到了什么障碍。

Update@2012-02-09
在另外一台测试的Solaris机器中成功apply了最新的11.2.0.3.1 PSU,包括GI和DB的,由于命令跟本文描述的11.2.0.2.5 PSU的更新方法一样,所以记录在此。如果没有本文描述的上述错误,opatch auto还是很简便的。

# export PATH=$PATH:/u02/app/oracle/product/11.2.0/grid/OPatch
# opatch auto /home/oracle/gi_psu_11.2.0.3.1 -ocmrf /home/grid/ocm.rsp
Executing /usr/bin/perl /u02/app/oracle/product/11.2.0/grid/OPatch/crs/patch112.pl -patchdir /home/oracle -patchn gi_psu_11.2.0.3.1 -ocmrf /home/grid/ocm.rsp -paramfile /u02/app/oracle/product/11.2.0/grid/crs/install/crsconfig_params
defined(@array) is deprecated at /u02/app/oracle/product/11.2.0/grid/OPatch/crs/crsconfig_lib.pm line 2149.
        (Maybe you should just omit the defined()?)
defined(@array) is deprecated at /u02/app/oracle/product/11.2.0/grid/OPatch/crs/crsconfig_lib.pm line 2149.
        (Maybe you should just omit the defined()?)
defined(@array) is deprecated at /u02/app/oracle/product/11.2.0/grid/OPatch/crs/crsconfig_lib.pm line 2227.
        (Maybe you should just omit the defined()?)
opatch auto log file location is /u02/app/oracle/product/11.2.0/grid/OPatch/crs/../../cfgtoollogs/opatchauto2012-02-09_01-37-59.log
Detected Oracle Restart install
Using configuration parameter file: /u02/app/oracle/product/11.2.0/grid/crs/install/crsconfig_params
patch /home/oracle/gi_psu_11.2.0.3.1/13348650/custom/server/13348650  apply successful for home  /u01/app/oracle/product/11.2.0/db_1
patch /home/oracle/gi_psu_11.2.0.3.1/13343438  apply successful for home  /u01/app/oracle/product/11.2.0/db_1
Successfully unlock /u02/app/oracle/product/11.2.0/grid
patch /home/oracle/gi_psu_11.2.0.3.1/13348650  apply successful for home  /u02/app/oracle/product/11.2.0/grid
patch /home/oracle/gi_psu_11.2.0.3.1/13343438  apply successful for home  /u02/app/oracle/product/11.2.0/grid
ACFS-9459: ADVM/ACFS is not supported on this OS version: 'Solaris 11 11/11 X86'
CRS-4123: Oracle High Availability Services has been started.

PSU补丁应用完毕以后,数据库会自动启动,接下来需要继续为数据库运行catbundle.sql。

cd $ORACLE_HOME/rdbms/admin
sqlplus / as sysdba
SQL> @catbundle.sql psu apply

检查PSU补丁情况。

$ opatch lsinventory | grep "Patch Set Update"
Patch Description:  "Database Patch Set Update : 11.2.0.3.1 (13343438)"
Patch Description:  "Grid Infrastructure Patch Set Update : 11.2.0.3.1 (13348650)"

$ sqlplus / as sysdba
SQL> select action,comments from registry$history;

ACTION                         COMMENTS
------------------------------ ------------------------------
APPLY                          PSU 11.2.0.3.1