如何打磨一个受欢迎的山寨app(2)

来源:互联网 发布:程序员站立办公 编辑:程序博客网 时间:2024/04/29 03:58

好了,牛吹多了终究不好,现在来点实在的。

万事开头难,难在不知道在哪里开头,好在android的开头在哪里我是知道的,那就是AndroidManifest.xml文件,这个文件是一个app的清单文件,通过这个文件,可以看到app从哪里来,从哪里去。现在,我们可以分析一下这个清单文件。

清单的所有内容如下:

<?xmlversion="1.0"encoding="utf-8"?>

<manifestxmlns:android="http://schemas.android.com/apk/res/android"

package="com.topnews"

android:versionCode="1"

android:versionName="1.0">


<uses-sdk

android:minSdkVersion="7"

android:targetSdkVersion="18"/>


<application

android:name=".app.AppApplication"

android:allowBackup="true"

android:icon="@drawable/icon"

android:label="@string/app_name"

android:theme="@style/AppTheme">

<activity

android:name="com.topnews.Welcome"

android:label="@string/app_name">

<intent-filter>

<actionandroid:name="android.intent.action.MAIN"/>


<categoryandroid:name="android.intent.category.LAUNCHER"/>

</intent-filter>

</activity>

<activityandroid:name="com.topnews.MainActivity">

</activity>

<activityandroid:name="com.topnews.ChannelActivity">

</activity>

<activityandroid:name="com.topnews.DetailsActivity">

</activity>

<activityandroid:name="com.topnews.CityListActivity">

</activity>

<activityandroid:name="com.topnews.SettingsActivity">

</activity>

<activityandroid:name="com.topnews.ImageShowActivity">

</activity>

</application>


<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>

<uses-permissionandroid:name="android.permission.INTERNET"/>

<!--SDCard中创建与删除文件权限-->

<uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

<!--SDCard写入数据权限-->

<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<!--震动权限-->

<uses-permissionandroid:name="android.permission.VIBRATE"/>

</manifest>


分析:

<?xml version="1.0"encoding="utf-8"?>

<manifestxmlns:android="http://schemas.android.com/apk/res/android"

package="com.topnews"

android:versionCode="1"

android:versionName="1.0">


分析:这里可以看到xml的版本是1.0,听说1.1正在弄,编码格式是utf-8,这个格式,最好不要变,对于字符编码,这里不需要在展开了。需要提示一下的是,如果adt设置得不对,比如默认编码是gbk,那么这里看到的中文可能是乱码。知道就好,xmlns,就是xml的命名空间,这里用的是schemas这种约束方式,其实xml和html不一样,html的标签都是已经有了统一的规范,而xml不一样,xml的标签没有任何预先定义好的规范,所有的规范是你自己定义的,你定义好规范之后,你后面的xml文档如果遵循这个规范,那么你定义好的规范就成了后面xml文档的命名空间,其实不难,实在不能理解的,可以看看这里,http://blog.csdn.net/wanghuan203/article/details/9204337

package="com.topnews" 

这个是包名,作为应用的唯一标记。

android:versionCode="1"

对消费者不可见,仅用于应用市场、程序内部识别版本,判断新旧等用途。

android:versionName="1.0">

展示给消费者,消费者会通过它认知自己安装的版本。


<uses-sdk

android:minSdkVersion="7"

android:targetSdkVersion="18"/>


分析:7就是这个android app可以兼容的最低版本,7对应这android2.1,如果手机低于这个版本,就会安装不上。targetSdkVersion这个参数相对复杂一些,如果设置了此属性,那么在程序执行时,如果目标设备的API版本正好等于此数值, 他会告诉Android平台:此程序在此版本已经经过充分测,没有问题。不必为此程序开启兼容性检查判断的工作了。 也就是说,如果targetSdkVersion与目标设备的API版本相同时,运行效率可能会高一些。 但是,这个设置仅仅是一个声明、一个通知,不会有太实质的作用, 比如说,使用了targetSdkVersion这个SDK版本中的一个特性,但是这个特性在低版本中是不支持的 ,那么在低版本的API设备上运行程序时,可能会报错:java.lang.VerifyError。也就是说,此属性不会帮你解决兼容性的测试问题。 你至少需要在minSdkVersion这个版本上将程序完整的跑一遍来确定兼容性是没有问题的。


