当前位置: 杏彩时时彩平台手机版 > 益智类 > 正文

Android应用去广告,内置应用截屏方法

时间:2019-10-02 15:41来源:益智类
在Android平台创造收益颇为困难。许多开发者投入许多时间创建、测试及推广他们的应用,结果却未能达到创收独立的状态。我们浏览了50份Android游戏lt;uses-permission android:name="android.per

在Android平台创造收益颇为困难。许多开发者投入许多时间创建、测试及推广他们的应用,结果却未能达到创收独立的状态。我们浏览了50份Android游戏&应用事后分析及开发者收益报告,总结出若干可行的最佳实践和技巧。

1 需求

在市面上有些比较实用的app应用,比如说:日历app、文件管理app,视频播放器app。这些app中大部分都内置了广告。
其实有广告也是情有可原的,因为这些app的开发都是需要成本的,开发者制作后将其供用户们免费使用,为了能够套现,所以很多开发者选择往应用中植入各种第三方广告平台的SDK。这样,用户们打开这些应用时,就会遭受各式各样的广告,比如说像这样:

图片 1

广告

像这样:

图片 2

广告

很多用户会抱怨一不小心就会点到那个广告,如果是在移动网络下,还会浪费流量,因为点到了广告后,手机可能就会打开一个网页让你去玩“老婆不在家玩的游戏”。

图片 3

这篇博客的目的就是将这些广告从app中去掉,过程中需要涉及到apk的反编译。

Android 中,内置应用如何更好的截屏

图片 4

2 工具准备

为了能够去掉这些广告,我使用到了这些工具:

  • apktool
  • apktoolBox

其中,apktool用来将apk文件进行反编译,便于接下来去修改代码。而apktoolBox则是一款集成了各种Android反编译工具的合集,它包含了apktool的功能,除此之外,还能用来查看apk中代码、给apk签名等等。

最后我们再准备一款有广告的应用,这里我用的是一款文件管理应用:
RE文件浏览器

注意:apk下载后,将其改名(名字不要带中文),然后将其放到一个不带中文的路径下,这样做是为了避免后期的工作失败。

在开发系统应用的时候,有时候需要用到截屏,因为 View.getDrawingCache() 截不到状态栏,所以这个方案不理想
这有一个更好的方案,就是用 SurfaceControl.screenshot() / Surface.screenshot() 截屏,在 API Level 大于 17 使用 SurfaceControl ,小于等于 17 使用 Surface ,但是这个方案有诸多限制,比如
1、需要反射调用,低版本中,Surface.screenshot() 函数是 hide 的,高版本中,SurfaceControl 类是 hide 的
2、调用 screenshot() 函数需要权限

Online Game Advertising from gamasutra.com

3 开始反编译

打开apktoolBox,进行反编译。

图片 5

反编译

生成了一堆文件后,来到反编译出来的目录,打开AndroidManifest.xml,找到跟广告相关的代码。如下图:

图片 6

广告SDK相关配置

广告单词缩写为ad,将百度相关的广告的value改成0,然后再用apktoolbox进行回编译(重新打包生成apk)。运行新打包的apk,可以发现广告里面的内容已经不见了。但是一个空白的广告条还是在底部占着位置。

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

应用内部购买机制&广告

4 去掉广告条占位

先看看这个广告条所在的页面的布局情况,这里采用hierarchyViewer查看手机上当前页面的布局(hierarchyViewer程序位于Android SDK目录中tools文件夹里)。

图片 7

准备查看手机当前页面布局

通过它可以查看到对应的布局,定位到页面底部广告,发现控件层次如下:

图片 8

页面底部布局广告

在底部的空白广告条是一个类型叫AdView的控件,我们如果需要去掉它,得知道关于AdView控件是在layout资源文件中加上去的,还是在java代码中加上去的。
这里通过notepad++工具在res资源文件夹中搜索了一番,并没有找到,说明AdView控件是在java代码里添加的。

图片 9

在res文件夹中查找AdView

在java代码中,apk作者在页面中调用一些方法将控件添加到了页面上并做了初始化等一系列操作。
要修改该控件的添加效果,有两种方案:

  • 在添加控件、初始化控件的那一系列操作上做手脚。
  • 直接从源头上入手,找到AdView这个自定义控件的代码,并从中做修改。

这里我采用的是第二种方案,通过apktoolbox里集成的jadx工具,通过它打开apk文件可以查看里面的java代码。如下:

