diff options
| -rw-r--r-- | docs/html/distribute/engage/analytics.jd | 50 | ||||
| -rw-r--r-- | docs/html/distribute/engage/deep-linking.jd | 35 | ||||
| -rw-r--r-- | docs/html/distribute/engage/engage_toc.cs | 6 | ||||
| -rw-r--r-- | docs/html/distribute/engage/index.jd | 4 | ||||
| -rw-r--r-- | docs/html/distribute/engage/widgets.jd | 2 | ||||
| -rw-r--r-- | docs/html/distribute/monetize/ads.jd | 101 | ||||
| -rw-r--r-- | docs/html/distribute/users/index.jd | 4 | ||||
| -rw-r--r-- | docs/html/distribute/users/promote-with-ads.jd | 45 | ||||
| -rw-r--r-- | docs/html/distribute/users/users_toc.cs | 7 | ||||
| -rw-r--r-- | docs/html/guide/guide_toc.cs | 6 | ||||
| -rw-r--r-- | docs/html/guide/practices/verifying-apps-art.jd | 296 | ||||
| -rw-r--r-- | docs/html/images/gp-ads-console.jpg | bin | 0 -> 34526 bytes | |||
| -rw-r--r-- | docs/html/images/gp-ads-linking2.jpg | bin | 0 -> 30046 bytes | |||
| -rw-r--r-- | docs/html/images/gp-analytics.jpg | bin | 0 -> 36914 bytes | |||
| -rw-r--r-- | docs/html/jd_collections.js | 19 | ||||
| -rw-r--r-- | docs/html/jd_extras.js | 28 |
16 files changed, 551 insertions, 52 deletions
diff --git a/docs/html/distribute/engage/analytics.jd b/docs/html/distribute/engage/analytics.jd new file mode 100644 index 000000000000..5f7cade1dbb9 --- /dev/null +++ b/docs/html/distribute/engage/analytics.jd @@ -0,0 +1,50 @@ +page.title=Understand User Behavior +page.metaDescription=Use Google Analytics to learn what your users like and what keeps them coming back. +page.tags="analytics, user behavior" +page.image=/images/gp-analytics.jpg + +@jd:body + +<div class="figure"> + <img src="{@docRoot}images/gp-analytics.jpg" style="width:320px"> +</div> + + +<p> + Link your Google Play Developer Console with Google Analytics to learn much + more about how users interact with your app — before and after they + download it. +</p> + +<p> + Start by discovering how many people visit your Google Play listing page, + where they come from, and how many go on to install your app. Once the app is + launched, use Google Analytics to see which of your features are most + popular, where power users spend their time, who tends to make in-app + purchases, and more. +</p> + +<p> + Google Analytics delivers the numbers in real time, so you can act fast to + update your landing page and your app. <a href= + "http://www.google.com/analytics/mobile/">Learn more</a>. +</p> + +<p> + If you have a Google Analytics account already, linking it to Google Play + takes just a few moments. You can also link your Google Analytics account to + Admob to start gaining more user insights to improve your in-app marketing. +</p> + + <div class="headerLine clearfloat"> + <h2 id="related-resources"> + Related Resources + </h2> +</div> + +<div class="resource-widget resource-flow-layout col-13" + data-query="collection:distribute/engage/analytics" + data-sortorder="-timestamp" + data-cardsizes="9x3" + data-maxresults="6"> +</div>
\ No newline at end of file diff --git a/docs/html/distribute/engage/deep-linking.jd b/docs/html/distribute/engage/deep-linking.jd index 0417ba156f21..a25c3c6f8a72 100644 --- a/docs/html/distribute/engage/deep-linking.jd +++ b/docs/html/distribute/engage/deep-linking.jd @@ -1,13 +1,13 @@ page.title=Deep Link to Bring Users Back -page.metaDescription=Use deep links to bring your users into your apps from social posts or search. +page.metaDescription=Use deep links to bring your users into your apps from social posts, search, or ads. page.tags="app indexing, google+ signin" page.image=/images/gp-listing-4.jpg @jd:body <p> - Use deep links to bring your users into your apps from social posts or - search. + Use deep links to bring your users into your apps from social posts, + search, or ads. </p> <div class="headerLine"> @@ -47,6 +47,11 @@ page.image=/images/gp-listing-4.jpg <h2>Deep Linking from Google Search — App Indexing</h2> </div> + +<div style="float:right;"> + <img src="/images/gp-listing-4.jpg" style="padding-top:1em;padding-left:2em;"> +</div> + <p> Another way to bring users back to your apps is to apply for app indexing. </p> @@ -60,11 +65,29 @@ page.image=/images/gp-listing-4.jpg content</a>. </p> -<div> - <img src="{@docRoot}images/gp-listing-4.jpg" style="padding-top:1em;"> +<div class="clearfloat" style="margin-top:2em;"></div> + +<div style="float:right;width:340px;padding-left:2em;"> + <img src="/images/gp-ads-linking2.jpg" style="padding-top:1em;"> </div> -<div class="headerLine"> +<div class="headerLine "> +<h2>Deep Linking from Google Ads</h2> +</div> +<p> + Ads can remind users about the apps they already have. +</p> + +<p> + As with deep links from Google's organic search results, AdWords deep links + send users directly to the relevant pages in apps they already have on their + mobile device. A mobile search for "flights to London," for instance, could + take a user straight to the London page in a travel app. <a href= + "http://www.thinkwithgoogle.com/products/ads-apps.html" + class="external-link">Learn more</a>. +</p> + +<div class="headerLine clearfloat"> <h2 id="related-resources"> Related Resources </h2> diff --git a/docs/html/distribute/engage/engage_toc.cs b/docs/html/distribute/engage/engage_toc.cs index 0314f8c181e2..596051a4c198 100644 --- a/docs/html/distribute/engage/engage_toc.cs +++ b/docs/html/distribute/engage/engage_toc.cs @@ -37,6 +37,12 @@ </li> <li class="nav-section"> <div class="nav-section empty" style="font-weight:normal"><a href="<?cs + var:toroot?>distribute/engage/analytics.html"> + <span class="en">Understand User Behavior</span></a> + </div> + </li> + <li class="nav-section"> + <div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/engage/app-updates.html"> <span class="en">Update Regularly</span></a> </div> diff --git a/docs/html/distribute/engage/index.jd b/docs/html/distribute/engage/index.jd index f8cd1eeaaef5..2b103c3c637f 100644 --- a/docs/html/distribute/engage/index.jd +++ b/docs/html/distribute/engage/index.jd @@ -15,8 +15,8 @@ nonavpage=true <div class="resource-widget resource-flow-layout landing col-16" data-query="collection:distribute/engagelanding" - data-cardSizes="6x6" - data-maxResults="9"> + data-cardSizes="9x6,9x6,6x6,6x6,6x6,9x6,9x6,6x6,6x6,6x6" + data-maxResults="10"> </div> <h3>Related Resources</h3> diff --git a/docs/html/distribute/engage/widgets.jd b/docs/html/distribute/engage/widgets.jd index 286adea0497e..6adb55cb7f5b 100644 --- a/docs/html/distribute/engage/widgets.jd +++ b/docs/html/distribute/engage/widgets.jd @@ -1,5 +1,5 @@ page.title=Build Useful Widgets -page.metaDescription=Use widgets to remind users about important information in your apps and games, even when your apps are closed. +page.metaDescription=Use home screen widgets to remind users about important information in your apps and games, even when your apps are closed. page.tags="" page.image=/images/gp-engage-0.jpg diff --git a/docs/html/distribute/monetize/ads.jd b/docs/html/distribute/monetize/ads.jd index bcb1e5288b7b..9a847ff55727 100644 --- a/docs/html/distribute/monetize/ads.jd +++ b/docs/html/distribute/monetize/ads.jd @@ -10,17 +10,32 @@ page.image=/distribute/images/advertising.png </div> <p> - In-app advertising offers a quick and easy way to incorporate a monetization - option into both your <a href= + Ads can be a quick and easy way to earn more from your <a href= "{@docRoot}distribute/monetize/freemium.html">freemium</a>, <a href= "{@docRoot}distribute/monetize/premium.html">premium</a>, and <a href= - "{@docRoot}distribute/monetize/subscriptions.html">subscription</a> apps. </p> + "{@docRoot}distribute/monetize/subscriptions.html">subscription</a> apps. + AdMob and the Google Mobile Ads SDK let you add advertising to your apps with + just a few lines of code. +</p> + +<p> + The question is: which model gets the best results for your app? Google's ad + tools are made to help you figure out what combination works best for both + your audience and your bottom line. </p> -<p>Using <a href= +<p>Start by linking your AdMob and Google + Analytics accounts to get better insights and more earning power: for + instance, AdMob can promote in-app purchases to the people who buy them most + often, while showing income-generating ads to those less likely to buy right + now. +</p> + +<p> + Using <a href= "http://www.google.com/ads/admob/monetize.html#subid=us-en-et-dac">AdMob</a> - and the <a href="{@docRoot}google/play-services/ads.html">Google - Mobile Ads SDK</a> included in Google Play Services, you’re able to add - advertising into your apps, with just a few lines of code. + and the <a href="{@docRoot}google/play-services/ads.html">Google Mobile Ads + SDK</a> included in Google Play Services, you’re able to add advertising into + your apps, with just a few lines of code. </p> <p> @@ -30,36 +45,33 @@ page.image=/distribute/images/advertising.png <ul> <li> <p> - <strong>Placement within your apps</strong> — Well placed ads will - optimize your revenue by making it more likely that users will ‘click - through’. Poorly placed ads can result in low click-through rates, and in - the worse cases poor rating and users rapidly abandoning your apps. You - can get advice on how to best place ads from the developer training on - <a href= - "{@docRoot}training/monetization/ads-and-ux.html">using - ads</a>. + <strong>Placement within your apps</strong> — Well-placed ads make + it more likely that users will click through and convert. Poorly-placed + ads lead to lower click-through rates, and even poor ratings and users + abandoning your apps. Our <a href= + "{@docRoot}training/monetization/ads-and-ux.html">developer training</a> + on using ads shows some of the best ways to place ads. </p> </li> <li> <p> <strong>Ad formats</strong> — Every app offers a different type of - experience for users, so it’s important to consider the format of ads - you’re using to ensure it’s compatible with the experience. While banner - ads may work well for a flashlight utility app, an immersive gaming app - may benefit more from a video interstitial. Mismatched ad formats may - negatively affect your users’ experience and ad revenue, so try to select - formats that fit well with the content and flow of your apps. + experience for users, so it’s important that your ad formats match that + experience. While banner ads may work well for a flashlight utility app, + an immersive gaming app may benefit more from a video interstitial. + Mismatched ad formats can make users unhappy and leave money on the + table. </p> </li> <li> <p> - <strong>Maximizing your performance</strong> — Ensure you’re optimizing - your advertising revenue by maximizing your CPMs <em>and</em> fill rate. - Often ad providers will cite very high CPMs but will have a low fill rate - that can severely decrease your effective CPM, so look at both of these - figures. Also consider using a <a href= + <strong>Maximizing your performance</strong> — Make sure you’re + optimizing your advertising revenue by maximizing your CPMs and fill + rate. Ad providers often cite their very high CPMs but don't mention low + fill rates that can severely decrease your effective CPM. Be sure to look + at both of these figures. Consider using a <a href= "https://support.google.com/admob/v2/answer/3063564?hl=en&ref_topic=3063091#subid=us-en-et-dac"> mediation</a> solution if you’d like to use multiple ad providers in your apps. Look for solutions that offer yield management or <a href= @@ -71,30 +83,43 @@ page.image=/distribute/images/advertising.png <li> <p> - <strong>Exercising control options</strong> — A variety of ads promoting a - broad selection of other services or apps may show up within you apps. - Depending on your goals and the type of experience you want to provide - your users, it may make sense to <a href= + <strong>Exercising control options</strong> — A variety of ads may + show up within your app. It may make sense to <a href= "https://support.google.com/admob/v2/answer/3150235?hl=enl#subid=us-en-et-dac"> - block</a> certain advertisements from appearing. Some developers don’t - want apps in a similar category showing to their users, but some don’t - mind. + block</a> certain of those advertisements from appearing, depending on + your goals and the type of experience you want to provide. Some + developers, for instance, don’t want ads for apps in their same category + showing to their users, while others don’t mind at all. </p> </li> <li> <p> - <strong>Cross promoting your other apps</strong> — Ads can be used for - more than just earning revenue. Consider using <a href= + <strong>Cross promoting your other apps</strong> — Ads can do more + than earn revenue. Consider running <a href= "https://support.google.com/admob/v2/answer/3210452?hl=en#subid=us-en-et-dac"> - house ads</a> within your apps to create awareness and promote your - entire portfolio of apps. When launching new apps, an easy way to quickly - attract users is to promote directly to your existing customers. + house ads</a> within your apps to promote other apps in your portfolio. + When you launch a new app, this kind of promotion is a free and easy way + to attract new users quickly. </p> </li> </ul> <p> + Don't forget that paid channels like AdWords and YouTube can help you cast a + wider net by reaching targeted audiences outside the app ecosystem. They're a + great way to find new users at a price that you control. <a href= + "https://support.google.com/adwords/answer/2549053">Learn more</a>. +</p> + +<p> + To start monetizing with ads, sign up for AdMob and integrate the Google + Mobile Ads SDK into your apps. If you also need to manage direct deals with + advertisers, consider using DoubleClick for Publishers Small Business. +</p> + + +<p> To start monetizing with ads sign up for <a href= "http://www.google.com/ads/admob/#subid=us-en-et-dac">AdMob</a> and integrate the <a href="https://developers.google.com/mobile-ads-sdk/download">Google diff --git a/docs/html/distribute/users/index.jd b/docs/html/distribute/users/index.jd index 77ef609e588f..a810f3675cf3 100644 --- a/docs/html/distribute/users/index.jd +++ b/docs/html/distribute/users/index.jd @@ -14,8 +14,8 @@ nonavpage=true <div class="resource-widget resource-flow-layout landing col-16" data-query="collection:distribute/users" - data-cardSizes="6x6, 6x6, 6x6, 9x6, 9x6, 6x6, 6x6, 6x6" - data-maxResults="8"> + data-cardSizes="6x6" + data-maxResults="6"> </div> <h3>Related resources</h3> diff --git a/docs/html/distribute/users/promote-with-ads.jd b/docs/html/distribute/users/promote-with-ads.jd new file mode 100644 index 000000000000..1e28ae1ddf8f --- /dev/null +++ b/docs/html/distribute/users/promote-with-ads.jd @@ -0,0 +1,45 @@ +page.title=Promote Your App with Ads +page.metaDescription=Promote your app through AdMob, AdWords, and YouTube to find new users at the right moment. +page.image=/images/gp-ads-console.jpg +page.tags="users, ads, analytics" + +@jd:body + +<p> + AdMob is Google's advertising platform for mobile apps. You can use it to + monetize your app and promote your apps, and you can link your Google + Analytics account to AdMob so you can analyze your apps — all in one + place. +</p> + +<p> + <a href="http://www.google.com/ads/admob/">AdMob</a> is the largest mobile ad + app network. But you get more than just massive scale: AdMob will soon help + you find the right users in related apps. If your app is for bicycling, AdMob + can promote your app on other fitness and cycling-related apps worldwide. + <a href= + "https://apps.admob.com/admob/signup?subid=us-en-et-dac&_adc=ww-ww-et-admob2&hl=en"> + Sign up for AdMob</a>. +</p> + +<p> + AdMob also offers new solutions to help you achieve app-related goals such as + downloads, re-engagement and in-app purchases using Google search and the + Google Display Network. These solutions include streamlined campaign creation + flows and tools to track performance across the entire app lifecycle. + <a href="https://support.google.com/adwords/answer/2549053?hl=en">Learn + More</a>. +</p> +<div style="margin-top:2em;"> + <img src="{@docRoot}images/gp-ads-console.jpg"> +</div> + +<div class="headerLine"> +<h2 id="related-resources">Related Resources</h2> +</div> + +<div class="resource-widget resource-flow-layout col-13" + data-query="collection:distribute/users/promotewithads" + data-sortOrder="-timestamp" + data-cardSizes="9x3" + data-maxResults="6"></div>
\ No newline at end of file diff --git a/docs/html/distribute/users/users_toc.cs b/docs/html/distribute/users/users_toc.cs index a2437a6be839..1f173cb2579a 100644 --- a/docs/html/distribute/users/users_toc.cs +++ b/docs/html/distribute/users/users_toc.cs @@ -28,7 +28,12 @@ </a> </div> </li> - + <li class="nav-section"> + <div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/users/promote-with-ads.html"> + <span class="en">Promote with Ads</span> + </a> + </div> + </li> </ul> diff --git a/docs/html/guide/guide_toc.cs b/docs/html/guide/guide_toc.cs index 6302c92607d3..ea36405d7788 100644 --- a/docs/html/guide/guide_toc.cs +++ b/docs/html/guide/guide_toc.cs @@ -567,7 +567,11 @@ <li><a href="<?cs var:toroot ?>guide/practices/tablets-and-handsets.html"> <span class="en">Supporting Tablets and Handsets</span> </a></li> - + <li> + <a href="<?cs var:toroot ?>guide/practices/verifying-apps-art.html"> + <span class="en">Verifying App Behavior on ART</span> + </a> + </li> </ul> </li> diff --git a/docs/html/guide/practices/verifying-apps-art.jd b/docs/html/guide/practices/verifying-apps-art.jd new file mode 100644 index 000000000000..0eedfafbbd93 --- /dev/null +++ b/docs/html/guide/practices/verifying-apps-art.jd @@ -0,0 +1,296 @@ +page.title=Verifying App Behavior on the Android Runtime (ART) +@jd:body + +<div id="qv-wrapper"> +<div id="qv"> +<h2>Quickview</h2> + <ul> + <li>The new Android runtime (ART) is available on some of the newest Android + devices, though all of them currently have Dalvik as the default + runtime.</li> + <li>App developers should make sure their apps are compatible with ART, + especially if you use JNI to run native code or if you use certain tools + that produce non-standard code (such as some obfuscators).</li> + </ul> + + <h2 id="Contents">In this document</h2> + <ol> + <li><a href="#GC_Migration">Addressing Garbage Collection (GC) Issues</a></li> + <li><a href="#JNI_Issues">Preventing JNI Issues</a> + <ol> + <li><a href="#JNI_and_GC">Checking JNI code for garbage-collection + issues</a></li> + <li><a href="#Error_Handling">Error handling</a></li> + <li><a href="#Object_Model_Changes">Object model changes</a></li> + </ol> + </li> + <li><a href="#Stack_Size">Preventing Stack Size Issues</a></li> + <li><a href="#AOT_Fails">Fixing AOT Compilation Issues</a></li> + <li><a href="#Reporting_Problems">Reporting Problems</a></li> + </ol> + <h2>See also</h2> + <ol> + <li><a href="http://source.android.com/devices/tech/dalvik/art.html">Introducing ART</a></li> + <li><a +href="http://android-developers.blogspot.com/2011/07/debugging-android-jni-with-checkjni.html">Debugging +Android JNI with CheckJNI</a></li> + </ol> +</div> +</div> + +<p>With Android 4.4, we are beginning to roll out a new Android runtime, +<strong>ART</strong>. This runtime offers a number of new features that improve +performance and smoothness of the Android platform and apps. (You can find more +information about ART's new features in <a +href="http://source.android.com/devices/tech/dalvik/art.html">Introducing +ART</a>.)</p> + +<p>Currently, ART is available on a number of Android 4.4 devices, such as the +Nexus 4, Nexus 5, Nexus 7, and Google Play edition devices. +At this time, all devices still use Dalvik as the default runtime. We encourage +you to test your apps for ART compatibility and to take advantage of ART's new +features. However, for the time being, you should also take care to maintain +compatibility with Dalvik.</p> + +<p>This document lets you know about things to watch for when migrating an +existing app to be compatible with ART. Most apps should just work when +running with ART. However, some techniques that work on Dalvik do not work on +ART. This document discusses some of these issues.</p> + +<h2 id="GC_Migration">Addressing Garbage Collection (GC) Issues</h2> + +<p>Under Dalvik, apps frequently find it useful to explicitly call {@link +java.lang.System#gc() System.gc()} to prompt garbage collection (GC). This should be +far less necessary with ART, particularly if you're invoking garbage collection +to prevent <a +href="{@docRoot}/tools/debugging/debugging-memory.html#LogMessages"><code>GC_FOR_ALLOC</code></a>-type +occurrences or to reduce fragmentation. You can verify which runtime is in use +by calling {@link java.lang.System#getProperty(java.lang.String) +System.getProperty("dalvik.vm.version")}. If ART is in use, the property's value +is <code>"2.0.0"</code> or higher.</p> + +<p>Furthermore, a compacting garbage collector is under development in the <a +href="https://source.android.com">Android Open-Source Project (AOSP)</a> to +improve memory management. Because of this, you should avoid using techniques +that are incompatible with compacting GC (such as saving pointers to object +instance data). This is particularly important for apps that make use of the +Java Native Interface (JNI). For more information, see <a +href="#JNI_Issues">Preventing JNI Issues</a>.</p> + +<h2 id="JNI_Issues">Preventing JNI Issues</h2> + +<p>ART's JNI is somewhat stricter than Dalvik's. It is an especially good idea +to use CheckJNI mode to catch common problems. If your app makes use of C/C++ +code, you should review the following article:</p> + +<p><a +href="http://android-developers.blogspot.com/2011/07/debugging-android-jni-with-checkjni.html">Debugging +Android JNI with CheckJNI</a></p> + +<h3 id="JNI_and_GC">Checking JNI code for garbage-collection issues</h3> + +<p>ART has a compacting garbage collector under development on the +Android Open Source Project (AOSP). Once the compacting garbage collector is in +use, objects may be moved in memory. If you use C/C++ code, do not +perform operations that are incompatible with compacting GC. We have enhanced +CheckJNI to identify some potential issues (as described in <a +href="http://android-developers.blogspot.com/2011/11/jni-local-reference-changes-in-ics.html">JNI +Local Reference Changes in ICS</a>).</p> + +<p>One area to watch for in particular is the use of +<code>Get...ArrayElements()</code> and <code>Release...ArrayElements()</code> +functions. In runtimes with non-compacting GC, the +<code>Get...ArrayElements()</code> functions typically return a reference to the +actual memory backing the array object. If you make a change to one of the +returned array elements, the array object is itself changed (and the arguments +to <code>Release...ArrayElements()</code> are usually ignored). However, if +compacting GC is in use, the <code>Get...ArrayElements()</code> functions may +return a copy of the memory. If you misuse the reference when compacting GC is +in use, this can lead to memory corruption or other problems. For example:</p> + +<ul> + + <li>If you make any changes to the returned array elements, you must call the + appropriate <code>Release...ArrayElements()</code> function when you are done, + to make sure the changes you made are correctly copied back to the underlying + array object.</li> + + <li>When you release the memory array elements, you must use the appropriate + mode, depending on what changes you made: + + <ul> + + <li>If you did not make any changes to the array elements, use + <code>JNI_ABORT</code> mode, which releases the memory without copying + changes back to the underlying array object.</li> + + <li>If you made changes to the array, and do not need the reference any + more, use code <code>0</code> (which updates the array object and frees + the copy of the memory).</li> + + <li>If you made changes to the array that you want to commit, and you want + to keep the copy of the array, use <code>JNI_COMMIT</code> (which updates + the underlying array object and retains the copy).</li> + + </ul> + + </li> + + <li>When you call <code>Release...ArrayElements()</code>, return the same + pointer that was originally returned by <code>Get...ArrayElements()</code>. For + example, it's not safe to increment the original pointer (to scan through the + returned array elements) then pass the incremented pointer to + <code>Release...ArrayElements()</code>. Passing this modified pointer can cause + the wrong memory to be freed, resulting in memory corruption.</li> + +</ul> + +<h3 id="Error_Handling">Error handling</h3> + +<p>ART's JNI throws errors in a number of cases where Dalvik didn’t. (Once +again, you can catch many such cases by testing with CheckJNI.)</p> + +<p>For example, if <code>RegisterNatives</code> is called with a method that +does not exist (perhaps because the method was removed by a tool such as +<strong>ProGuard</strong>), ART now properly throws {@link +java.lang.NoSuchMethodError}:</p> + +<pre class="no-pretty-print"> +08-12 17:09:41.082 13823 13823 E AndroidRuntime: FATAL EXCEPTION: main +08-12 17:09:41.082 13823 13823 E AndroidRuntime: java.lang.NoSuchMethodError: + no static or non-static method + "Lcom/foo/Bar;.native_frob(Ljava/lang/String;)I" +08-12 17:09:41.082 13823 13823 E AndroidRuntime: + at java.lang.Runtime.nativeLoad(Native Method) +08-12 17:09:41.082 13823 13823 E AndroidRuntime: + at java.lang.Runtime.doLoad(Runtime.java:421) +08-12 17:09:41.082 13823 13823 E AndroidRuntime: + at java.lang.Runtime.loadLibrary(Runtime.java:362) +08-12 17:09:41.082 13823 13823 E AndroidRuntime: + at java.lang.System.loadLibrary(System.java:526) +</pre> + +<p>ART also logs an error (visible in logcat) if <code>RegisterNatives</code> is +called with no methods:</p> + +<pre class="no-pretty-print"> +W/art ( 1234): JNI RegisterNativeMethods: attempt to register 0 native +methods for <classname> +</pre> + +<p>In addition, the JNI functions <code>GetFieldID()</code> and +<code>GetStaticFieldID()</code> now properly throw {@link java.lang.NoSuchFieldError} +instead of simply returning null. Similarly, <code>GetMethodID()</code> and +<code>GetStaticMethodID()</code> now properly throw {@link java.lang.NoSuchMethodError}. +This can lead to CheckJNI failures because of the unhandled exceptions or the +exceptions being thrown to Java callers of native code. This makes it +particularly important to test ART-compatible apps with CheckJNI mode.</p> + +<p>ART expects users of the JNI <code>CallNonvirtual...Method()</code> methods +(such as <code>CallNonvirtualVoidMethod()</code>) to use the method's declaring +class, not a subclass, as required by the JNI specification.</p> + +<h2 id="Stack_Size">Preventing Stack Size Issues</h2> + +<p>Dalvik had separate stacks for native and Java code, with a default Java +stack size of 32KB and a default native stack size of 1MB. ART has a unified +stack for better locality. Ordinarily, the ART {@link java.lang.Thread} stack +size should be approximately the same as for Dalvik. However, if you explicitly +set stack sizes, you may need to revisit those values for apps running in +ART.</p> + +<ul> + + <li>In Java, review calls to the {@link + java.lang.Thread#Thread(java.lang.ThreadGroup, java.lang.Runnable, + java.lang.String, long) Thread} constructor that specify an explicit stack + size. For example, you will need to increase the size if {@link + java.lang.StackOverflowError} occurs.</li> + + <li>In C/C++, review use of <code>pthread_attr_setstack()</code> and + <code>pthread_attr_setstacksize()</code> for threads that also run Java code via + JNI. Here is an example of the error logged when an app attempts to call JNI + <code>AttachCurrentThread()</code> when the pthread size is too small: + +<pre class="no-pretty-print">F/art: art/runtime/thread.cc:435] + Attempt to attach a thread with a too-small stack (16384 bytes)</pre> + </li> + +</ul> + +<h2 id="Object_Model_Changes">Object model changes</h2> + +<p>Dalvik incorrectly allowed subclasses to override package-private methods. +ART issues a warning in such cases:</p> + +<pre class="no-pretty-print"> +Before Android 4.1, method void com.foo.Bar.quux() +would have incorrectly overridden the package-private method in +com.quux.Quux +</pre> + +<p>If you intend to override a class's method in a different package, declare the +method as <code>public</code> or <code>protected</code>.</p> + +<p>{@link java.lang.Object} now has private fields. Apps that reflect on fields +in their class hierarchies should be careful not to attempt to look at the +fields of {@link java.lang.Object}. For example, if you are iterating up a class +hierarchy as part of a serialization framework, stop when + +<pre>Class.getSuperclass() == java.lang.Object.class</pre> + +instead of continuing until the method returns <code>null</code>.</p> + +<p>Proxy {@link +java.lang.reflect.InvocationHandler#invoke(java.lang.Object,java.lang.reflect.Method,java.lang.Object[]) +InvocationHandler.invoke()} now receives <code>null</code> if there are no +arguments instead of an empty array. This behavior was documented previously but +not correctly handled in Dalvik. Previous versions of <a +href="https://code.google.com/p/mockito/">Mockito</a> have difficulties with +this, so use an updated Mockito version when testing with ART.</p> + +<h2 id="AOT_Fails">Fixing AOT Compilation Issues</h2> + +<p>ART's Ahead-Of-Time (AOT) Java compilation should work for all standard Java +code. Compilation is performed by ART's +<code>dex2oat</code> tool; if you encounter any issues related to +<code>dex2oat</code> at install time, let us know (see <a +href="#Reporting_Problems">Reporting Problems</a>) so we can fix them as quickly +as possible. A couple of issues to note:</p> + +<ul> + + <li>ART does tighter bytecode verification at install time than Dalvik does. + Code produced by the Android build tools should be fine. However, some + post-processing tools (especially tools that perform obfuscation) may produce + invalid files that are tolerated by Dalvik but rejected by ART. We have been + working with tool vendors to find and fix such issues. In many cases, getting + the latest versions of your tools and regenerating the DEX files can fix these + problems.</li> + + <li>Some typical problems that are flagged by the ART verifier include: + <ul> + <li>invalid control flow</li> + <li>unbalanced <code>moniterenter</code>/<code>moniterexit</code></li> + <li>0-length parameter type list size</li> + </ul> + </li> + + <li>Some apps have dependencies on the installed <code>.odex</code> file + format in <code>/system/framework</code>, <code>/data/dalvik-cache</code>, or + in {@link dalvik.system.DexClassLoader}’s optimized output directory. These + files are now ELF files and not an extended form of DEX files. While ART tries + to follow the same naming and locking rules as Dalvik, apps should not depend + on the file format; the format is subject to change without notice.</li> + + + +<h2 id="Reporting_Problems">Reporting Problems</h2> + +<p>If you run into any issues that aren’t due to app JNI issues, report +them via the Android Open Source Project Issue Tracker at <a +href="https://code.google.com/p/android/issues/list">https://code.google.com/p/android/issues/list</a>. +Include an <code>"adb bugreport"</code> and a link to the app in the Google +Play store if available. Otherwise, if possible, attach an APK that reproduces +the issue. Note that issues (including attachments) are publicly +visible.</p> diff --git a/docs/html/images/gp-ads-console.jpg b/docs/html/images/gp-ads-console.jpg Binary files differnew file mode 100644 index 000000000000..158e31da3332 --- /dev/null +++ b/docs/html/images/gp-ads-console.jpg diff --git a/docs/html/images/gp-ads-linking2.jpg b/docs/html/images/gp-ads-linking2.jpg Binary files differnew file mode 100644 index 000000000000..0c2f7319f206 --- /dev/null +++ b/docs/html/images/gp-ads-linking2.jpg diff --git a/docs/html/images/gp-analytics.jpg b/docs/html/images/gp-analytics.jpg Binary files differnew file mode 100644 index 000000000000..e1a92c70adff --- /dev/null +++ b/docs/html/images/gp-analytics.jpg diff --git a/docs/html/jd_collections.js b/docs/html/jd_collections.js index 8a4ac4797e6f..5ee01f363534 100644 --- a/docs/html/jd_collections.js +++ b/docs/html/jd_collections.js @@ -49,7 +49,8 @@ var RESOURCE_COLLECTIONS = { "distribute/users/your-listing.html", "distribute/users/build-buzz.html", "distribute/users/build-community.html", - "distribute/users/expand-to-new-markets.html" + "distribute/users/expand-to-new-markets.html", + "distribute/users/promote-with-ads.html" ] }, "distribute/engagelanding": { @@ -60,6 +61,7 @@ var RESOURCE_COLLECTIONS = { "distribute/engage/easy-signin.html", "distribute/engage/deep-linking.html", "distribute/engage/game-services.html", + "distribute/engage/analytics.html", "distribute/engage/app-updates.html", "distribute/engage/community.html", "distribute/engage/video.html" @@ -214,6 +216,13 @@ var RESOURCE_COLLECTIONS = { "distribute/stories/localization.html" ] }, + "distribute/users/promotewithads": { + "title": "", + "resources": [ + "http://www.google.com/ads/admob/#subid=us-en-et-dac", + "distribute/essentials/optimizing-your-app.html" + ] + }, "distribute/users/buildbuzz": { "title": "", "resources": [ @@ -394,6 +403,14 @@ var RESOURCE_COLLECTIONS = { "http://play.google.com/about/developer-content-policy.html" ] }, + "distribute/engage/analytics": { + "title": "", + "resources": [ + "http://www.google.com/analytics/mobile/", + "http://android-developers.blogspot.com/2013/10/improved-app-insight-by-linking-google.html", + "https://developers.google.com/analytics/devguides/collection/android/" + ] + }, "distribute/engage/widgets": { "title": "", "resources": [ diff --git a/docs/html/jd_extras.js b/docs/html/jd_extras.js index f26b747bdd2c..d8db5bf5de84 100644 --- a/docs/html/jd_extras.js +++ b/docs/html/jd_extras.js @@ -726,6 +726,21 @@ DISTRIBUTE_RESOURCES = DISTRIBUTE_RESOURCES.concat([ "tags": [ "#engagement", ], + "url": "http://www.google.com/analytics/mobile/", + "timestamp": 1383243492000, + "image": "http://www.google.com//analytics/images/heros/mobile-index.jpg", + "title": "Google Mobile App Analytics", + "summary": "Mobile App Analytics measures what matters most at all key stages: from first discovery and download to in-app purchases. ", + "keywords": ["analytics,user behavior"], + "type": "guide", + "titleFriendly": "" + }, + { + "lang": "en", + "group": "", + "tags": [ + "#engagement", + ], "url": "https://developers.google.com/app-indexing/", "timestamp": 1383243492000, "image": "https://developers.google.com/app-indexing/images/allthecooks_srp.png", @@ -1101,4 +1116,17 @@ DISTRIBUTE_RESOURCES = DISTRIBUTE_RESOURCES.concat([ "type": "Google+", "titleFriendly": "" }, + { + "lang": "en", + "group": "", + "tags": ["analytics"], + "url": "https://developers.google.com/analytics/devguides/collection/android/", + "timestamp": null, + "image": "https://developers.google.com/analytics/images/home/gear-logo.png", + "title": "Google Mobile App Analytics SDK", + "summary": "The Google Analytics for Mobile Apps SDKs make it easy for you to implement Google Analytics in your mobile application.", + "keywords": ["analytics, user behavior"], + "type": "sdk", + "titleFriendly": "" + } ]);
\ No newline at end of file |