android版本与api 的对应关系


Android版本名和API Level关系全称

Android的版本

Android版本名称Code name

Android的API level

Android 1.0 (API level 1)

1.0

(no code name)

API level 1

Android 1.1 (API level 2)

1.1

(no code name)

API level 2

Android 1.5 Cupcake (API level 3)

1.5

Cupcake

API level 3, NDK 1

Android 1.6 Donut (API level 4)

1.6

Donut

API level 4, NDK 2

Android 2.0 Eclair (API level 5)

2.0

Eclair

API level 5

Android 2.0.1 Eclair (API level 6)

2.0.1

Eclair

API level 6

Android 2.1 Eclair (API level 7)

2.1

Eclair

API level 7, NDK 3

Android 2.2–2.2.3 Froyo (API level 8)

2.2.x

Froyo

API level 8, NDK 4

Android 2.3–2.3.2 Gingerbread (API level 9)

2.3 – 2.3.2

Gingerbread

API level 9, NDK 5

Android 2.3.3–2.3.7 Gingerbread (API level 10)

2.3.3 – 2.3.7

Gingerbread

API level 10

Android 3.0 Honeycomb (API level 11)

3.0

Honeycomb

API level 11

Android 3.1 Honeycomb (API level 12)

3.1

Honeycomb

API level 12, NDK 6

Android 3.2 Honeycomb (API level 13)

3.2.x

Honeycomb

API level 13

Android 4.0–4.0.2 Ice Cream Sandwich (API level 14)

4.0.1 – 4.0.2

Ice Cream Sandwich

API level 14, NDK 7

Android 4.0.3–4.0.4 Ice Cream Sandwich (API level 15)

4.0.3 – 4.0.4

Ice Cream Sandwich

API level 15, NDK 8

Android 4.1 Jelly Bean (API level 16)

4.1.x

Jelly Bean

API level 16

Android 4.2 Jelly Bean (API level 17)

4.2.x

Jelly Bean

API level 17

Android 4.3 Jelly Bean (API level 18)

4.3.x

Jelly Bean

API level 18

Android 4.4 KitKat (API level 19)

4.4

KitKat

API level 19



<application

android:name=".app.AppApplication"

android:allowBackup="true"

android:icon="@drawable/icon"

android:label="@string/app_name"

android:theme="@style/AppTheme">


分析:这个几个参数,其实很简单,就是app的名字,是否允许数据备份,以及app的图标,标签,主题等等。


<activity

android:name="com.topnews.Welcome"

android:label="@string/app_name">

<intent-filter>

<actionandroid:name="android.intent.action.MAIN"/>

<categoryandroid:name="android.intent.category.LAUNCHER"/>

</intent-filter>

</activity>

分析:

一个应用程序可以有多个Activity,每个Activity是同级别的,那么在启动程序时,最先启动哪个Activity呢?有些程序可能需要显示在程序列表里,有些不需要。怎么定义呢?android.intent.action.MAIN决定应用程序最先启动的Activity ,android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里。Main和LAUNCHER同时设定才有意义,如果有多个同级的Activity都有过滤器

<intent-filter>

 <action android:name="android.intent.action.MAIN" />

 <category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

则只有最前面的Activity的 <action android:name="android.intent.action.MAIN" /> 有效,启动该程序时,执行的是该Activity。且在程序列表中有多个图标,这些Activity都在程序列表中显示,该Application有多个入口,执行不同的Activity,但是整个程序的主入口(整个程序最先运行的那个activity)只有最先定义的那个Activity。

如果一个应用没有LAUNCHER则该apk仍能安装到设备上,但是在主程序图中看不到。如果给那个Activity 设定了LAUNCHER,且同时设定了Main,则这个Activity就可出现在程序图中;如果没有Main,则不知启动哪个Activity,故也不会有图标出现。

所以,<actionandroid:name="android.intent.action.MAIN"/>指明了,welcome是程序的入口。


<activityandroid:name="com.topnews.MainActivity"></activity>

<activityandroid:name="com.topnews.ChannelActivity"></activity>

<activityandroid:name="com.topnews.DetailsActivity"></activity>

<activityandroid:name="com.topnews.CityListActivity"></activity>

<activityandroid:name="com.topnews.SettingsActivity"></activity>

<activityandroid:name="com.topnews.ImageShowActivity"></activity>

</application>


<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>

<uses-permissionandroid:name="android.permission.INTERNET"/>

<!--SDCard中创建与删除文件权限-->

<uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

<!--SDCard写入数据权限-->

<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<!--震动权限-->

<uses-permissionandroid:name="android.permission.VIBRATE"/>

</manifest>


分析:最后一部分就是权限问题了,

android的权限有很多分类,开发app的时候,本着良心,按照权限最小的原则进行(除非你想图谋不轨),好了,下面给出了所有的android的所有权限,需要什么权限,请自行添加:



访问登记属性android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权限获取错略位置android.permission.ACCESS_COARSE_LOCATION,通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在30~1500米获取精确位置android.permission.ACCESS_FINE_LOCATION,通过GPS芯片接收卫星的定位信息,定位精度达10米以内访问定位额外命令android.permission.ACCESS_LOCATION_EXTRA_COMMANDS,允许程序访问额外的定位提供者指令获取模拟定位信息android.permission.ACCESS_MOCK_LOCATION,获取模拟定位信息,一般用于帮助开发者调试应用获取网络状态android.permission.ACCESS_NETWORK_STATE,获取网络信息状态,如当前的网络连接是否有效访问Surface Flingerandroid.permission.ACCESS_SURFACE_FLINGER,Android平台上底层的图形显示支持,一般用于游戏或照相机预览界面和底层模式的屏幕截图获取WiFi状态android.permission.ACCESS_WIFI_STATE,获取当前WiFi接入的状态以及WLAN热点的信息账户管理android.permission.ACCOUNT_MANAGER,获取账户验证信息,主要为GMail账户信息,只有系统级进程才能访问的权限验证账户android.permission.AUTHENTICATE_ACCOUNTS,允许一个程序通过账户验证方式访问账户管理ACCOUNT_MANAGER相关信息电量统计android.permission.BATTERY_STATS,获取电池电量统计信息绑定小插件android.permission.BIND_APPWIDGET,允许一个程序告诉appWidget服务需要访问小插件的数据库,只有非常少的应用才用到此权限绑定设备管理android.permission.BIND_DEVICE_ADMIN,请求系统管理员接收者receiver,只有系统才能使用绑定输入法android.permission.BIND_INPUT_METHOD ,请求InputMethodService服务,只有系统才能使用绑定RemoteViewandroid.permission.BIND_REMOTEVIEWS,必须通过RemoteViewsService服务来请求,只有系统才能用绑定壁纸android.permission.BIND_WALLPAPER,必须通过WallpaperService服务来请求,只有系统才能用使用蓝牙android.permission.BLUETOOTH,允许程序连接配对过的蓝牙设备蓝牙管理android.permission.BLUETOOTH_ADMIN,允许程序进行发现和配对新的蓝牙设备变成砖头android.permission.BRICK,能够禁用手机,非常危险,顾名思义就是让手机变成砖头应用删除时广播android.permission.BROADCAST_PACKAGE_REMOVED,当一个应用在删除时触发一个广播收到短信时广播android.permission.BROADCAST_SMS,当收到短信时触发一个广播连续广播android.permission.BROADCAST_STICKY,允许一个程序收到广播后快速收到下一个广播WAP PUSH广播android.permission.BROADCAST_WAP_PUSH,WAP PUSH服务收到后触发一个广播拨打电话android.permission.CALL_PHONE,允许程序从非系统拨号器里输入电话号码通话权限android.permission.CALL_PRIVILEGED,允许程序拨打电话,替换系统的拨号器界面拍照权限android.permission.CAMERA,允许访问摄像头进行拍照改变组件状态android.permission.CHANGE_COMPONENT_ENABLED_STATE,改变组件是否启用状态改变配置android.permission.CHANGE_CONFIGURATION,允许当前应用改变配置,如定位改变网络状态android.permission.CHANGE_NETWORK_STATE,改变网络状态如是否能联网改变WiFi多播状态android.permission.CHANGE_WIFI_MULTICAST_STATE,改变WiFi多播状态改变WiFi状态android.permission.CHANGE_WIFI_STATE,改变WiFi状态清除应用缓存android.permission.CLEAR_APP_CACHE,清除应用缓存清除用户数据android.permission.CLEAR_APP_USER_DATA,清除应用的用户数据底层访问权限android.permission.CWJ_GROUP,允许CWJ账户组访问底层信息手机优化大师扩展权限android.permission.CELL_PHONE_MASTER_EX,手机优化大师扩展权限控制定位更新android.permission.CONTROL_LOCATION_UPDATES,允许获得移动网络定位信息改变删除缓存文件android.permission.DELETE_CACHE_FILES,允许应用删除缓存文件删除应用android.permission.DELETE_PACKAGES,允许程序删除应用电源管理android.permission.DEVICE_POWER,允许访问底层电源管理应用诊断android.permission.DIAGNOSTIC,允许程序到RW到诊断资源禁用键盘锁android.permission.DISABLE_KEYGUARD,允许程序禁用键盘锁转存系统信息android.permission.DUMP,允许程序获取系统dump信息从系统服务状态栏控制android.permission.EXPAND_STATUS_BAR,允许程序扩展或收缩状态栏工厂测试模式android.permission.FACTORY_TEST,允许程序运行工厂测试模式使用闪光灯android.permission.FLASHLIGHT,允许访问闪光灯强制后退android.permission.FORCE_BACK,允许程序强制使用back后退按键,无论Activity是否在顶层访问账户Gmail列表android.permission.GET_ACCOUNTS,访问GMail账户列表获取应用大小android.permission.GET_PACKAGE_SIZE,获取应用的文件大小获取任务信息android.permission.GET_TASKS,允许程序获取当前或最近运行的应用允许全局搜索android.permission.GLOBAL_SEARCH,允许程序使用全局搜索功能硬件测试android.permission.HARDWARE_TEST,访问硬件辅助设备,用于硬件测试注射事件android.permission.INJECT_EVENTS,允许访问本程序的底层事件,获取按键、轨迹球的事件流安装定位提供android.permission.INSTALL_LOCATION_PROVIDER,安装定位提供安装应用程序android.permission.INSTALL_PACKAGES,允许程序安装应用内部系统窗口android.permission.INTERNAL_SYSTEM_WINDOW,允许程序打开内部窗口,不对第三方应用程序开放此权限访问网络android.permission.INTERNET,访问网络连接,可能产生GPRS流量结束后台进程android.permission.KILL_BACKGROUND_PROCESSES,允许程序调用killBackgroundProcesses(String).方法结束后台进程管理账户android.permission.MANAGE_ACCOUNTS,允许程序管理AccountManager中的账户列表管理程序引用android.permission.MANAGE_APP_TOKENS,管理创建、摧毁、Z轴顺序,仅用于系统高级权限android.permission.MTWEAK_USER,允许mTweak用户访问高级系统权限社区权限android.permission.MTWEAK_FORUM,允许使用mTweak社区权限软格式化android.permission.MASTER_CLEAR,允许程序执行软格式化,删除系统配置信息修改声音设置android.permission.MODIFY_AUDIO_SETTINGS,修改声音设置信息修改电话状态android.permission.MODIFY_PHONE_STATE,修改电话状态,如飞行模式,但不包含替换系统拨号器界面格式化文件系统android.permission.MOUNT_FORMAT_FILESYSTEMS,格式化可移动文件系统,比如格式化清空SD卡挂载文件系统android.permission.MOUNT_UNMOUNT_FILESYSTEMS,挂载、反挂载外部文件系统允许NFC通讯android.permission.NFC,允许程序执行NFC近距离通讯操作,用于移动支持永久Activityandroid.permission.PERSISTENT_ACTIVITY,创建一个永久的Activity,该功能标记为将来将被移除处理拨出电话android.permission.PROCESS_OUTGOING_CALLS,允许程序监视,修改或放弃播出电话读取日程提醒android.permission.READ_CALENDAR,允许程序读取用户的日程信息读取联系人android.permission.READ_CONTACTS,允许应用访问联系人通讯录信息屏幕截图android.permission.READ_FRAME_BUFFER,读取帧缓存用于屏幕截图读取收藏夹和历史记录com.android.browser.permission.READ_HISTORY_BOOKMARKS,读取浏览器收藏夹和历史记录读取输入状态android.permission.READ_INPUT_STATE,读取当前键的输入状态,仅用于系统读取系统日志android.permission.READ_LOGS,读取系统底层日志读取电话状态android.permission.READ_PHONE_STATE,访问电话状态读取短信内容android.permission.READ_SMS,读取短信内容读取同步设置android.permission.READ_SYNC_SETTINGS,读取同步设置,读取Google在线同步设置读取同步状态android.permission.READ_SYNC_STATS,读取同步状态,获得Google在线同步状态重启设备android.permission.REBOOT,允许程序重新启动设备开机自动允许android.permission.RECEIVE_BOOT_COMPLETED,允许程序开机自动运行接收彩信android.permission.RECEIVE_MMS,接收彩信接收短信android.permission.RECEIVE_SMS,接收短信接收Wap Pushandroid.permission.RECEIVE_WAP_PUSH,接收WAP PUSH信息录音android.permission.RECORD_AUDIO,录制声音通过手机或耳机的麦克排序系统任务android.permission.REORDER_TASKS,重新排序系统Z轴运行中的任务结束系统任务android.permission.RESTART_PACKAGES,结束任务通过restartPackage(String)方法,该方式将在外来放弃发送短信android.permission.SEND_SMS,发送短信设置Activity观察其android.permission.SET_ACTIVITY_WATCHER,设置Activity观察器一般用于monkey测试设置闹铃提醒com.android.alarm.permission.SET_ALARM,设置闹铃提醒设置总是退出android.permission.SET_ALWAYS_FINISH,设置程序在后台是否总是退出设置动画缩放android.permission.SET_ANIMATION_SCALE,设置全局动画缩放设置调试程序android.permission.SET_DEBUG_APP,设置调试程序,一般用于开发设置屏幕方向android.permission.SET_ORIENTATION,设置屏幕方向为横屏或标准方式显示,不用于普通应用设置应用参数android.permission.SET_PREFERRED_APPLICATIONS,设置应用的参数,已不再工作具体查看addPackageToPreferred(String) 介绍设置进程限制android.permission.SET_PROCESS_LIMIT,允许程序设置最大的进程数量的限制设置系统时间android.permission.SET_TIME,设置系统时间设置系统时区android.permission.SET_TIME_ZONE,设置系统时区设置桌面壁纸android.permission.SET_WALLPAPER,设置桌面壁纸设置壁纸建议android.permission.SET_WALLPAPER_HINTS,设置壁纸建议发送永久进程信号android.permission.SIGNAL_PERSISTENT_PROCESSES,发送一个永久的进程信号状态栏控制android.permission.STATUS_BAR,允许程序打开、关闭、禁用状态栏访问订阅内容android.permission.SUBSCRIBED_FEEDS_READ,访问订阅信息的数据库写入订阅内容android.permission.SUBSCRIBED_FEEDS_WRITE,写入或修改订阅内容的数据库显示系统窗口android.permission.SYSTEM_ALERT_WINDOW,显示系统窗口更新设备状态android.permission.UPDATE_DEVICE_STATS,更新设备状态使用证书android.permission.USE_CREDENTIALS,允许程序请求验证从AccountManager使用SIP视频android.permission.USE_SIP,允许程序使用SIP视频服务使用振动android.permission.VIBRATE,允许振动唤醒锁定android.permission.WAKE_LOCK,允许程序在手机屏幕关闭后后台进程仍然运行写入GPRS接入点设置android.permission.WRITE_APN_SETTINGS,写入网络GPRS接入点设置写入日程提醒android.permission.WRITE_CALENDAR,写入日程,但不可读取写入联系人android.permission.WRITE_CONTACTS,写入联系人,但不可读取写入外部存储android.permission.WRITE_EXTERNAL_STORAGE,允许程序写入外部存储,如SD卡上写文件写入Google地图数据android.permission.WRITE_GSERVICES,允许程序写入Google Map服务数据写入收藏夹和历史记录com.android.browser.permission.WRITE_HISTORY_BOOKMARKS,写入浏览器历史记录或收藏夹,但不可读取读写系统敏感设置android.permission.WRITE_SECURE_SETTINGS,允许程序读写系统安全敏感的设置项读写系统设置android.permission.WRITE_SETTINGS,允许读写系统设置项编写短信android.permission.WRITE_SMS,允许编写短信写入在线同步设置android.permission.WRITE_SYNC_SETTINGS,写入Google在线同步设置



0 0