图片 10

通过jadx查看apk代码

虽然代码有被混淆过,但是通过观察,还是可以看到一些蛛丝马迹的,其中有两个地方比较有意思,一个是构造函数中的addView(),这个是往里面添加一个子控件。

public AdView(Context context, AttributeSet attributeSet, boolean z, AdSize adSize, String str) {
    super(context, attributeSet);
    this.b = new AtomicBoolean(false);
    this.a = new a(this);
    View adVar = new ad(context);
    this.c = new a(context, adVar, str, z);
    this.c.addEventListener(IXAdEvent.AD_LOADED, this.a);
    this.c.addEventListener(IXAdEvent.AD_ERROR, this.a);
    this.c.addEventListener(IXAdEvent.AD_STARTED, this.a);
    this.c.addEventListener("AdUserClick", this.a);
    adVar.a(new b(this));
    addView(adVar, new LayoutParams(-1, -1));
}

还有一个地方是这个AdView控件复写了setLayoutParams方法。该方法是这样写的:

public void setLayoutParams(LayoutParams layoutParams) {
    l.a().f().d("AdView.setLayoutParams=", Integer.valueOf(layoutParams.width), Integer.valueOf(layoutParams.height), Integer.valueOf(getWidth()), Integer.valueOf(getHeight()));
    int i = layoutParams.width;
    int i2 = layoutParams.height;
    DisplayMetrics displayMetrics = new DisplayMetrics();
    ((WindowManager) getContext().getSystemService("window")).getDefaultDisplay().getMetrics(displayMetrics);
    int i3 = displayMetrics.widthPixels;
    int i4 = displayMetrics.heightPixels;
    float f = displayMetrics.density;
    l.a().f().d("AdView.setLayoutParams", Integer.valueOf(i3), Integer.valueOf(i4), Float.valueOf(f));
    if (i <= 0) {
        i = Math.min(i3, i4);
    } else if (i > 0 && ((float) i) < 200.0f * f) {
        i = (int) (200.0f * f);
    }
    int min = i2 <= 0 ? (int) (((float) Math.min(i3, i4)) * 0.15f) : (i2 <= 0 || ((float) i2) >= 30.0f * f) ? i2 : (int) (30.0f * f);
    layoutParams.width = i;
    layoutParams.height = min;
    l.a().f().d("AdView.setLayoutParams adapter", Integer.valueOf(layoutParams.width), Integer.valueOf(layoutParams.height));
    super.setLayoutParams(layoutParams);
}

大概读一遍,可以发现在这个方法里,去根据一些手机的分辨率情况去设置当前AdView的width和height,我们就修改这里的代码,将width或height设置为0,再来重打包观察效果如何。
要修改代码需要去反编译出来的smail目录中,找到该AdView对应包下的smail文件进行修改。
smail文件格式不友好,但是跟java代码相比,还是有迹可循的。这里通过一些特殊字眼(一些字符串常量都会被予以保留),比如我搜索“setLayoutParams”,就可以定位到setLayoutParams方法的定义处。
定位到这个setLayoutParams方法,里面有很多const申明,比如该方法里第一句日志中的“AdView.setLayoutParams=”字符串,就会被这样申明:

const-string v2, "AdView.setLayoutParams="

这是字符串,如果是数字int,那么就是:

const/4 v11, 0x3
const/4 v10, 0x2
const/4 v9, 0x1
const/4 v8, 0x0

v11、v10、v9这些代表常量名,后面的0x3、0x2这些代表常量值。
前提交代完毕后,接下来开始修改,我改的是setLayoutParams方法中这一句代码:

layoutParams.width = i;
layoutParams.height = min;

将其修改不再为i,改为0。这几句代码在smail中就是这一句:

.line 156
iget v2, p1, Landroid/view/ViewGroup$LayoutParams;->width:I
.line 157
iget v1, p1, Landroid/view/ViewGroup$LayoutParams;->height:I

这几句,其实就是v2赋值给layoutParams.width,v1赋值给layoutParams.height。我这里将v8赋值给width和height,因为v8的值为0x0

iput v8, p1, Landroid/view/ViewGroup$LayoutParams;->width:I
.line 179
iput v8, p1, Landroid/view/ViewGroup$LayoutParams;->height:I

这里不建议大家自己去创建一个const,可能会导致编译不通过,或者会运行重打包apk时报错。
另外,如果smail代码修改的有误,使用apktoolbox是没有提示的,如果一直无法重打包apk,那么建议使用apktool工具来打包,它会及时的告诉你smail文件的报错位置。

