appt命令检测Apk信息的方法
步骤如下:
1.Export unsigned apk----------->Eclipse
Android Tools > Export Unsigned Application Package----->FishEye.apk
2.命令行运行appt命令------------>E:\android\android-sdk\platform-tools加入Path系统变量
C:\Documents and Settings\Administrator>aapt dump badging f:\fedoraShare\documen
t\FishEye.apk
package: name='com.baony.fisheys' versionCode='1' versionName='1.0'
sdkVersion:'8'
targetSdkVersion:'15'
uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE'
uses-permission:'android.permission.MOUNT_UNMOUNT_FILESYSTEMS'
application-label:'FishEye'
application-icon-120:'res/drawable-ldpi/ic_launcher.png'
application-icon-160:'res/drawable-mdpi/ic_launcher.png'
application-icon-240:'res/drawable-hdpi/ic_launcher.png'
application-icon-320:'res/drawable-xhdpi/ic_launcher.png'
application: label='FishEye' icon='res/drawable-mdpi/ic_launcher.png'
launchable-activity: name='com.baony.fisheys.FishEye' label='FishEye' icon=''
uses-permission:'android.permission.READ_EXTERNAL_STORAGE'
uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WR
ITE_EXTERNAL_STORAGE'
uses-feature:'android.hardware.touchscreen'
uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch
screen unless explicitly made optional'
main
supports-screens: 'small' 'normal' 'large' 'xlarge'
supports-any-density: 'true'
locales: '--_--'
densities: '120' '160' '240' '320'
native-code: 'armeabi'
浏览器在移动互联网应该扮演什么角色?这个问题业内争论已久:从不同内核解析排版能力的纯技术层面,到是否有资格成为一个强势资源分发渠道的商业层面。
目前并没有任何一种观点能够成为绝对的主导者。这与支撑新一代移动Web产业发展的底层技术——HTML5标准的不确定性密切相关。
但本文目的不在于讨论标准和技术,而是以外围生态系统的“容忍度”、国内主流移动应用形态的变迁作为切入点,详细分析浏览器在移动互联大产业中将会遭遇的“隐性危机”。
上游危机
浏览器必须要走平台化的路线,这一点在PC平台上就已经得到业内共识。
平台化的本质在于,将浏览器从单纯的“页面浏览工具”转变为服务载体,汇聚整合所有外部资源,然后以个性化的方式向用户输出价值。
大方向没有错,但移动浏览器想要照搬PC的思路,却要承担大得多的风险——来自上游操作系统提供商的钳制。
PC平台上的第一次浏览器大战,微软用免费预装的方式彻底击垮NetScape后,就不思进取了,IE浏览器的发展长期处于停滞状态。直到Google提供免费的Web应用反向渗透桌面之前,他们根本就没想过去认真研究浏览器,然后就有了“微软失去的十年”这种说法。
移动平台就完全不同了。目前三大主流操作系统采用的都是以应用商店为中心的分发模式,尤其是iOS和Windows Phone,任何系统级的修改都是它们不能容忍的——你最多只能调用,而不可能替代某一组件。第三方浏览器不约而同地选择平台化,对操作系统的潜在威胁在 于:替换应用商店这一分发渠道,从而圈住资源跃升为“亚操作系统”,将底层操作系统管道化。
这也许是一种极端的说法,但苹果和微软对第三方浏览器的反制其实已经很明显了:浏览网络的程序必须使用它们定制的框架和渲染引擎——换一种说法 就是封杀一系列私有API和内核,将主要基于HTML5的Web App体验控制在一定水准之下,形成对现有App生态系统的保护。
更倒霉的是采用私有Presto内核的Opera,面向中国市场的欧朋浏览器始终被App Store以各种理由拒之门外,公司甚至不得不“违心”向苹果解释“其实我们做的不是浏览器”。
Android对于第三方浏览器的态度最为缓和。但随着移动版Chrome的正式推出,以及Google为解决碎片化对于系统定制权限的收紧,没理由认为宽松的政策会一直延续下去。
惟一不受制于人的方法就是脱离这些平台,将浏览器从“亚操作系统”彻底衍生为真正的操作系统。就像Firefox那样,直接推出基于Gecko核心的Firefox OS。
很显然,无论从技术还是市场角度看,这个选择都太过沉重。
跨维度攻击
即使移动浏览器能够挣脱操作系统的压制,实现平台化,这一产品形态也将遭遇新的挑战——来自其他移动应用平台的竞争。
目前移动应用平台化主要有两种路径,第一种是类似Evernote的“品牌平台化”,在单一产品获得优质口碑之后,开放API推出各种垂直定位 的子产品,利用云端技术整合数据形成平台;第二种则是国内应用的普遍做法,对某个用户量规模化的产品开放API和叠加各种基础功能,追求流量和资源的最大 化,例如微信、微博以及地图。
这里主要讨论第二种形式对于移动浏览器(目前它们的平台化也走这种形式)的影响。其实质在于:随着平台化进程的不断深入,应用的工具属性将逐渐消解,各种产品从不同的维度互相靠近,最后殊途同归地转变为一个个综合服务平台。
微博和微信是最先面临这个问题的一对应用。原本双方的工具属性和用户关系链大致平行,不存在竞争。但随着微信开放公众平台增强媒体属性,就立刻 引发了与微博竞合的论战;而微信选择二维码和财付通试水O2O业务后,新浪微博也立刻启动类似的战略,据传已经与银联达成合作,以解决O2O中最难啃的线 下支付环节。
近期火热的地图应用,百度、高德“不约而同”地选择转型生活服务平台,加入O2O大战。高德更是与新浪微博合作进军LBS社交,开始建立对一个基础平台来说至关重要的账号体系。
社交、LBS、通讯、媒体、O2O……你会发现,所有移动基础平台发展到最终形态,都将具备几乎同样的功能,形成跨维度竞争。
但对浏览器来说,这个过程要艰难得多。从产品功能的使用路径来看,用户在微信、微博中点击或者接受一个商业信息,通过社交关系链传播,最后转移到线下完成支付;地图平台中,用户则是从基于LBS的检索和推送开始,通过社交关系链传播,最后同样转移到线下。
如果将以上步骤转移到浏览器平台上,会发现使用过程极其生硬——你在浏览资讯过程中,
会产生社交和线下购物的需求吗?——就算用户真的有了这种想法,也必须退出正在浏览的页面,在另一个页面中找到相关应用,再通过点击完成需求。这个使用路径远不如身出社交、地图工具的基础平台那样平滑自然。
现在的移动浏览器形态,实质上仍然是PC思路的转移:以链接为核心解析互联网结构。但移动互联与PC互联网最大的区别点就是连接线下,而这一点浏览器和Web应用架构还无法提供。这也导致浏览器平台在与其他移动基础平台的竞争中,不得不处于被动状态。
如果只是做单纯的媒体平台,在其他基础平台都拥有精准信息推送系统的情况下,浏览器平台同样也没有任何明显优势。
这就是移动浏览器面对的“囚徒困境”:单一工具化变现能力有限,可能会错失HTML5的机遇,而平台化又将遭遇操作系统和其他移动平台合力绞杀的风险。
多方博弈中,什么样的产品形态能保证利益的最大化?这是浏览器厂商必须要思考的问题。
在实际开发中,也许我们需要做这样的界面,可分为两种情况:
1、应用程序具备多语言版本(如中文简体,中文繁体,英文等),用户界面上显示的文本会根据系统
的情况自动套用资源,比如我的系统是简体中文版的,那就使用简体中文的资源文件中的内容。
2、用户可以选择语言如简体中文、繁体中文。根据用户选择的语言,动态加载资源文件中的字符串。就像我为本文做的这个例子,运行后,默认选中“简体中文”,即页面中的文本显示为简体中文。
然后,选择“繁體中文”,这时候,界面上的文本也相应地进行变化。
嗯,大致效果就是这样了。
接下来,我们一起来做一做这个实例,通过实例来理解其中的奥妙吧。
1、启动VS 2012,新建一个空页面的应用程序项目(此处省略47个字)。
2、在项目中新建一个文件夹,名为“Strings”,再在这个新文件夹下再建两个文件夹,分别名为
“zh-Hans”和“zh-Hant”,注意,语言限定名不要输错,前者是简体中文,后者是繁体中文。
3、分别在上面建的两个文件夹中各建一个资源文件,文件名按默认即可,Resources.resw。
这方便在代码中引用。(操作方法是在文件夹上右击,从菜单中选择“新建项”,找到“资源文件”)。
如果您的操作无误,现在您的项目资源目录结构就像下图那样。记住,不管你用的是法语,日语,中文还是鸟语,资源文件的名字必须一样,只是放在不同文
件夹下,而文件夹以语言标记命名(如zh-CN),就这么简单, 不要弄错就行了。
4、先打开简体中文zh-Hans下面的资源文件,输入三个项,再打开zh-Hant下面的资源文件,
也输入三个项,记着,键名必须相同,只是值不同罢了,该用什么语言就用什么,牛语言的资
源就输入牛语,用作鸟语的资源就输入鸟语,就像翻译一样。
如下图所示。5、打开MainPage.xaml,布局代码我直接贴,也不解释了。
- <Page
- x:
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:local="using:App2"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- mc:Ignorable="d">
- <Page.Resources>
- <Style x:Key="tbTitle" TargetType="TextBlock">
- <Setter Property="FontSize" Value="20"/>
- <Setter Property="Margin" Value="4,20,0,3"/>
- </Style>
- <Style x:Key="strdisplaytb" TargetType="TextBlock">
- <Setter Property="FontSize" Value="28"/>
- <Setter Property="TextWrapping" Value="Wrap"/>
- </Style>
- </Page.Resources>
- <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
- <StackPanel Margin="25">
- <ComboBox x:Name="cbSelectLang" Width="235" HorizontalAlignment="Left">
- <ComboBoxItem>简体中文</ComboBoxItem>
- <ComboBoxItem>繁體中文</ComboBoxItem>
- </ComboBox>
- <TextBlock Text="第一项文本:" />
- <TextBlock x:Name="txtbText1" />
- <TextBlock Text="第二项文本:" />
- <TextBlock x:Name="txtbText2" />
- <TextBlock Text="第三项文本:" />
- <TextBlock x:Name="txtbText3" />
- </StackPanel>
- </Grid>
-
</Page>
6、打开代码视图(MainPage.xaml.cs),在构造函数中为ComboBox绑定一个事件处理程序。
- public MainPage()
- {
- this.InitializeComponent();
- this.cbSelectLang.SelectionChanged += cbSelectLang_SelectionChanged;
-
}
- void cbSelectLang_SelectionChanged(object sender, SelectionChangedEventArgs e)
- {
- ComboBox cb = sender as ComboBox;
- if (cb != null)
- {
- string appLanguage = string.Empty;
- switch (cb.SelectedIndex)
- {
- case 0:
- appLanguage = "zh-Hans";
- break;
- case 1:
- appLanguage = "zh-Hant";
- break;
- default:
- appLanguage = "zh-Hans";
- break;
- }
- //更改语言
- ResourceContext rsContext = ResourceManager.Current.DefaultContext;
- rsContext.Languages = new List<string>(new string[] { appLanguage });
- //rsContext.QualifierValues["Language"] = appLanguage;
- //加载资源
- ResourceLoader loader = new ResourceLoader();
- this.txtbText1.Text = loader.GetString("item1");
- this.txtbText2.Text = loader.GetString("item2");
- this.txtbText3.Text = loader.GetString("item3");
- }
-
}
ResourceContext rsContext = ResourceManager.Current.DefaultContext;
rsContext.Languages = new List<string>(new string[] { appLanguage });
同时,下面有一行我给注释了。
//rsContext.QualifierValues["Language"] = appLanguage;
也就是说,两种方法都可以修改首选语言。
一是设置ResourceContext的Languages属性;
二是ResourceContext的QualifierValues是一个字典集合,我们修改其中键为Language的值
也能达到同样效果。
那么,应用程序的资源的URI和结构以及引用资源的标识符是如何分布的呢?且听下回分解。88
5.png (23.63 KB, 下载次数: 0)