最后使用工具进行重打包回编译apk,并签名。安装以后,可以发现底部的广告条已经不见啦。

图片 11

页面底部广告条被去掉

如果对新生成的apk用jadx打开观察java代码的话,可以发现width和height已经被设置为0.

3、上面需要的权限,只对应用签名与 platform 签名一致的应用起作用
所以,非系统应用是不能用的,即使调用了也会返回 null ,这个是一个对于系统应用非常合适的截图方案,具体代码如下

我们非常推崇免费增值模式设计,因此可以想象看到多数独立Android游戏开发者的谋生方式我们颇为惊讶:广告!

原文链接:http://mumuxuan.github.io/2016/08/04/deleteAd/

public Bitmap screenshot() {
    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    // 这里只是把两个类的写法写在一起
    // 在系统中,系统版本是确定的,所以选其中一个
    if (Build.VERSION.SDK_INT <= 17) {
        return Surface.screenshot(metrics.widthPixels, metrics.heightPixels);
    } else {
        return SurfaceControl.screenshot(metrics.widthPixels, metrics.heightPixels);
    }
}

事实上,落实成熟的免费增值游戏设计相当复杂。你无法事后添加免费增值创收模式:你需要彻底基于免费增值创收模式制作你的游戏,融入适当的限制性诱人虚拟交易机制。当面临此艰巨设计挑战时,多数开发者选择内置游戏广告。即便是他们植入虚拟交易机制,这通常也带来不到5%的收益。

当然还需要在 AndroidManifest.xml 中加入上面说的权限,否则截屏会失败的
注意,我这里为什么没有用反射,因为,标题里说了,是 Android 内置应用,就是跟随系统一起编译的,所以是可以直接调用隐藏 api 的,用这个方案截的图是包含状态栏的

但用户不会讨厌在他们的游戏中看到的广告吗?是的,他们的确心生厌恶。但令人惊讶的是,极少玩家愿意付费摆脱这些内容:我们发现,只有不到1%的收益来自付费,以及无广告的免费应用。这说明,虽然用户不喜欢广告,但他们更不喜欢在应用中掏钱。

利用各种广告供应商

关于最大化广告收益,一个主要建议是,综合利用大小规模的广告供应商。小型广告供应商的供给比率相对较低,但会就你所展示的广告支付丰厚酬劳。大型广告供应商eCPM明显较低。一个常见策略是,和1-2家小型广告供应商合作,填充尽可能多的位置,然后让大型广告供应商填补剩余位置。这点也非常重要,因为来自各供应商的收益每月会出现较大波幅,因此同各种广告供应商合作能够让你一定程度上免受这些变化的影响。

出于好玩,我们整理出各热门Android广告供应商的平均eCPM和填充率。这些数据不是什么真理,但希望能够发挥一定作用:

* AdMob—eCPM 1美元

* InMobi—eCPM 1美元

* Millennial Media—eCPM 1.25美元

* Madvertise—eCPM 6美元

* Leadbolt—eCPM 3.5美元

* revmob—eCPM 6.5美元

* Mobfox—eCPM 6美元

 

 

 

图片 12

app store icons from gamasutra.com

利用App Store优化

 

 

 

虽然我们过去曾写过关于此话题的文章,但这一建议同此密切相关:Android Market的曝光关键是搜索。若你没有优化自己的应用商店图标、清单和描述,那么你就会同用户和收益失之交臂。简单来说,App Store Optimization(游戏邦注:简称ASO)和SEO类似:你需要确定你希望同应用建立联系的关键字,然后根据这些关键字优化你的清单和描述。自文章发布以来,市面上已出现若干重要工具,能够帮你完成应用商店的优化工作,包括AppAnnie和MobileDevHQ。

优化你的广告位置

优化广告位置是项棘手的任务。你需要谋生,因此你得赚钱,但你还希望这不会破坏玩家的体验。受Zack Hiwiller和Johannes Borchardt的启发,我们将向你展示若干潜在优化方式,你可以判定哪种方式适合自己。

选择1:基于曝光度进行优化

在这一方式中,你将广告置于玩家最可能看到的位置,但不要置于玩法的“导火线”位置。这里的目标是,最大化用户看到广告的可能性,且会对广告产生兴趣,然后点击广告。这带来较高质量的点击率。

 

 

 

图片 13

best ad visibility from gamasutra.com

选择2:根据点击量进行优化

在此方式中,你将广告置于玩家最可能进行点击的位置,无论是出于偶然,还是因为广告置于玩法的页面焦点位置。这里的目标是,最大化用户点击广告的可能性。这带来最多的点击率,但可能致使用户心生不满。此外,如果植入方式过于具有侵入性,广告商也会心生不安。

图片 14

best click rate from gamasutra.com

选择3:基于玩法进行优化

在此方式中,你将广告置于非玩法页面,例如菜单、库存画面等。这里的目标是保留玩法的完整性,以维持用户体验。这一方式带来最少点击量,但最不会让用户心生不满。

当基于玩法进行优化时,很多开发者会选择插播广告。这些广告能够巧妙填充于玩法版块之间(游戏邦注:如异步游戏的回合之间或益智游戏的关卡之间)。相比旗帜广告,这些广告通常创造较高收益,不会像旗帜广告那样破坏游戏的沉浸性。

制作不同类型的应用

这也许是最显而易见的建议,但具备多种应用组合的开发者总是能够比着眼于单个项目的开发者表现更突出。除众所周知的不要孤注一掷道理外,这一方式还有许多优点。通过针对不同用户制作不游戏和应用,你将扩大自己的整体目标用户。同时,你还会涉猎不同细分市场,相比应用或游戏当前的目标细分市场,这里竞争相对不那么激烈。某款游戏或应用创造多数收益及广告印象的情况司空见惯。你不知道这会什么应用,直到你将其制作出来,但拥有一款杰出应用能够让你通过交叉推广推动整个生态系统。

通过内部广告交叉推广你的其他游戏

Admob和Android平台的其他服务能够让你利用自己的广告空间交叉推广应用。这对于壮大你的生态系统来说作用显著,因为你可以将收益和广告印象翻一番。此外,你可以通过将既有用户同适当应用进行搭配,最大化他们的粘性程度。也许最重要的是,这带来众多免费营销机会,能够让你推广自己的下个项目及深入扩大既有生态系统。

 

 

 

图片 15

app ecosystem from gamasutra.com

总结:创建生态系统

 

 

 

要结合上述建议,开发者需将他们的整个用户基础看作是单个生态系统。像Reddit或ICanHazCheezburger那样,迎合各种偏好的手机应用能够可以围绕核心品牌互相借鉴。即便他们遍地撒网,这些网站依然是典型范例,因为他们依然能够将目标用户缩减至若干关键群体。要弄清这点内容,不妨想想为什么用户使用你的应用,或者他们如何从中收获价值。用户是否喜欢你极其简单的应用?他们也许欣赏极其简单的任务清单。思考什么类型的玩家使用你们最受欢迎的应用,以此挖掘开发新应用的机会。也许喜欢你简单应用的玩家会体验靠数据推动的棒球模拟游戏?你只有进行尝试才会知道,但通过将你各应用的用户基础看作是单个生态系统,你可以判断自己能够引起哪些用户的共鸣,然后继续发展壮大。随着你生态系统的发展,下载量、广告印象和收益也将陆续跟上。

via:游戏邦/gamerboom.com

更多阅读:

  • Ampulum:关注Android和iOS应用的有效曝光渠道
  • Millennial Media:2011年6月移动市场调查报告 Android占54%
  • Millennial Media:2011年Android占到操作系统广告印象份额47%
  • Veliti:苹果凭借iPhone5重新抢回5%的广告展示份额
  • Trademob:iOS和Android两个移动平台数据对比
  • InMobi:iOS和Android领跑移动广告展示量
  • Jumptap:2012年1月Android和iOS占美国移动广告网络91%流量
  • Nanigans:数据显示Android广告投资回报为负
  • MarketingCharts:尽管Android发展迅速,在移动广告领域,iOS仍然保持王者地位
  • 有米传媒:2011年下半年移动广告数据报告
  • Millennial Media:2012年Q3苹果移动网络上占广告印象份额为31% 三星所占份额为接近25%
  • Mike Thompson:论述获得Google Play推荐的若干注意事项
  • MediaPost:视频广告首次占到移动广告的10%
  • Fiksu:2014年5月移动应用成本指数 iOS平台CPI增长56%
  • 广告服务平台Pontiflex:获得770万美元新投资

编辑:益智类 本文来源:Android应用去广告,内置应用截屏方法

关键词: